diff --git a/extensions/fireworks/openclaw.plugin.json b/extensions/fireworks/openclaw.plugin.json index 4b98b189794..d55785e6e34 100644 --- a/extensions/fireworks/openclaw.plugin.json +++ b/extensions/fireworks/openclaw.plugin.json @@ -23,6 +23,45 @@ "cliDescription": "Fireworks API key" } ], + "modelCatalog": { + "providers": { + "fireworks": { + "baseUrl": "https://api.fireworks.ai/inference/v1", + "api": "openai-completions", + "models": [ + { + "id": "accounts/fireworks/models/kimi-k2p6", + "name": "Kimi K2.6", + "input": ["text", "image"], + "contextWindow": 262144, + "maxTokens": 262144, + "cost": { + "input": 0.95, + "output": 4, + "cacheRead": 0, + "cacheWrite": 0 + } + }, + { + "id": "accounts/fireworks/routers/kimi-k2p5-turbo", + "name": "Kimi K2.5 Turbo (Fire Pass)", + "input": ["text", "image"], + "contextWindow": 256000, + "maxTokens": 256000, + "cost": { + "input": 0, + "output": 0, + "cacheRead": 0, + "cacheWrite": 0 + } + } + ] + } + }, + "discovery": { + "fireworks": "static" + } + }, "configSchema": { "type": "object", "additionalProperties": false, diff --git a/extensions/fireworks/provider-catalog.ts b/extensions/fireworks/provider-catalog.ts index e85a3da9860..129537f4a41 100644 --- a/extensions/fireworks/provider-catalog.ts +++ b/extensions/fireworks/provider-catalog.ts @@ -1,57 +1,50 @@ +import { buildManifestModelProviderConfig } from "openclaw/plugin-sdk/provider-catalog-shared"; import type { ModelDefinitionConfig, ModelProviderConfig, } from "openclaw/plugin-sdk/provider-model-shared"; +import manifest from "./openclaw.plugin.json" with { type: "json" }; -export const FIREWORKS_BASE_URL = "https://api.fireworks.ai/inference/v1"; +const FIREWORKS_MANIFEST_PROVIDER = buildManifestModelProviderConfig({ + providerId: "fireworks", + catalog: manifest.modelCatalog.providers.fireworks, +}); + +export const FIREWORKS_BASE_URL = FIREWORKS_MANIFEST_PROVIDER.baseUrl; 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, - output: 0, - cacheRead: 0, - cacheWrite: 0, -} as const; +function requireFireworksManifestModel(id: string): ModelDefinitionConfig { + const model = FIREWORKS_MANIFEST_PROVIDER.models.find((entry) => entry.id === id); + if (!model) { + throw new Error(`Missing Fireworks modelCatalog row ${id}`); + } + return model; +} -const FIREWORKS_K2_6_COST = { - input: 0.95, - output: 4, - cacheRead: 0, - cacheWrite: 0, -} as const; +const FIREWORKS_DEFAULT_MODEL = requireFireworksManifestModel(FIREWORKS_DEFAULT_MODEL_ID); +const FIREWORKS_K2_6_MODEL = requireFireworksManifestModel(FIREWORKS_K2_6_MODEL_ID); + +export const FIREWORKS_DEFAULT_CONTEXT_WINDOW = FIREWORKS_DEFAULT_MODEL.contextWindow; +export const FIREWORKS_DEFAULT_MAX_TOKENS = FIREWORKS_DEFAULT_MODEL.maxTokens; +export const FIREWORKS_K2_6_CONTEXT_WINDOW = FIREWORKS_K2_6_MODEL.contextWindow; +export const FIREWORKS_K2_6_MAX_TOKENS = FIREWORKS_K2_6_MODEL.maxTokens; + +function cloneFireworksCatalogModel(model: ModelDefinitionConfig): ModelDefinitionConfig { + return { + ...model, + input: [...model.input], + cost: { ...model.cost }, + }; +} 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)", - reasoning: false, // Kimi K2.5 can expose reasoning in visible content on FirePass. - input: ["text", "image"], - cost: ZERO_COST, - contextWindow: FIREWORKS_DEFAULT_CONTEXT_WINDOW, - maxTokens: FIREWORKS_DEFAULT_MAX_TOKENS, - }, - ]; + return FIREWORKS_MANIFEST_PROVIDER.models.map(cloneFireworksCatalogModel); } export function buildFireworksProvider(): ModelProviderConfig { - return { - baseUrl: FIREWORKS_BASE_URL, - api: "openai-completions", - models: buildFireworksCatalogModels(), - }; + return buildManifestModelProviderConfig({ + providerId: "fireworks", + catalog: manifest.modelCatalog.providers.fireworks, + }); }