mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-06 21:00:44 +00:00
Add a Fireworks-owned thinking policy for Kimi models so K2.5/K2.6 only expose `off`, keep the bundled provider-policy artifact aligned, and keep request payloads on Fireworks-accepted `thinking: disabled` while stripping rejected `reasoning*` fields. Refs #74289.
187 lines
6.2 KiB
TypeScript
187 lines
6.2 KiB
TypeScript
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";
|
|
import { resolveThinkingProfile } from "./provider-policy-api.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,
|
|
});
|
|
});
|
|
|
|
it("exposes off-only thinking policy for Fireworks Kimi models", async () => {
|
|
const provider = await registerSingleProviderPlugin(fireworksPlugin);
|
|
|
|
expect(
|
|
provider.resolveThinkingProfile?.({
|
|
provider: "fireworks",
|
|
modelId: "accounts/fireworks/routers/kimi-k2p5-turbo",
|
|
}),
|
|
).toEqual({
|
|
levels: [{ id: "off" }],
|
|
defaultLevel: "off",
|
|
});
|
|
expect(
|
|
provider.resolveThinkingProfile?.({
|
|
provider: "fireworks",
|
|
modelId: FIREWORKS_K2_6_MODEL_ID,
|
|
}),
|
|
).toEqual({
|
|
levels: [{ id: "off" }],
|
|
defaultLevel: "off",
|
|
});
|
|
expect(
|
|
provider.resolveThinkingProfile?.({
|
|
provider: "fireworks",
|
|
modelId: "accounts/fireworks/models/qwen3.6-plus",
|
|
}),
|
|
).toBeUndefined();
|
|
expect(resolveThinkingProfile({ modelId: FIREWORKS_K2_6_MODEL_ID })).toEqual({
|
|
levels: [{ id: "off" }],
|
|
defaultLevel: "off",
|
|
});
|
|
expect(
|
|
resolveThinkingProfile({
|
|
modelId: "accounts/fireworks/models/qwen3.6-plus",
|
|
}),
|
|
).toBeUndefined();
|
|
});
|
|
});
|