provider-zenmux.test.ts 4.2 KB

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