provider-kilo.test.ts 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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 { KiloPlugin } from "@opencode-ai/core/plugin/provider/kilo"
  7. import { ProviderV2 } from "@opencode-ai/core/provider"
  8. import { addPlugin, expectPluginRegistered, it, provider, required } from "./provider-helper"
  9. describe("KiloPlugin", () => {
  10. it.effect("is registered so legacy referer headers can be applied", () =>
  11. Effect.sync(() =>
  12. expectPluginRegistered(
  13. ProviderPlugins.map((item) => item.id),
  14. "kilo",
  15. ),
  16. ),
  17. )
  18. it.effect("applies legacy referer headers only to kilo", () =>
  19. Effect.gen(function* () {
  20. const plugin = yield* PluginV2.Service
  21. const catalog = yield* Catalog.Service
  22. yield* addPlugin(plugin, KiloPlugin)
  23. yield* catalog.transform((catalog) => {
  24. const kilo = provider("kilo", {
  25. api: { type: "aisdk", package: "@ai-sdk/openai-compatible", url: "https://api.kilo.ai/api/gateway" },
  26. request: { headers: { Existing: "value" }, body: {} },
  27. })
  28. catalog.provider.update(kilo.id, (draft) => {
  29. draft.api = kilo.api
  30. draft.request = kilo.request
  31. })
  32. catalog.provider.update(provider("openrouter").id, () => {})
  33. })
  34. expect(required(yield* catalog.provider.get(ProviderV2.ID.make("kilo"))).request.headers).toEqual({
  35. Existing: "value",
  36. "HTTP-Referer": "https://opencode.ai/",
  37. "X-Title": "opencode",
  38. })
  39. expect(required(yield* catalog.provider.get(ProviderV2.ID.openrouter)).request.headers).toEqual({})
  40. }),
  41. )
  42. it.effect("uses the exact legacy Kilo header casing and set", () =>
  43. Effect.gen(function* () {
  44. const plugin = yield* PluginV2.Service
  45. const catalog = yield* Catalog.Service
  46. yield* addPlugin(plugin, KiloPlugin)
  47. yield* catalog.transform((catalog) => {
  48. const item = provider("kilo", {
  49. api: { type: "aisdk", package: "@ai-sdk/openai-compatible", url: "https://api.kilo.ai/api/gateway" },
  50. })
  51. catalog.provider.update(item.id, (draft) => {
  52. draft.api = item.api
  53. })
  54. })
  55. const result = required(yield* catalog.provider.get(ProviderV2.ID.make("kilo")))
  56. expect(result.request.headers).toEqual({
  57. "HTTP-Referer": "https://opencode.ai/",
  58. "X-Title": "opencode",
  59. })
  60. expect(result.request.headers).not.toHaveProperty("http-referer")
  61. expect(result.request.headers).not.toHaveProperty("x-title")
  62. expect(result.request.headers).not.toHaveProperty("X-Source")
  63. }),
  64. )
  65. it.effect("uses the legacy provider-id guard instead of endpoint package matching", () =>
  66. Effect.gen(function* () {
  67. const plugin = yield* PluginV2.Service
  68. const catalog = yield* Catalog.Service
  69. yield* addPlugin(plugin, KiloPlugin)
  70. yield* catalog.transform((catalog) => {
  71. const kilo = provider("kilo", {
  72. api: { type: "aisdk", package: "@ai-sdk/openai-compatible", url: "https://api.kilo.ai/api/gateway" },
  73. })
  74. catalog.provider.update(kilo.id, (draft) => {
  75. draft.api = kilo.api
  76. })
  77. const custom = provider("custom-kilo", {
  78. api: { type: "aisdk", package: "kilo" },
  79. })
  80. catalog.provider.update(custom.id, (draft) => {
  81. draft.api = custom.api
  82. })
  83. })
  84. expect(required(yield* catalog.provider.get(ProviderV2.ID.make("kilo"))).request.headers).toEqual({
  85. "HTTP-Referer": "https://opencode.ai/",
  86. "X-Title": "opencode",
  87. })
  88. expect(required(yield* catalog.provider.get(ProviderV2.ID.make("custom-kilo"))).request.headers).toEqual({})
  89. }),
  90. )
  91. })