provider-vercel.test.ts 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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 { Model } from "@opencode-ai/core/model"
  6. import { Plugin } 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 { Provider } 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* Plugin.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(Provider.ID.make("vercel"), (provider) => {
  25. provider.package = Provider.aisdk("@ai-sdk/vercel")
  26. provider.headers = { ...provider.headers, Existing: "1" }
  27. })
  28. })
  29. yield* addPlugin()
  30. expect((yield* catalog.provider.get(Provider.ID.make("vercel")))?.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(Provider.ID.make("vercel"), (provider) => {
  42. provider.package = Provider.aisdk("@ai-sdk/vercel")
  43. }),
  44. )
  45. yield* addPlugin()
  46. expect((yield* catalog.provider.get(Provider.ID.make("vercel")))?.headers).not.toHaveProperty("HTTP-Referer")
  47. expect((yield* catalog.provider.get(Provider.ID.make("vercel")))?.headers).not.toHaveProperty("X-Title")
  48. }),
  49. )
  50. it.effect("creates @ai-sdk/vercel SDKs for custom provider IDs", () =>
  51. Effect.gen(function* () {
  52. const plugin = yield* Plugin.Service
  53. const aisdk = yield* AISDK.Service
  54. yield* addPlugin()
  55. const event = yield* aisdk.runSDK({
  56. model: Model.Info.make({
  57. ...Model.Info.default(Provider.ID.make("custom-vercel"), Model.ID.make("v0-1.0-md")),
  58. modelID: Model.ID.make("v0-1.0-md"),
  59. package: "aisdk:@ai-sdk/vercel",
  60. }),
  61. package: "@ai-sdk/vercel",
  62. options: { name: "custom-vercel" },
  63. })
  64. expect(event.sdk).toBeDefined()
  65. expect(event.sdk.languageModel("v0-1.0-md").provider).toBe("vercel.chat")
  66. }),
  67. )
  68. it.effect("ignores non-Vercel providers", () =>
  69. Effect.gen(function* () {
  70. const catalog = yield* Catalog.Service
  71. yield* catalog.transform((catalog) => catalog.provider.update(Provider.ID.make("gateway"), () => {}))
  72. yield* addPlugin()
  73. expect((yield* catalog.provider.get(Provider.ID.make("gateway")))?.headers).toBeUndefined()
  74. }),
  75. )
  76. })