provider-openrouter.test.ts 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import { describe, expect } from "bun:test"
  2. import { Effect } from "effect"
  3. import { Catalog } from "@opencode-ai/core/catalog"
  4. import { Model } from "@opencode-ai/core/model"
  5. import { Plugin } from "@opencode-ai/core/plugin"
  6. import { PluginHost } from "@opencode-ai/core/plugin/host"
  7. import { ProviderPlugins } from "@opencode-ai/core/plugin/provider"
  8. import { OpenRouterPlugin } from "@opencode-ai/core/plugin/provider/openrouter"
  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 host = yield* PluginHost.make(plugin)
  16. yield* OpenRouterPlugin.effect(host)
  17. })
  18. describe("OpenRouterPlugin", () => {
  19. it.effect("is registered so legacy OpenRouter behavior can be applied", () =>
  20. Effect.sync(() => expect(ProviderPlugins.map((item) => item.id)).toContain("opencode.provider.openrouter")),
  21. )
  22. it.effect("applies legacy referer headers only to openrouter", () =>
  23. Effect.gen(function* () {
  24. const catalog = yield* Catalog.Service
  25. yield* catalog.transform((catalog) => {
  26. catalog.provider.update(Provider.ID.openrouter, (provider) => {
  27. provider.package = Provider.aisdk("@openrouter/ai-sdk-provider")
  28. provider.headers = { Existing: "value" }
  29. })
  30. catalog.provider.update(Provider.ID.make("nvidia"), () => {})
  31. })
  32. yield* addPlugin()
  33. expect((yield* catalog.provider.get(Provider.ID.openrouter))?.headers).toEqual({
  34. Existing: "value",
  35. "HTTP-Referer": "https://opencode.ai/",
  36. "X-Title": "opencode",
  37. })
  38. expect((yield* catalog.provider.get(Provider.ID.make("nvidia")))?.headers).toBeUndefined()
  39. }),
  40. )
  41. it.effect("filters OpenRouter's gpt-5 chat alias", () =>
  42. Effect.gen(function* () {
  43. const catalog = yield* Catalog.Service
  44. yield* catalog.transform((catalog) => {
  45. catalog.provider.update(Provider.ID.openrouter, (provider) => {
  46. provider.package = Provider.aisdk("@openrouter/ai-sdk-provider")
  47. })
  48. catalog.provider.update(Provider.ID.openai, () => {})
  49. catalog.model.update(Provider.ID.openrouter, Model.ID.make("openai/gpt-5-chat"), () => {})
  50. catalog.model.update(Provider.ID.openrouter, Model.ID.make("openai/gpt-5"), () => {})
  51. catalog.model.update(Provider.ID.openai, Model.ID.make("openai/gpt-5-chat"), () => {})
  52. })
  53. yield* addPlugin()
  54. expect((yield* catalog.model.get(Provider.ID.openrouter, Model.ID.make("openai/gpt-5-chat")))?.enabled).toBe(
  55. false,
  56. )
  57. expect((yield* catalog.model.get(Provider.ID.openrouter, Model.ID.make("openai/gpt-5")))?.enabled).toBe(true)
  58. expect((yield* catalog.model.get(Provider.ID.openai, Model.ID.make("openai/gpt-5-chat")))?.enabled).toBe(true)
  59. }),
  60. )
  61. it.effect("does not disable gpt-5-chat-latest for non-OpenRouter providers", () =>
  62. Effect.gen(function* () {
  63. const catalog = yield* Catalog.Service
  64. yield* catalog.transform((catalog) => {
  65. catalog.provider.update(Provider.ID.make("custom-openrouter"), () => {})
  66. catalog.model.update(Provider.ID.make("custom-openrouter"), Model.ID.make("gpt-5-chat-latest"), () => {})
  67. })
  68. yield* addPlugin()
  69. expect(
  70. (yield* catalog.model.get(Provider.ID.make("custom-openrouter"), Model.ID.make("gpt-5-chat-latest")))?.enabled,
  71. ).toBe(true)
  72. }),
  73. )
  74. })