openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
417 lines (416 loc) • 12.7 kB
JavaScript
import { l as asPositiveSafeInteger } from "./number-coercion-CJQ8TR--.js";
import { s as hasConfiguredSecretInput } from "./types.secrets-_0JOMGE5.js";
import { t as createSubsystemLogger } from "./subsystem-BzXSmsuh.js";
import "./runtime-env-D_2q8-VK.js";
import "./string-coerce-runtime-CEGJWkQ_.js";
import { r as isProviderApiKeyConfigured } from "./provider-auth-DAOC_qI9.js";
import "./secret-input-DVCzFGxN.js";
import { n as buildManifestModelProviderConfig, r as clearLiveCatalogCacheForTests } from "./provider-catalog-shared-DZr41kLr.js";
import { a as getCachedLiveProviderModelRows, t as LiveModelCatalogHttpError } from "./provider-catalog-live-runtime-D65zJRSj.js";
//#region extensions/deepinfra/openclaw.plugin.json
var modelCatalog = {
"providers": { "deepinfra": {
"baseUrl": "https://api.deepinfra.com/v1/openai",
"api": "openai-completions",
"models": [
{
"id": "deepseek-ai/DeepSeek-V4-Flash",
"name": "DeepSeek V4 Flash",
"reasoning": true,
"input": ["text"],
"contextWindow": 1048576,
"maxTokens": 1048576,
"cost": {
"input": .1,
"output": .2,
"cacheRead": .02,
"cacheWrite": 0
},
"compat": { "supportsUsageInStreaming": true }
},
{
"id": "deepseek-ai/DeepSeek-V3.2",
"name": "DeepSeek V3.2",
"reasoning": false,
"input": ["text"],
"contextWindow": 163840,
"maxTokens": 163840,
"cost": {
"input": .26,
"output": .38,
"cacheRead": .13,
"cacheWrite": 0
},
"compat": { "supportsUsageInStreaming": true }
},
{
"id": "zai-org/GLM-5.1",
"name": "GLM-5.1",
"reasoning": true,
"input": ["text"],
"contextWindow": 202752,
"maxTokens": 202752,
"cost": {
"input": 1.05,
"output": 3.5,
"cacheRead": .205000005,
"cacheWrite": 0
},
"compat": { "supportsUsageInStreaming": true }
},
{
"id": "stepfun-ai/Step-3.5-Flash",
"name": "Step 3.5 Flash",
"reasoning": false,
"input": ["text"],
"contextWindow": 262144,
"maxTokens": 262144,
"cost": {
"input": .1,
"output": .3,
"cacheRead": .02,
"cacheWrite": 0
},
"compat": { "supportsUsageInStreaming": true }
},
{
"id": "MiniMaxAI/MiniMax-M2.5",
"name": "MiniMax M2.5",
"reasoning": true,
"input": ["text"],
"contextWindow": 196608,
"maxTokens": 196608,
"cost": {
"input": .15,
"output": 1.15,
"cacheRead": .03,
"cacheWrite": 0
},
"compat": { "supportsUsageInStreaming": true }
},
{
"id": "moonshotai/Kimi-K2.5",
"name": "Kimi K2.5",
"reasoning": true,
"input": ["text", "image"],
"contextWindow": 262144,
"maxTokens": 262144,
"cost": {
"input": .45,
"output": 2.25,
"cacheRead": .070000002,
"cacheWrite": 0
},
"compat": { "supportsUsageInStreaming": true }
},
{
"id": "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B",
"name": "NVIDIA Nemotron 3 Super 120B A12B",
"reasoning": true,
"input": ["text"],
"contextWindow": 262144,
"maxTokens": 262144,
"cost": {
"input": .1,
"output": .5,
"cacheRead": 0,
"cacheWrite": 0
},
"compat": { "supportsUsageInStreaming": true }
},
{
"id": "meta-llama/Llama-3.3-70B-Instruct-Turbo",
"name": "Llama 3.3 70B Instruct Turbo",
"reasoning": false,
"input": ["text"],
"contextWindow": 131072,
"maxTokens": 131072,
"cost": {
"input": .1,
"output": .32,
"cacheRead": 0,
"cacheWrite": 0
},
"compat": { "supportsUsageInStreaming": true }
}
]
} },
"discovery": { "deepinfra": "refreshable" }
};
//#endregion
//#region extensions/deepinfra/provider-models.ts
const log = createSubsystemLogger("deepinfra-models");
const DEEPINFRA_MANIFEST_PROVIDER = buildManifestModelProviderConfig({
providerId: "deepinfra",
catalog: modelCatalog.providers.deepinfra
});
const DEEPINFRA_BASE_URL = DEEPINFRA_MANIFEST_PROVIDER.baseUrl;
const DEEPINFRA_MODELS_URL = `${DEEPINFRA_BASE_URL}/models?sort_by=openclaw&filter=with_meta`;
const DEEPINFRA_DEFAULT_MODEL_ID = "deepseek-ai/DeepSeek-V4-Flash";
const DEEPINFRA_DEFAULT_MODEL_REF = `deepinfra/${DEEPINFRA_DEFAULT_MODEL_ID}`;
const DEEPINFRA_DEFAULT_CONTEXT_WINDOW = 128e3;
const DEEPINFRA_DEFAULT_MAX_TOKENS = 8192;
const DEEPINFRA_MODEL_CATALOG = DEEPINFRA_MANIFEST_PROVIDER.models;
const DISCOVERY_TIMEOUT_MS = 5e3;
const DISCOVERY_CACHE_TTL_MS = 300 * 1e3;
function resetDeepInfraModelCacheForTest() {
clearLiveCatalogCacheForTests();
}
const SURFACE_FOR_TAG = {
chat: "chat",
vlm: "vlm",
embed: "embed",
"image-gen": "image-gen",
"video-gen": "video-gen",
tts: "tts",
stt: "stt"
};
function entryToSurfaceModel(entry) {
const id = typeof entry?.id === "string" ? entry.id.trim() : "";
if (!id) return null;
const metadata = entry.metadata;
if (!metadata) return null;
const tags = Array.isArray(metadata.tags) ? metadata.tags.filter((t) => typeof t === "string") : [];
const pricing = metadata.pricing ?? {};
return {
id,
name: id,
description: metadata.description ?? void 0,
tags,
contextWindow: asPositiveSafeInteger(metadata.context_length),
maxTokens: asPositiveSafeInteger(metadata.max_tokens),
pricing,
defaultWidth: asPositiveSafeInteger(metadata.default_width),
defaultHeight: asPositiveSafeInteger(metadata.default_height),
defaultIterations: asPositiveSafeInteger(metadata.default_iterations)
};
}
function bucketBySurface(models) {
const catalog = {
chat: [],
vlm: [],
embed: [],
imageGen: [],
videoGen: [],
tts: [],
stt: [],
live: true
};
const buckets = {
chat: catalog.chat,
vlm: catalog.vlm,
embed: catalog.embed,
"image-gen": catalog.imageGen,
"video-gen": catalog.videoGen,
tts: catalog.tts,
stt: catalog.stt
};
for (const model of models) {
const seen = /* @__PURE__ */ new Set();
for (const tag of model.tags) {
const surface = SURFACE_FOR_TAG[tag];
if (surface && !seen.has(surface)) {
seen.add(surface);
buckets[surface].push(model);
}
}
}
return catalog;
}
function hasDeepInfraSurfaceModelRows(rows) {
return rows.some((entry) => entryToSurfaceModel(entry) !== null);
}
function manifestChatEntryToSurfaceModel(entry) {
const cost = entry.cost ?? {};
const pricing = {};
if (typeof cost.input === "number") pricing.input_tokens = cost.input;
if (typeof cost.output === "number") pricing.output_tokens = cost.output;
if (typeof cost.cacheRead === "number" && cost.cacheRead > 0) pricing.cache_read_tokens = cost.cacheRead;
const tags = ["chat"];
if (entry.input?.includes("image")) tags.push("vlm");
if (entry.reasoning) tags.push("reasoning");
return {
id: entry.id,
name: entry.name ?? entry.id,
tags,
contextWindow: entry.contextWindow,
maxTokens: entry.maxTokens,
pricing
};
}
const STATIC_NON_CHAT_FALLBACK = [
{
id: "black-forest-labs/FLUX-1-schnell",
name: "black-forest-labs/FLUX-1-schnell",
tags: ["image-gen"],
pricing: { per_image_unit: .003 },
defaultWidth: 1024,
defaultHeight: 1024,
defaultIterations: 4
},
{
id: "black-forest-labs/FLUX-1-dev",
name: "black-forest-labs/FLUX-1-dev",
tags: ["image-gen"],
pricing: { per_image_unit: .025 },
defaultWidth: 1024,
defaultHeight: 1024,
defaultIterations: 28
},
{
id: "Qwen/Qwen-Image-Max",
name: "Qwen/Qwen-Image-Max",
tags: ["image-gen"],
pricing: { per_image_unit: .075 },
defaultWidth: 1024,
defaultHeight: 1024,
defaultIterations: 28
},
{
id: "stabilityai/sdxl-turbo",
name: "stabilityai/sdxl-turbo",
tags: ["image-gen"],
pricing: { per_image_unit: 2e-4 },
defaultWidth: 1024,
defaultHeight: 1024,
defaultIterations: 4
},
{
id: "hexgrad/Kokoro-82M",
name: "hexgrad/Kokoro-82M",
tags: ["tts"],
pricing: { input_characters: .65 }
},
{
id: "Qwen/Qwen3-TTS",
name: "Qwen/Qwen3-TTS",
tags: ["tts"],
pricing: { input_characters: .65 }
},
{
id: "ResembleAI/chatterbox-turbo",
name: "ResembleAI/chatterbox-turbo",
tags: ["tts"],
pricing: { input_characters: 1 }
},
{
id: "sesame/csm-1b",
name: "sesame/csm-1b",
tags: ["tts"],
pricing: { input_characters: 7 }
},
{
id: "openai/whisper-large-v3-turbo",
name: "openai/whisper-large-v3-turbo",
tags: ["stt"],
pricing: { input_seconds: 4e-5 }
},
{
id: "BAAI/bge-m3",
name: "BAAI/bge-m3",
tags: ["embed"],
pricing: { input_tokens: .01 },
maxTokens: 8192,
contextWindow: 8192
}
];
function manifestFallbackCatalog() {
const catalog = bucketBySurface([...(modelCatalog.providers.deepinfra.models ?? []).map(manifestChatEntryToSurfaceModel), ...STATIC_NON_CHAT_FALLBACK]);
catalog.live = false;
return catalog;
}
function getDeepInfraSurfaceFallbackCatalog() {
return manifestFallbackCatalog();
}
function buildDeepInfraModelDefinition(model) {
return {
...model,
compat: {
...model.compat,
supportsUsageInStreaming: model.compat?.supportsUsageInStreaming ?? true
}
};
}
function chatSurfaceModelToModelDefinition(model) {
const input = model.tags.includes("vlm") ? ["text", "image"] : ["text"];
const reasoning = model.tags.includes("reasoning") || model.tags.includes("reasoning_effort");
return buildDeepInfraModelDefinition({
id: model.id,
name: model.name,
reasoning,
input,
contextWindow: model.contextWindow ?? DEEPINFRA_DEFAULT_CONTEXT_WINDOW,
maxTokens: model.maxTokens ?? DEEPINFRA_DEFAULT_MAX_TOKENS,
cost: {
input: model.pricing.input_tokens ?? 0,
output: model.pricing.output_tokens ?? 0,
cacheRead: model.pricing.cache_read_tokens ?? 0,
cacheWrite: 0
}
});
}
function hasDeepInfraApiKey(options) {
const fromEnv = (options?.env ?? process.env).DEEPINFRA_API_KEY;
if (typeof fromEnv === "string" && fromEnv.trim() !== "") return true;
const providers = options?.config?.models?.providers;
for (const [providerId, provider] of Object.entries(providers ?? {})) if (providerId.trim().toLowerCase() === "deepinfra" && hasConfiguredSecretInput(provider?.apiKey, options?.config?.secrets?.defaults)) return true;
return isProviderApiKeyConfigured({
provider: "deepinfra",
agentDir: options?.agentDir
});
}
async function discoverDeepInfraSurfaces(options) {
if (process.env.VITEST) return manifestFallbackCatalog();
const env = options?.env ?? process.env;
if (!(options?.hasApiKey ?? hasDeepInfraApiKey({
env,
agentDir: options?.agentDir
}))) return manifestFallbackCatalog();
try {
const data = await getCachedLiveProviderModelRows({
providerId: "deepinfra",
endpoint: DEEPINFRA_MODELS_URL,
timeoutMs: DISCOVERY_TIMEOUT_MS,
ttlMs: DISCOVERY_CACHE_TTL_MS,
buildRequestHeaders: () => ({ Accept: "application/json" }),
auditContext: "deepinfra-model-discovery",
shouldCacheRows: hasDeepInfraSurfaceModelRows
});
if (data.length === 0) {
log.warn("No models found from DeepInfra agent-projection endpoint, using static catalog");
return manifestFallbackCatalog();
}
const seenIds = /* @__PURE__ */ new Set();
const surfaceModels = [];
for (const entry of data) {
const model = entryToSurfaceModel(entry);
if (!model || seenIds.has(model.id)) continue;
seenIds.add(model.id);
surfaceModels.push(model);
}
if (surfaceModels.length === 0) return manifestFallbackCatalog();
return bucketBySurface(surfaceModels);
} catch (error) {
if (error instanceof LiveModelCatalogHttpError) {
log.warn(`Failed to discover models: HTTP ${error.status}, using static catalog`);
return manifestFallbackCatalog();
}
log.warn(`Discovery failed: ${String(error)}, using static catalog`);
return manifestFallbackCatalog();
}
}
async function discoverDeepInfraModels(options) {
const catalog = await discoverDeepInfraSurfaces(options);
const chatModels = catalog.chat.length > 0 ? catalog.chat : [...catalog.chat, ...catalog.vlm];
if (chatModels.length === 0) return DEEPINFRA_MODEL_CATALOG.map(buildDeepInfraModelDefinition);
const liveModels = chatModels.map(chatSurfaceModelToModelDefinition);
const seen = new Set(liveModels.map((model) => model.id));
const manifestModels = DEEPINFRA_MODEL_CATALOG.map(buildDeepInfraModelDefinition).filter((model) => {
if (seen.has(model.id)) return false;
seen.add(model.id);
return true;
});
return [...liveModels, ...manifestModels];
}
//#endregion
export { DEEPINFRA_MODEL_CATALOG as a, discoverDeepInfraSurfaces as c, resetDeepInfraModelCacheForTest as d, DEEPINFRA_MODELS_URL as i, getDeepInfraSurfaceFallbackCatalog as l, DEEPINFRA_DEFAULT_MODEL_ID as n, buildDeepInfraModelDefinition as o, DEEPINFRA_DEFAULT_MODEL_REF as r, discoverDeepInfraModels as s, DEEPINFRA_BASE_URL as t, hasDeepInfraApiKey as u };