1
0

provider-zenmux.test.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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 { PluginHost } from "@opencode-ai/core/plugin/host"
  6. import { ProviderPlugins } from "@opencode-ai/core/plugin/provider"
  7. import { ZenmuxPlugin } from "@opencode-ai/core/plugin/provider/zenmux"
  8. import { ProviderV2 } from "@opencode-ai/core/provider"
  9. import { testEffect } from "../lib/effect"
  10. import { PluginTestLayer } from "./fixture"
  11. const it = testEffect(PluginTestLayer)
  12. const addPlugin = Effect.fn(function* () {
  13. const plugin = yield* PluginV2.Service
  14. const host = yield* PluginHost.make(plugin)
  15. yield* ZenmuxPlugin.effect(host)
  16. })
  17. function required<T>(value: T | undefined): T {
  18. if (value === undefined) throw new Error("Expected value")
  19. return value
  20. }
  21. describe("ZenmuxPlugin", () => {
  22. it.effect("is registered so legacy referer headers can be applied", () =>
  23. Effect.sync(() => expect(ProviderPlugins.map((item) => item.id)).toContain(PluginV2.ID.make("zenmux"))),
  24. )
  25. it.effect("applies the exact legacy Zenmux headers", () =>
  26. Effect.gen(function* () {
  27. const catalog = yield* Catalog.Service
  28. yield* catalog.transform((catalog) => {
  29. catalog.provider.update(ProviderV2.ID.make("zenmux"), (provider) => {
  30. provider.api = {
  31. type: "aisdk",
  32. package: "@ai-sdk/openai-compatible",
  33. url: "https://zenmux.ai/api/v1",
  34. }
  35. })
  36. })
  37. yield* addPlugin()
  38. const result = required(yield* catalog.provider.get(ProviderV2.ID.make("zenmux")))
  39. expect(result.request.headers).toEqual({ "HTTP-Referer": "https://opencode.ai/", "X-Title": "opencode" })
  40. expect(Object.keys(result.request.headers).sort()).toEqual(["HTTP-Referer", "X-Title"])
  41. }),
  42. )
  43. it.effect("merges legacy Zenmux headers with existing headers", () =>
  44. Effect.gen(function* () {
  45. const catalog = yield* Catalog.Service
  46. yield* catalog.transform((catalog) => {
  47. catalog.provider.update(ProviderV2.ID.make("zenmux"), (provider) => {
  48. provider.api = {
  49. type: "aisdk",
  50. package: "@ai-sdk/openai-compatible",
  51. url: "https://zenmux.ai/api/v1",
  52. }
  53. provider.request.headers.Existing = "value"
  54. })
  55. })
  56. yield* addPlugin()
  57. expect(required(yield* catalog.provider.get(ProviderV2.ID.make("zenmux"))).request.headers).toEqual({
  58. Existing: "value",
  59. "HTTP-Referer": "https://opencode.ai/",
  60. "X-Title": "opencode",
  61. })
  62. }),
  63. )
  64. it.effect("lets configured Zenmux legacy headers override defaults", () =>
  65. Effect.gen(function* () {
  66. const catalog = yield* Catalog.Service
  67. yield* catalog.transform((catalog) => {
  68. catalog.provider.update(ProviderV2.ID.make("zenmux"), (provider) => {
  69. provider.api = {
  70. type: "aisdk",
  71. package: "@ai-sdk/openai-compatible",
  72. url: "https://zenmux.ai/api/v1",
  73. }
  74. provider.request.headers = { "HTTP-Referer": "https://example.com/", "X-Title": "custom-title" }
  75. })
  76. })
  77. yield* addPlugin()
  78. expect(required(yield* catalog.provider.get(ProviderV2.ID.make("zenmux"))).request.headers).toEqual({
  79. "HTTP-Referer": "https://example.com/",
  80. "X-Title": "custom-title",
  81. })
  82. }),
  83. )
  84. it.effect("guards legacy Zenmux headers to the exact zenmux provider id", () =>
  85. Effect.gen(function* () {
  86. const catalog = yield* Catalog.Service
  87. yield* catalog.transform((catalog) => {
  88. catalog.provider.update(ProviderV2.ID.openrouter, (provider) => {
  89. provider.request.headers = { "HTTP-Referer": "https://example.com/", "X-Title": "custom-title" }
  90. })
  91. })
  92. yield* addPlugin()
  93. expect(required(yield* catalog.provider.get(ProviderV2.ID.openrouter)).request.headers).toEqual({
  94. "HTTP-Referer": "https://example.com/",
  95. "X-Title": "custom-title",
  96. })
  97. }),
  98. )
  99. })