diff --git a/CHANGELOG.md b/CHANGELOG.md index c01054abcc1..090bcce8640 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ Docs: https://docs.openclaw.ai ### Changes +- Fireworks/models: add Kimi K2.6 (`fireworks/accounts/fireworks/models/kimi-k2p6`) to the bundled catalog and live-model priority list, while keeping Kimi thinking disabled for Fireworks K2.6 requests. - Onboard/wizard: simplify the security disclaimer copy (drop the yellow banner and warning icon in favor of plain-prose paragraphs), and flip remaining onboarding pickers with long dynamic option lists to searchable autocompletes (search provider, plugin configure, model provider filter). - Channels/preview streaming: stream tool-progress updates into live preview edits for Discord, Slack, and Telegram so in-flight replies show incremental tool state in the same preview message before finalization. (#69611) Thanks @thewilloftheshadow. - Ollama/onboard: populate the cloud-only model list from `ollama.com/api/tags` so `openclaw onboard` reflects the live cloud catalog instead of a static three-model seed; cap the discovered list at 500 and fall back to the previous hardcoded suggestions when ollama.com is unreachable or returns no models. (#68463) Thanks @BruceMacD. diff --git a/docs/providers/fireworks.md b/docs/providers/fireworks.md index 867e37b6f52..f5eb461c2b3 100644 --- a/docs/providers/fireworks.md +++ b/docs/providers/fireworks.md @@ -53,6 +53,7 @@ openclaw onboard --non-interactive \ | Model ref | Name | Input | Context | Max output | Notes | | ------------------------------------------------------ | --------------------------- | ---------- | ------- | ---------- | ------------------------------------------ | +| `fireworks/accounts/fireworks/models/kimi-k2p6` | Kimi K2.6 | text,image | 262,144 | 262,144 | Latest Kimi model on Fireworks | | `fireworks/accounts/fireworks/routers/kimi-k2p5-turbo` | Kimi K2.5 Turbo (Fire Pass) | text,image | 256,000 | 256,000 | Default bundled starter model on Fireworks | diff --git a/extensions/fireworks/index.test.ts b/extensions/fireworks/index.test.ts index 5de7bbd801a..3907d6a0186 100644 --- a/extensions/fireworks/index.test.ts +++ b/extensions/fireworks/index.test.ts @@ -12,6 +12,9 @@ import { 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 { @@ -46,14 +49,23 @@ describe("fireworks provider plugin", () => { expect(resolved?.method.id).toBe("api-key"); }); - it("builds the Fireworks Fire Pass starter catalog", async () => { + 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_DEFAULT_MODEL_ID]); + 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, @@ -113,4 +125,21 @@ describe("fireworks provider plugin", () => { 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, + }); + }); }); diff --git a/extensions/fireworks/model-id.ts b/extensions/fireworks/model-id.ts index 7447cc730c8..9e9a20fcc6f 100644 --- a/extensions/fireworks/model-id.ts +++ b/extensions/fireworks/model-id.ts @@ -1,5 +1,5 @@ export function isFireworksKimiModelId(modelId: string): boolean { const normalized = modelId.trim().toLowerCase(); const lastSegment = normalized.split("/").pop() ?? normalized; - return /^kimi-k2(?:p5|\.5)(?:[-_].+)?$/.test(lastSegment); + return /^kimi-k2(?:p[56]|[.-][56])(?:[-_].+)?$/.test(lastSegment); } diff --git a/extensions/fireworks/provider-catalog.ts b/extensions/fireworks/provider-catalog.ts index 103cd98253f..e85a3da9860 100644 --- a/extensions/fireworks/provider-catalog.ts +++ b/extensions/fireworks/provider-catalog.ts @@ -5,8 +5,11 @@ import type { export const FIREWORKS_BASE_URL = "https://api.fireworks.ai/inference/v1"; export const FIREWORKS_DEFAULT_MODEL_ID = "accounts/fireworks/routers/kimi-k2p5-turbo"; +export const FIREWORKS_K2_6_MODEL_ID = "accounts/fireworks/models/kimi-k2p6"; export const FIREWORKS_DEFAULT_CONTEXT_WINDOW = 256000; export const FIREWORKS_DEFAULT_MAX_TOKENS = 256000; +export const FIREWORKS_K2_6_CONTEXT_WINDOW = 262144; +export const FIREWORKS_K2_6_MAX_TOKENS = 262144; const ZERO_COST = { input: 0, @@ -15,8 +18,24 @@ const ZERO_COST = { cacheWrite: 0, } as const; +const FIREWORKS_K2_6_COST = { + input: 0.95, + output: 4, + cacheRead: 0, + cacheWrite: 0, +} as const; + export function buildFireworksCatalogModels(): ModelDefinitionConfig[] { return [ + { + id: FIREWORKS_K2_6_MODEL_ID, + name: "Kimi K2.6", + reasoning: false, + input: ["text", "image"], + cost: FIREWORKS_K2_6_COST, + contextWindow: FIREWORKS_K2_6_CONTEXT_WINDOW, + maxTokens: FIREWORKS_K2_6_MAX_TOKENS, + }, { id: FIREWORKS_DEFAULT_MODEL_ID, name: "Kimi K2.5 Turbo (Fire Pass)", diff --git a/extensions/fireworks/stream.test.ts b/extensions/fireworks/stream.test.ts index 5199c8f90c6..7ddf1626d36 100644 --- a/extensions/fireworks/stream.test.ts +++ b/extensions/fireworks/stream.test.ts @@ -55,6 +55,24 @@ describe("createFireworksKimiThinkingDisabledWrapper", () => { ).toMatchObject({ thinking: { type: "disabled" } }); }); + it("forces thinking disabled for Fireworks Kimi k2.6 models", () => { + expect( + capturePayload({ + provider: "fireworks", + api: "openai-completions", + modelId: "accounts/fireworks/models/kimi-k2p6", + }), + ).toMatchObject({ thinking: { type: "disabled" } }); + + expect( + capturePayload({ + provider: "fireworks", + api: "openai-completions", + modelId: "accounts/fireworks/routers/kimi-k2.6-turbo", + }), + ).toMatchObject({ thinking: { type: "disabled" } }); + }); + it("strips reasoning fields when disabling Fireworks Kimi thinking", () => { const payload = capturePayload({ provider: "fireworks", diff --git a/src/agents/live-model-filter.ts b/src/agents/live-model-filter.ts index fdca2911984..69d44cebdbd 100644 --- a/src/agents/live-model-filter.ts +++ b/src/agents/live-model-filter.ts @@ -22,6 +22,7 @@ const HIGH_SIGNAL_LIVE_MODEL_PRIORITY = [ "openrouter/ai21/jamba-large-1.7", "xai/grok-4-1-fast-non-reasoning", "zai/glm-4.7", + "fireworks/accounts/fireworks/models/kimi-k2p6", "fireworks/accounts/fireworks/routers/kimi-k2p5-turbo", "minimax-portal/minimax-m2.7", ] as const;