provider-vercel.test.ts 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import { AISDK } from "@opencode-ai/core/aisdk"
  2. import { describe, expect } from "bun:test"
  3. import { Effect } from "effect"
  4. import { Catalog } from "@opencode-ai/core/catalog"
  5. import { ModelV2 } from "@opencode-ai/core/model"
  6. import { PluginV2 } from "@opencode-ai/core/plugin"
  7. import { PluginHost } from "@opencode-ai/core/plugin/host"
  8. import { VercelPlugin } from "@opencode-ai/core/plugin/provider/vercel"
  9. import { ProviderV2 } from "@opencode-ai/core/provider"
  10. import { testEffect } from "../lib/effect"
  11. import { PluginTestLayer } from "./fixture"
  12. const it = testEffect(PluginTestLayer)
  13. const addPlugin = Effect.fn(function* () {
  14. const plugin = yield* PluginV2.Service
  15. const aisdk = yield* AISDK.Service
  16. const host = yield* PluginHost.make(plugin)
  17. yield* VercelPlugin.effect(host)
  18. })
  19. describe("VercelPlugin", () => {
  20. it.effect("applies legacy lower-case referer headers", () =>
  21. Effect.gen(function* () {
  22. const catalog = yield* Catalog.Service
  23. yield* catalog.transform((catalog) => {
  24. catalog.provider.update(ProviderV2.ID.make("vercel"), (provider) => {
  25. provider.api = { type: "aisdk", package: "@ai-sdk/vercel" }
  26. provider.request.headers.Existing = "1"
  27. })
  28. })
  29. yield* addPlugin()
  30. expect((yield* catalog.provider.get(ProviderV2.ID.make("vercel")))?.request.headers).toEqual({
  31. Existing: "1",
  32. "http-referer": "https://opencode.ai/",
  33. "x-title": "opencode",
  34. })
  35. }),
  36. )
  37. it.effect("does not add legacy upper-case referer headers", () =>
  38. Effect.gen(function* () {
  39. const catalog = yield* Catalog.Service
  40. yield* catalog.transform((catalog) =>
  41. catalog.provider.update(ProviderV2.ID.make("vercel"), (provider) => {
  42. provider.api = { type: "aisdk", package: "@ai-sdk/vercel" }
  43. }),
  44. )
  45. yield* addPlugin()
  46. expect((yield* catalog.provider.get(ProviderV2.ID.make("vercel")))?.request.headers).not.toHaveProperty(
  47. "HTTP-Referer",
  48. )
  49. expect((yield* catalog.provider.get(ProviderV2.ID.make("vercel")))?.request.headers).not.toHaveProperty("X-Title")
  50. }),
  51. )
  52. it.effect("creates @ai-sdk/vercel SDKs for custom provider IDs", () =>
  53. Effect.gen(function* () {
  54. const plugin = yield* PluginV2.Service
  55. const aisdk = yield* AISDK.Service
  56. yield* addPlugin()
  57. const event = yield* aisdk.runSDK({
  58. model: ModelV2.Info.make({
  59. ...ModelV2.Info.empty(ProviderV2.ID.make("custom-vercel"), ModelV2.ID.make("v0-1.0-md")),
  60. api: { id: ModelV2.ID.make("v0-1.0-md"), type: "aisdk", package: "@ai-sdk/vercel" },
  61. }),
  62. package: "@ai-sdk/vercel",
  63. options: { name: "custom-vercel" },
  64. })
  65. expect(event.sdk).toBeDefined()
  66. expect(event.sdk.languageModel("v0-1.0-md").provider).toBe("vercel.chat")
  67. }),
  68. )
  69. it.effect("ignores non-Vercel providers", () =>
  70. Effect.gen(function* () {
  71. const catalog = yield* Catalog.Service
  72. yield* catalog.transform((catalog) => catalog.provider.update(ProviderV2.ID.make("gateway"), () => {}))
  73. yield* addPlugin()
  74. expect((yield* catalog.provider.get(ProviderV2.ID.make("gateway")))?.request.headers).toEqual({})
  75. }),
  76. )
  77. })