import type { ProviderRuntimeModel } from "openclaw/plugin-sdk/plugin-entry"; import { registerSingleProviderPlugin, resolveProviderPluginChoice, } from "openclaw/plugin-sdk/plugin-test-runtime"; import { describe, expect, it } from "vitest"; import { createProviderDynamicModelContext, runSingleProviderCatalog, } from "../test-support/provider-model-test-helpers.js"; import fireworksPlugin from "./index.js"; import { FIREWORKS_BASE_URL, FIREWORKS_DEFAULT_CONTEXT_WINDOW, FIREWORKS_DEFAULT_MAX_TOKENS, FIREWORKS_DEFAULT_MODEL_ID, FIREWORKS_K2_6_CONTEXT_WINDOW, FIREWORKS_K2_6_MAX_TOKENS, FIREWORKS_K2_6_MODEL_ID, } from "./provider-catalog.js"; function createFireworksDefaultRuntimeModel(params: { reasoning: boolean }): ProviderRuntimeModel { return { id: FIREWORKS_DEFAULT_MODEL_ID, name: FIREWORKS_DEFAULT_MODEL_ID, provider: "fireworks", api: "openai-completions", baseUrl: FIREWORKS_BASE_URL, reasoning: params.reasoning, input: ["text", "image"], cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, contextWindow: FIREWORKS_DEFAULT_CONTEXT_WINDOW, maxTokens: FIREWORKS_DEFAULT_MAX_TOKENS, }; } describe("fireworks provider plugin", () => { it("registers Fireworks with api-key auth wizard metadata", async () => { const provider = await registerSingleProviderPlugin(fireworksPlugin); const resolved = resolveProviderPluginChoice({ providers: [provider], choice: "fireworks-api-key", }); expect(provider.id).toBe("fireworks"); expect(provider.label).toBe("Fireworks"); expect(provider.aliases).toEqual(["fireworks-ai"]); expect(provider.envVars).toEqual(["FIREWORKS_API_KEY"]); expect(provider.auth).toHaveLength(1); expect(resolved?.provider.id).toBe("fireworks"); expect(resolved?.method.id).toBe("api-key"); }); it("builds the Fireworks catalog", async () => { const provider = await registerSingleProviderPlugin(fireworksPlugin); const catalogProvider = await runSingleProviderCatalog(provider); expect(catalogProvider.api).toBe("openai-completions"); expect(catalogProvider.baseUrl).toBe(FIREWORKS_BASE_URL); expect(catalogProvider.models?.map((model) => model.id)).toEqual([ FIREWORKS_K2_6_MODEL_ID, FIREWORKS_DEFAULT_MODEL_ID, ]); expect(catalogProvider.models?.[0]).toMatchObject({ reasoning: false, input: ["text", "image"], contextWindow: FIREWORKS_K2_6_CONTEXT_WINDOW, maxTokens: FIREWORKS_K2_6_MAX_TOKENS, }); expect(catalogProvider.models?.[1]).toMatchObject({ reasoning: false, input: ["text", "image"], contextWindow: FIREWORKS_DEFAULT_CONTEXT_WINDOW, maxTokens: FIREWORKS_DEFAULT_MAX_TOKENS, }); }); it("resolves forward-compat Fireworks model ids from the default template", async () => { const provider = await registerSingleProviderPlugin(fireworksPlugin); const resolved = provider.resolveDynamicModel?.( createProviderDynamicModelContext({ provider: "fireworks", modelId: "accounts/fireworks/models/qwen3.6-plus", models: [createFireworksDefaultRuntimeModel({ reasoning: true })], }), ); expect(resolved).toMatchObject({ provider: "fireworks", id: "accounts/fireworks/models/qwen3.6-plus", api: "openai-completions", baseUrl: FIREWORKS_BASE_URL, reasoning: true, }); }); it("disables reasoning metadata for Fireworks Kimi dynamic models", async () => { const provider = await registerSingleProviderPlugin(fireworksPlugin); const resolved = provider.resolveDynamicModel?.( createProviderDynamicModelContext({ provider: "fireworks", modelId: "accounts/fireworks/models/kimi-k2p5", models: [createFireworksDefaultRuntimeModel({ reasoning: false })], }), ); expect(resolved).toMatchObject({ provider: "fireworks", id: "accounts/fireworks/models/kimi-k2p5", reasoning: false, }); }); it("disables reasoning metadata for Fireworks Kimi k2.5 aliases", async () => { const provider = await registerSingleProviderPlugin(fireworksPlugin); const resolved = provider.resolveDynamicModel?.( createProviderDynamicModelContext({ provider: "fireworks", modelId: "accounts/fireworks/routers/kimi-k2.5-turbo", models: [createFireworksDefaultRuntimeModel({ reasoning: false })], }), ); expect(resolved).toMatchObject({ provider: "fireworks", id: "accounts/fireworks/routers/kimi-k2.5-turbo", reasoning: false, }); }); it("disables reasoning metadata for Fireworks Kimi k2.6 dynamic models", async () => { const provider = await registerSingleProviderPlugin(fireworksPlugin); const resolved = provider.resolveDynamicModel?.( createProviderDynamicModelContext({ provider: "fireworks", modelId: "accounts/fireworks/models/kimi-k2p6", models: [createFireworksDefaultRuntimeModel({ reasoning: false })], }), ); expect(resolved).toMatchObject({ provider: "fireworks", id: "accounts/fireworks/models/kimi-k2p6", reasoning: false, }); }); });