provider-azure-cognitive-services.test.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import { describe, expect } from "bun:test"
  2. import { Effect } from "effect"
  3. import { PluginV2 } from "@opencode-ai/core/plugin"
  4. import { AzureCognitiveServicesPlugin } from "@opencode-ai/core/plugin/provider/azure"
  5. import { fakeSelectorSdk, it, model, provider, withEnv } from "./provider-helper"
  6. describe("AzureCognitiveServicesPlugin", () => {
  7. it.effect("maps the resource env var to the Azure SDK baseURL", () =>
  8. withEnv({ AZURE_COGNITIVE_SERVICES_RESOURCE_NAME: "cognitive" }, () =>
  9. Effect.gen(function* () {
  10. const plugin = yield* PluginV2.Service
  11. yield* plugin.add(AzureCognitiveServicesPlugin)
  12. const result = yield* plugin.trigger(
  13. "provider.update",
  14. {},
  15. { provider: provider("azure-cognitive-services"), cancel: false },
  16. )
  17. expect(result.provider.endpoint).toEqual({
  18. type: "aisdk",
  19. package: "test-provider",
  20. })
  21. expect(result.provider.options.aisdk.provider.baseURL).toBe(
  22. "https://cognitive.cognitiveservices.azure.com/openai",
  23. )
  24. expect(result.provider.options.aisdk.provider.resourceName).toBeUndefined()
  25. }),
  26. ),
  27. )
  28. it.effect("leaves baseURL unset without resource env and ignores other providers", () =>
  29. withEnv({ AZURE_COGNITIVE_SERVICES_RESOURCE_NAME: undefined }, () =>
  30. Effect.gen(function* () {
  31. const plugin = yield* PluginV2.Service
  32. yield* plugin.add(AzureCognitiveServicesPlugin)
  33. const azure = yield* plugin.trigger(
  34. "provider.update",
  35. {},
  36. { provider: provider("azure-cognitive-services"), cancel: false },
  37. )
  38. const other = yield* plugin.trigger("provider.update", {}, { provider: provider("openai"), cancel: false })
  39. expect(azure.provider.options.aisdk.provider.baseURL).toBeUndefined()
  40. expect(azure.provider.endpoint).toEqual({ type: "aisdk", package: "test-provider" })
  41. expect(other.provider.options.aisdk.provider.baseURL).toBeUndefined()
  42. expect(other.provider.endpoint).toEqual({ type: "aisdk", package: "test-provider" })
  43. }),
  44. ),
  45. )
  46. it.effect("selects chat only for completion URLs", () =>
  47. Effect.gen(function* () {
  48. const plugin = yield* PluginV2.Service
  49. const calls: string[] = []
  50. yield* plugin.add(AzureCognitiveServicesPlugin)
  51. yield* plugin.trigger(
  52. "aisdk.language",
  53. {
  54. model: model("azure-cognitive-services", "deployment"),
  55. sdk: fakeSelectorSdk(calls),
  56. options: { useCompletionUrls: true },
  57. },
  58. {},
  59. )
  60. expect(calls).toEqual(["chat:deployment"])
  61. }),
  62. )
  63. it.effect("uses the legacy Azure selector order and provider guard", () =>
  64. Effect.gen(function* () {
  65. const plugin = yield* PluginV2.Service
  66. const calls: string[] = []
  67. yield* plugin.add(AzureCognitiveServicesPlugin)
  68. yield* plugin.trigger(
  69. "aisdk.language",
  70. { model: model("azure-cognitive-services", "deployment"), sdk: fakeSelectorSdk(calls), options: {} },
  71. {},
  72. )
  73. const ignored = yield* plugin.trigger(
  74. "aisdk.language",
  75. { model: model("openai", "deployment"), sdk: fakeSelectorSdk(calls), options: {} },
  76. {},
  77. )
  78. expect(calls).toEqual(["responses:deployment"])
  79. expect(ignored.language).toBeUndefined()
  80. }),
  81. )
  82. it.effect("falls back from responses to messages, chat, then languageModel", () =>
  83. Effect.gen(function* () {
  84. const plugin = yield* PluginV2.Service
  85. const calls: string[] = []
  86. const sdk = fakeSelectorSdk(calls)
  87. yield* plugin.add(AzureCognitiveServicesPlugin)
  88. yield* plugin.trigger(
  89. "aisdk.language",
  90. {
  91. model: model("azure-cognitive-services", "messages-deployment"),
  92. sdk: { messages: sdk.messages, chat: sdk.chat, languageModel: sdk.languageModel },
  93. options: {},
  94. },
  95. {},
  96. )
  97. yield* plugin.trigger(
  98. "aisdk.language",
  99. {
  100. model: model("azure-cognitive-services", "chat-deployment"),
  101. sdk: { chat: sdk.chat, languageModel: sdk.languageModel },
  102. options: {},
  103. },
  104. {},
  105. )
  106. yield* plugin.trigger(
  107. "aisdk.language",
  108. {
  109. model: model("azure-cognitive-services", "language-deployment"),
  110. sdk: { languageModel: sdk.languageModel },
  111. options: {},
  112. },
  113. {},
  114. )
  115. expect(calls).toEqual([
  116. "messages:messages-deployment",
  117. "chat:chat-deployment",
  118. "languageModel:language-deployment",
  119. ])
  120. }),
  121. )
  122. })