provider-cerebras.test.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import { describe, expect, mock } 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 { CerebrasPlugin } from "@opencode-ai/core/plugin/provider/cerebras"
  6. import { ProviderV2 } from "@opencode-ai/core/provider"
  7. import { it, model } from "./provider-helper"
  8. const cerebrasOptions: Record<string, unknown>[] = []
  9. void mock.module("@ai-sdk/cerebras", () => ({
  10. createCerebras: (options: Record<string, unknown>) => {
  11. const snapshot = { ...options }
  12. cerebrasOptions.push(snapshot)
  13. return {
  14. languageModel: (modelID: string) => ({ modelID, provider: snapshot.name, specificationVersion: "v3" }),
  15. }
  16. },
  17. }))
  18. describe("CerebrasPlugin", () => {
  19. it.effect("applies the legacy integration header", () =>
  20. Effect.gen(function* () {
  21. const plugin = yield* PluginV2.Service
  22. const catalog = yield* Catalog.Service
  23. yield* plugin.add(CerebrasPlugin)
  24. const transform = yield* catalog.transform()
  25. yield* transform((catalog) => {
  26. catalog.provider.update(ProviderV2.ID.make("cerebras"), (item) => {
  27. item.api = { type: "aisdk", package: "@ai-sdk/cerebras" }
  28. item.request.headers.Existing = "1"
  29. })
  30. })
  31. expect((yield* catalog.provider.get(ProviderV2.ID.make("cerebras"))).request.headers).toEqual({
  32. Existing: "1",
  33. "X-Cerebras-3rd-Party-Integration": "opencode",
  34. })
  35. }),
  36. )
  37. it.effect("ignores non-Cerebras providers", () =>
  38. Effect.gen(function* () {
  39. const plugin = yield* PluginV2.Service
  40. const catalog = yield* Catalog.Service
  41. yield* plugin.add(CerebrasPlugin)
  42. const transform = yield* catalog.transform()
  43. yield* transform((catalog) => catalog.provider.update(ProviderV2.ID.make("groq"), () => {}))
  44. expect((yield* catalog.provider.get(ProviderV2.ID.make("groq"))).request.headers).toEqual({})
  45. }),
  46. )
  47. it.effect("creates a bundled Cerebras SDK with the model provider ID as the SDK name", () =>
  48. Effect.gen(function* () {
  49. cerebrasOptions.length = 0
  50. const plugin = yield* PluginV2.Service
  51. yield* plugin.add(CerebrasPlugin)
  52. const result = yield* plugin.trigger(
  53. "aisdk.sdk",
  54. {
  55. model: model("custom-cerebras", "llama-4-scout-17b-16e-instruct"),
  56. package: "@ai-sdk/cerebras",
  57. options: { name: "custom-cerebras", apiKey: "test" },
  58. },
  59. {},
  60. )
  61. expect(cerebrasOptions).toEqual([{ name: "custom-cerebras", apiKey: "test" }])
  62. expect(result.sdk.languageModel("llama-4-scout-17b-16e-instruct").provider).toBe("custom-cerebras")
  63. }),
  64. )
  65. it.effect("preserves an explicit bundled Cerebras SDK name option", () =>
  66. Effect.gen(function* () {
  67. cerebrasOptions.length = 0
  68. const plugin = yield* PluginV2.Service
  69. yield* plugin.add(CerebrasPlugin)
  70. yield* plugin.trigger(
  71. "aisdk.sdk",
  72. {
  73. model: model("custom-cerebras", "llama-4-scout-17b-16e-instruct"),
  74. package: "@ai-sdk/cerebras",
  75. options: { name: "configured-cerebras", apiKey: "test" },
  76. },
  77. {},
  78. )
  79. expect(cerebrasOptions).toEqual([{ name: "configured-cerebras", apiKey: "test" }])
  80. }),
  81. )
  82. it.effect("ignores non-Cerebras SDK packages", () =>
  83. Effect.gen(function* () {
  84. cerebrasOptions.length = 0
  85. const plugin = yield* PluginV2.Service
  86. yield* plugin.add(CerebrasPlugin)
  87. const result = yield* plugin.trigger(
  88. "aisdk.sdk",
  89. {
  90. model: model("custom-cerebras", "llama-4-scout-17b-16e-instruct"),
  91. package: "@ai-sdk/groq",
  92. options: { name: "custom-cerebras", apiKey: "test" },
  93. },
  94. {},
  95. )
  96. expect(cerebrasOptions).toEqual([])
  97. expect(result.sdk).toBeUndefined()
  98. }),
  99. )
  100. })