provider-llmgateway.test.ts 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { describe, expect } from "bun:test"
  2. import { Effect } from "effect"
  3. import { Catalog } from "@opencode-ai/core/catalog"
  4. import { PluginV2 } from "@opencode-ai/core/plugin"
  5. import { ProviderPlugins } from "@opencode-ai/core/plugin/provider"
  6. import { LLMGatewayPlugin } from "@opencode-ai/core/plugin/provider/llmgateway"
  7. import { ProviderV2 } from "@opencode-ai/core/provider"
  8. import { expectPluginRegistered, it, provider } from "./provider-helper"
  9. describe("LLMGatewayPlugin", () => {
  10. it.effect("is registered so legacy referer headers can be applied", () =>
  11. Effect.sync(() =>
  12. expectPluginRegistered(
  13. ProviderPlugins.map((item) => item.id),
  14. "llmgateway",
  15. ),
  16. ),
  17. )
  18. it.effect("applies legacy referer headers only to enabled llmgateway", () =>
  19. Effect.gen(function* () {
  20. const plugin = yield* PluginV2.Service
  21. const catalog = yield* Catalog.Service
  22. yield* plugin.add(LLMGatewayPlugin)
  23. const transform = yield* catalog.transform()
  24. yield* transform((catalog) => {
  25. const llmgateway = provider("llmgateway", {
  26. enabled: { via: "env", name: "LLMGATEWAY_API_KEY" },
  27. api: { type: "aisdk", package: "@ai-sdk/openai-compatible", url: "https://api.llmgateway.io/v1" },
  28. request: { headers: { Existing: "value" }, body: {} },
  29. })
  30. catalog.provider.update(llmgateway.id, (draft) => {
  31. draft.enabled = llmgateway.enabled
  32. draft.api = llmgateway.api
  33. draft.request = llmgateway.request
  34. })
  35. const openrouter = provider("openrouter", {
  36. enabled: { via: "env", name: "OPENROUTER_API_KEY" },
  37. })
  38. catalog.provider.update(openrouter.id, (draft) => {
  39. draft.enabled = openrouter.enabled
  40. })
  41. })
  42. expect((yield* catalog.provider.get(ProviderV2.ID.make("llmgateway"))).request.headers).toEqual({
  43. Existing: "value",
  44. "HTTP-Referer": "https://opencode.ai/",
  45. "X-Title": "opencode",
  46. "X-Source": "opencode",
  47. })
  48. expect((yield* catalog.provider.get(ProviderV2.ID.openrouter)).request.headers).toEqual({})
  49. }),
  50. )
  51. it.effect("does not apply legacy headers to a disabled llmgateway provider", () =>
  52. Effect.gen(function* () {
  53. const plugin = yield* PluginV2.Service
  54. const catalog = yield* Catalog.Service
  55. yield* plugin.add(LLMGatewayPlugin)
  56. const transform = yield* catalog.transform()
  57. yield* transform((catalog) => {
  58. const item = provider("llmgateway", {
  59. api: { type: "aisdk", package: "@ai-sdk/openai-compatible", url: "https://api.llmgateway.io/v1" },
  60. })
  61. catalog.provider.update(item.id, (draft) => {
  62. draft.api = item.api
  63. })
  64. })
  65. expect((yield* catalog.provider.get(ProviderV2.ID.make("llmgateway"))).enabled).toBe(false)
  66. expect((yield* catalog.provider.get(ProviderV2.ID.make("llmgateway"))).request.headers).toEqual({})
  67. }),
  68. )
  69. })