Files
openclaw/extensions/fireworks/index.test.ts
2026-04-21 20:31:33 +01:00

146 lines
5.2 KiB
TypeScript

import type { ProviderRuntimeModel } from "openclaw/plugin-sdk/plugin-entry";
import { describe, expect, it } from "vitest";
import { resolveProviderPluginChoice } from "../../src/plugins/provider-auth-choice.runtime.js";
import { registerSingleProviderPlugin } from "../../test/helpers/plugins/plugin-registration.js";
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,
});
});
});