mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-25 12:49:32 +00:00
Resolve bundled Fireworks manifest models through core's static catalog so Kimi K2.6 keeps its 262,144-token context limit and nested model compatibility metadata. Keep the existing dynamic fallback for uncataloged Fireworks IDs and align bundled Kimi reasoning metadata with existing runtime behavior. Verified with focused tests, extension/core type checks, lint/format, full build, fresh autoreview, required CI, and a live Fireworks Kimi K2.6 embedded run using a real key. Co-authored-by: Evgeni Obuchowski <evgeni@obukhovski.com>
107 lines
3.3 KiB
TypeScript
107 lines
3.3 KiB
TypeScript
// Fireworks plugin entrypoint registers its OpenClaw integration.
|
|
import type { ProviderResolveDynamicModelContext } from "openclaw/plugin-sdk/plugin-entry";
|
|
import { defineSingleProviderPluginEntry } from "openclaw/plugin-sdk/provider-entry";
|
|
import {
|
|
cloneFirstTemplateModel,
|
|
DEFAULT_CONTEXT_TOKENS,
|
|
normalizeModelCompat,
|
|
OPENAI_COMPATIBLE_REPLAY_HOOKS,
|
|
} from "openclaw/plugin-sdk/provider-model-shared";
|
|
import { isFireworksKimiModelId } from "./model-id.js";
|
|
import { applyFireworksConfig, FIREWORKS_DEFAULT_MODEL_REF } from "./onboard.js";
|
|
import {
|
|
buildFireworksProvider,
|
|
FIREWORKS_BASE_URL,
|
|
FIREWORKS_DEFAULT_CONTEXT_WINDOW,
|
|
FIREWORKS_DEFAULT_MAX_TOKENS,
|
|
FIREWORKS_DEFAULT_MODEL_ID,
|
|
isFireworksCatalogModelId,
|
|
} from "./provider-catalog.js";
|
|
import { wrapFireworksProviderStream } from "./stream.js";
|
|
import { resolveFireworksThinkingProfile } from "./thinking-policy.js";
|
|
|
|
const PROVIDER_ID = "fireworks";
|
|
|
|
function isFireworksGlmModelId(modelId: string): boolean {
|
|
const normalized = modelId.trim().toLowerCase();
|
|
const lastSegment = normalized.split("/").pop() ?? normalized;
|
|
return /^glm[-_.]/.test(lastSegment);
|
|
}
|
|
|
|
function resolveFireworksDynamicInput(modelId: string): Array<"text" | "image"> {
|
|
return isFireworksGlmModelId(modelId) ? ["text"] : ["text", "image"];
|
|
}
|
|
|
|
function resolveFireworksDynamicModel(ctx: ProviderResolveDynamicModelContext) {
|
|
const modelId = ctx.modelId.trim();
|
|
if (!modelId) {
|
|
return undefined;
|
|
}
|
|
|
|
if (isFireworksCatalogModelId(modelId)) {
|
|
return undefined;
|
|
}
|
|
|
|
const isKimiModel = isFireworksKimiModelId(modelId);
|
|
const input = resolveFireworksDynamicInput(modelId);
|
|
|
|
return (
|
|
cloneFirstTemplateModel({
|
|
providerId: PROVIDER_ID,
|
|
modelId,
|
|
templateIds: [FIREWORKS_DEFAULT_MODEL_ID],
|
|
ctx,
|
|
patch: {
|
|
provider: PROVIDER_ID,
|
|
reasoning: !isKimiModel,
|
|
input,
|
|
},
|
|
}) ??
|
|
normalizeModelCompat({
|
|
id: modelId,
|
|
name: modelId,
|
|
provider: PROVIDER_ID,
|
|
api: "openai-completions",
|
|
baseUrl: FIREWORKS_BASE_URL,
|
|
reasoning: !isKimiModel,
|
|
input,
|
|
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
contextWindow: FIREWORKS_DEFAULT_CONTEXT_WINDOW,
|
|
maxTokens: FIREWORKS_DEFAULT_MAX_TOKENS || DEFAULT_CONTEXT_TOKENS,
|
|
})
|
|
);
|
|
}
|
|
|
|
export default defineSingleProviderPluginEntry({
|
|
id: PROVIDER_ID,
|
|
name: "Fireworks Provider",
|
|
description: "Bundled Fireworks AI provider plugin",
|
|
provider: {
|
|
label: "Fireworks",
|
|
aliases: ["fireworks-ai"],
|
|
docsPath: "/providers/fireworks",
|
|
auth: [
|
|
{
|
|
methodId: "api-key",
|
|
label: "Fireworks API key",
|
|
hint: "API key",
|
|
optionKey: "fireworksApiKey",
|
|
flagName: "--fireworks-api-key",
|
|
envVar: "FIREWORKS_API_KEY",
|
|
promptMessage: "Enter Fireworks API key",
|
|
defaultModel: FIREWORKS_DEFAULT_MODEL_REF,
|
|
applyConfig: (cfg) => applyFireworksConfig(cfg),
|
|
},
|
|
],
|
|
catalog: {
|
|
buildProvider: buildFireworksProvider,
|
|
allowExplicitBaseUrl: true,
|
|
},
|
|
...OPENAI_COMPATIBLE_REPLAY_HOOKS,
|
|
wrapStreamFn: wrapFireworksProviderStream,
|
|
resolveThinkingProfile: ({ modelId }) => resolveFireworksThinkingProfile(modelId),
|
|
resolveDynamicModel: (ctx) => resolveFireworksDynamicModel(ctx),
|
|
isModernModelRef: () => true,
|
|
},
|
|
});
|