provider-kilo.test.ts 3.8 KB

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