provider-kilo.test.ts 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { describe, expect } from "bun:test"
  2. import { Effect } from "effect"
  3. import { Catalog } from "@opencode-ai/core/catalog"
  4. import { Plugin } 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 { Provider } 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* Plugin.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("opencode.provider.kilo")),
  20. )
  21. it.effect("applies legacy referer headers only to Kilo endpoints", () =>
  22. Effect.gen(function* () {
  23. const catalog = yield* Catalog.Service
  24. yield* catalog.transform((catalog) => {
  25. catalog.provider.update(Provider.ID.make("kilo"), (provider) => {
  26. provider.package = Provider.aisdk("@ai-sdk/openai-compatible")
  27. provider.settings = { baseURL: "https://api.kilo.ai/api/gateway" }
  28. provider.headers = { Existing: "value" }
  29. })
  30. catalog.provider.update(Provider.ID.openrouter, () => {})
  31. })
  32. yield* addPlugin()
  33. expect((yield* catalog.provider.get(Provider.ID.make("kilo")))?.headers).toEqual({
  34. Existing: "value",
  35. "HTTP-Referer": "https://opencode.ai/",
  36. "X-Title": "opencode",
  37. })
  38. expect((yield* catalog.provider.get(Provider.ID.openrouter))?.headers).toBeUndefined()
  39. }),
  40. )
  41. it.effect("uses the exact legacy Kilo header casing and set", () =>
  42. Effect.gen(function* () {
  43. const catalog = yield* Catalog.Service
  44. yield* catalog.transform((catalog) => {
  45. catalog.provider.update(Provider.ID.make("kilo"), (provider) => {
  46. provider.package = Provider.aisdk("@ai-sdk/openai-compatible")
  47. provider.settings = { baseURL: "https://api.kilo.ai/api/gateway" }
  48. })
  49. })
  50. yield* addPlugin()
  51. expect((yield* catalog.provider.get(Provider.ID.make("kilo")))?.headers).toEqual({
  52. "HTTP-Referer": "https://opencode.ai/",
  53. "X-Title": "opencode",
  54. })
  55. expect((yield* catalog.provider.get(Provider.ID.make("kilo")))?.headers).not.toHaveProperty("http-referer")
  56. expect((yield* catalog.provider.get(Provider.ID.make("kilo")))?.headers).not.toHaveProperty("x-title")
  57. expect((yield* catalog.provider.get(Provider.ID.make("kilo")))?.headers).not.toHaveProperty("X-Source")
  58. }),
  59. )
  60. it.effect("uses endpoint package matching instead of a provider ID guard", () =>
  61. Effect.gen(function* () {
  62. const catalog = yield* Catalog.Service
  63. yield* catalog.transform((catalog) => {
  64. catalog.provider.update(Provider.ID.make("kilo"), (provider) => {
  65. provider.package = Provider.aisdk("kilo")
  66. })
  67. catalog.provider.update(Provider.ID.make("custom-kilo"), (provider) => {
  68. provider.package = Provider.aisdk("@ai-sdk/openai-compatible")
  69. provider.settings = { baseURL: "https://api.kilo.ai/api/gateway" }
  70. })
  71. })
  72. yield* addPlugin()
  73. expect((yield* catalog.provider.get(Provider.ID.make("kilo")))?.headers).toBeUndefined()
  74. expect((yield* catalog.provider.get(Provider.ID.make("custom-kilo")))?.headers).toEqual({
  75. "HTTP-Referer": "https://opencode.ai/",
  76. "X-Title": "opencode",
  77. })
  78. }),
  79. )
  80. })