openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
540 lines (539 loc) • 16.2 kB
JavaScript
import { a as normalizeLowercaseStringOrEmpty } from "./string-coerce-mnp54Vah.js";
import { t as createSubsystemLogger } from "./subsystem-BzXSmsuh.js";
import { n as retryAsync } from "./retry-BSIArBBz.js";
import "./runtime-env-D_2q8-VK.js";
import "./string-coerce-runtime-CEGJWkQ_.js";
import { n as buildManifestModelProviderConfig } from "./provider-catalog-shared-DZr41kLr.js";
import { a as getCachedLiveProviderModelRows, t as LiveModelCatalogHttpError } from "./provider-catalog-live-runtime-D65zJRSj.js";
//#region extensions/venice/openclaw.plugin.json
var modelCatalog = {
"providers": { "venice": {
"baseUrl": "https://api.venice.ai/api/v1",
"api": "openai-completions",
"models": [
{
"id": "llama-3.3-70b",
"name": "Llama 3.3 70B",
"reasoning": false,
"input": ["text"],
"contextWindow": 128e3,
"maxTokens": 4096,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "llama-3.2-3b",
"name": "Llama 3.2 3B",
"reasoning": false,
"input": ["text"],
"contextWindow": 128e3,
"maxTokens": 4096,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "hermes-3-llama-3.1-405b",
"name": "Hermes 3 Llama 3.1 405B",
"reasoning": false,
"input": ["text"],
"contextWindow": 128e3,
"maxTokens": 16384,
"compat": {
"supportsUsageInStreaming": false,
"supportsTools": false
}
},
{
"id": "qwen3-235b-a22b-thinking-2507",
"name": "Qwen3 235B Thinking",
"reasoning": true,
"input": ["text"],
"contextWindow": 128e3,
"maxTokens": 16384,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "qwen3-235b-a22b-instruct-2507",
"name": "Qwen3 235B Instruct",
"reasoning": false,
"input": ["text"],
"contextWindow": 128e3,
"maxTokens": 16384,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "qwen3-coder-480b-a35b-instruct",
"name": "Qwen3 Coder 480B",
"reasoning": false,
"input": ["text"],
"contextWindow": 256e3,
"maxTokens": 65536,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "qwen3-coder-480b-a35b-instruct-turbo",
"name": "Qwen3 Coder 480B Turbo",
"reasoning": false,
"input": ["text"],
"contextWindow": 256e3,
"maxTokens": 65536,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "qwen3-5-35b-a3b",
"name": "Qwen3.5 35B A3B",
"reasoning": true,
"input": ["text", "image"],
"contextWindow": 256e3,
"maxTokens": 65536,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "qwen3-next-80b",
"name": "Qwen3 Next 80B",
"reasoning": false,
"input": ["text"],
"contextWindow": 256e3,
"maxTokens": 16384,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "qwen3-vl-235b-a22b",
"name": "Qwen3 VL 235B (Vision)",
"reasoning": false,
"input": ["text", "image"],
"contextWindow": 256e3,
"maxTokens": 16384,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "qwen3-4b",
"name": "Venice Small (Qwen3 4B)",
"reasoning": true,
"input": ["text"],
"contextWindow": 32e3,
"maxTokens": 4096,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "deepseek-v3.2",
"name": "DeepSeek V3.2",
"reasoning": true,
"input": ["text"],
"contextWindow": 16e4,
"maxTokens": 32768,
"compat": {
"supportsUsageInStreaming": false,
"supportsTools": false
}
},
{
"id": "venice-uncensored",
"name": "Venice Uncensored (Dolphin-Mistral)",
"reasoning": false,
"input": ["text"],
"contextWindow": 32e3,
"maxTokens": 4096,
"compat": {
"supportsUsageInStreaming": false,
"supportsTools": false
}
},
{
"id": "mistral-31-24b",
"name": "Venice Medium (Mistral)",
"reasoning": false,
"input": ["text", "image"],
"contextWindow": 128e3,
"maxTokens": 4096,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "google-gemma-3-27b-it",
"name": "Google Gemma 3 27B Instruct",
"reasoning": false,
"input": ["text", "image"],
"contextWindow": 198e3,
"maxTokens": 16384,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "openai-gpt-oss-120b",
"name": "OpenAI GPT OSS 120B",
"reasoning": false,
"input": ["text"],
"contextWindow": 128e3,
"maxTokens": 16384,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "nvidia-nemotron-3-nano-30b-a3b",
"name": "NVIDIA Nemotron 3 Nano 30B",
"reasoning": false,
"input": ["text"],
"contextWindow": 128e3,
"maxTokens": 16384,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "olafangensan-glm-4.7-flash-heretic",
"name": "GLM 4.7 Flash Heretic",
"reasoning": true,
"input": ["text"],
"contextWindow": 128e3,
"maxTokens": 24e3,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "zai-org-glm-4.6",
"name": "GLM 4.6",
"reasoning": false,
"input": ["text"],
"contextWindow": 198e3,
"maxTokens": 16384,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "zai-org-glm-4.7",
"name": "GLM 4.7",
"reasoning": true,
"input": ["text"],
"contextWindow": 198e3,
"maxTokens": 16384,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "zai-org-glm-4.7-flash",
"name": "GLM 4.7 Flash",
"reasoning": true,
"input": ["text"],
"contextWindow": 128e3,
"maxTokens": 16384,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "zai-org-glm-5",
"name": "GLM 5",
"reasoning": true,
"input": ["text"],
"contextWindow": 198e3,
"maxTokens": 32e3,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "kimi-k2-5",
"name": "Kimi K2.5",
"reasoning": true,
"input": ["text", "image"],
"contextWindow": 256e3,
"maxTokens": 65536,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "kimi-k2-thinking",
"name": "Kimi K2 Thinking",
"reasoning": true,
"input": ["text"],
"contextWindow": 256e3,
"maxTokens": 65536,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "minimax-m21",
"name": "MiniMax M2.1",
"reasoning": true,
"input": ["text"],
"contextWindow": 198e3,
"maxTokens": 32768,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "minimax-m25",
"name": "MiniMax M2.5",
"reasoning": true,
"input": ["text"],
"contextWindow": 198e3,
"maxTokens": 32768,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "claude-opus-4-6",
"name": "Claude Opus 4.6 (via Venice)",
"reasoning": true,
"input": ["text", "image"],
"contextWindow": 1e6,
"maxTokens": 128e3,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "claude-sonnet-4-6",
"name": "Claude Sonnet 4.6 (via Venice)",
"reasoning": true,
"input": ["text", "image"],
"contextWindow": 1e6,
"maxTokens": 64e3,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "openai-gpt-52",
"name": "GPT-5.2 (via Venice)",
"reasoning": true,
"input": ["text"],
"contextWindow": 256e3,
"maxTokens": 65536,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "openai-gpt-52-codex",
"name": "GPT-5.2 Codex (via Venice)",
"reasoning": true,
"input": ["text", "image"],
"contextWindow": 256e3,
"maxTokens": 65536,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "openai-gpt-53-codex",
"name": "GPT-5.3 Codex (via Venice)",
"reasoning": true,
"input": ["text", "image"],
"contextWindow": 4e5,
"maxTokens": 128e3,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "openai-gpt-54",
"name": "GPT-5.4 (via Venice)",
"reasoning": true,
"input": ["text", "image"],
"contextWindow": 1e6,
"maxTokens": 131072,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "openai-gpt-4o-2024-11-20",
"name": "GPT-4o (via Venice)",
"reasoning": false,
"input": ["text", "image"],
"contextWindow": 128e3,
"maxTokens": 16384,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "openai-gpt-4o-mini-2024-07-18",
"name": "GPT-4o Mini (via Venice)",
"reasoning": false,
"input": ["text", "image"],
"contextWindow": 128e3,
"maxTokens": 16384,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "gemini-3-pro-preview",
"name": "Gemini 3 Pro (via Venice)",
"reasoning": true,
"input": ["text", "image"],
"contextWindow": 198e3,
"maxTokens": 32768,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "gemini-3-1-pro-preview",
"name": "Gemini 3.1 Pro (via Venice)",
"reasoning": true,
"input": ["text", "image"],
"contextWindow": 1e6,
"maxTokens": 32768,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "gemini-3-flash-preview",
"name": "Gemini 3 Flash (via Venice)",
"reasoning": true,
"input": ["text", "image"],
"contextWindow": 256e3,
"maxTokens": 65536,
"compat": { "supportsUsageInStreaming": false }
},
{
"id": "grok-41-fast",
"name": "Grok 4.1 Fast (via Venice)",
"reasoning": true,
"input": ["text", "image"],
"contextWindow": 1e6,
"maxTokens": 3e4,
"compat": { "supportsUsageInStreaming": false }
}
]
} },
"discovery": { "venice": "refreshable" }
};
//#endregion
//#region extensions/venice/models.ts
const log = createSubsystemLogger("venice-models");
const VENICE_MANIFEST_PROVIDER = buildManifestModelProviderConfig({
providerId: "venice",
catalog: modelCatalog.providers.venice
});
const VENICE_BASE_URL = VENICE_MANIFEST_PROVIDER.baseUrl;
const VENICE_DEFAULT_MODEL_REF = `venice/kimi-k2-5`;
const VENICE_ALLOWED_HOSTNAMES = ["api.venice.ai"];
const VENICE_DEFAULT_COST = {
input: 0,
output: 0,
cacheRead: 0,
cacheWrite: 0
};
const VENICE_DEFAULT_CONTEXT_WINDOW = 128e3;
const VENICE_DEFAULT_MAX_TOKENS = 4096;
const VENICE_DISCOVERY_HARD_MAX_TOKENS = 131072;
const VENICE_DISCOVERY_TIMEOUT_MS = 1e4;
const VENICE_DISCOVERY_CACHE_TTL_MS = 6e4;
const VENICE_DISCOVERY_RETRYABLE_HTTP_STATUS = new Set([
408,
425,
429,
500,
502,
503,
504
]);
const VENICE_DISCOVERY_RETRYABLE_NETWORK_CODES = new Set([
"ECONNABORTED",
"ECONNREFUSED",
"ECONNRESET",
"EAI_AGAIN",
"ENETDOWN",
"ENETUNREACH",
"ENOTFOUND",
"ETIMEDOUT",
"UND_ERR_BODY_TIMEOUT",
"UND_ERR_CONNECT_TIMEOUT",
"UND_ERR_CONNECT_ERROR",
"UND_ERR_HEADERS_TIMEOUT",
"UND_ERR_SOCKET"
]);
const VENICE_MODEL_CATALOG = VENICE_MANIFEST_PROVIDER.models;
function buildVeniceModelDefinition(entry) {
return {
id: entry.id,
name: entry.name,
reasoning: entry.reasoning,
input: [...entry.input],
cost: VENICE_DEFAULT_COST,
contextWindow: entry.contextWindow,
maxTokens: entry.maxTokens,
compat: {
supportsUsageInStreaming: false,
...entry.compat
}
};
}
function staticVeniceModelDefinitions() {
return VENICE_MODEL_CATALOG.map(buildVeniceModelDefinition);
}
function hasRetryableNetworkCode(err) {
const queue = [err];
const seen = /* @__PURE__ */ new Set();
while (queue.length > 0) {
const current = queue.shift();
if (!current || typeof current !== "object" || seen.has(current)) continue;
seen.add(current);
const candidate = current;
const code = typeof candidate.code === "string" ? candidate.code : typeof candidate.errno === "string" ? candidate.errno : void 0;
if (code && VENICE_DISCOVERY_RETRYABLE_NETWORK_CODES.has(code)) return true;
if (candidate.cause) queue.push(candidate.cause);
if (Array.isArray(candidate.errors)) queue.push(...candidate.errors);
}
return false;
}
function isRetryableVeniceDiscoveryError(err) {
if (err instanceof LiveModelCatalogHttpError) return VENICE_DISCOVERY_RETRYABLE_HTTP_STATUS.has(err.status);
if (err instanceof Error && err.name === "AbortError") return true;
if (err instanceof TypeError && normalizeLowercaseStringOrEmpty(err.message) === "fetch failed") return true;
return hasRetryableNetworkCode(err);
}
function normalizePositiveInt(value) {
if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) return;
return Math.floor(value);
}
function resolveApiMaxCompletionTokens(params) {
const raw = normalizePositiveInt(params.apiModel.model_spec?.maxCompletionTokens);
if (!raw) return;
const contextWindow = normalizePositiveInt(params.apiModel.model_spec?.availableContextTokens);
const knownMaxTokens = typeof params.knownMaxTokens === "number" && Number.isFinite(params.knownMaxTokens) ? Math.floor(params.knownMaxTokens) : void 0;
return Math.min(raw, contextWindow ?? knownMaxTokens ?? VENICE_DEFAULT_CONTEXT_WINDOW, knownMaxTokens ?? VENICE_DISCOVERY_HARD_MAX_TOKENS);
}
function resolveApiSupportsTools(apiModel) {
const supportsFunctionCalling = apiModel.model_spec?.capabilities?.supportsFunctionCalling;
return typeof supportsFunctionCalling === "boolean" ? supportsFunctionCalling : void 0;
}
async function discoverVeniceModels(options = {}) {
if (process.env.VITEST) return staticVeniceModelDefinitions();
try {
const data = await retryAsync(async () => await getCachedLiveProviderModelRows({
providerId: "venice",
endpoint: `${VENICE_BASE_URL}/models`,
timeoutMs: VENICE_DISCOVERY_TIMEOUT_MS,
ttlMs: VENICE_DISCOVERY_CACHE_TTL_MS,
policy: { allowedHostnames: VENICE_ALLOWED_HOSTNAMES },
auditContext: "venice-model-discovery"
}), {
attempts: 3,
minDelayMs: options.retryDelayMs ?? 300,
maxDelayMs: options.retryDelayMs ?? 2e3,
jitter: options.retryDelayMs === void 0 ? .2 : 0,
label: "venice-model-discovery",
shouldRetry: isRetryableVeniceDiscoveryError
});
if (data.length === 0) {
log.warn("No models found from API, using static catalog");
return staticVeniceModelDefinitions();
}
const catalogById = new Map(VENICE_MODEL_CATALOG.map((m) => [m.id, m]));
const models = [];
for (const apiModel of data) {
const catalogEntry = catalogById.get(apiModel.id);
const apiMaxTokens = resolveApiMaxCompletionTokens({
apiModel,
knownMaxTokens: catalogEntry?.maxTokens
});
const apiSupportsTools = resolveApiSupportsTools(apiModel);
if (catalogEntry) {
const definition = buildVeniceModelDefinition(catalogEntry);
if (apiMaxTokens !== void 0) definition.maxTokens = apiMaxTokens;
if (apiSupportsTools === false) definition.compat = {
...definition.compat,
supportsTools: false
};
models.push(definition);
} else {
const apiSpec = apiModel.model_spec;
const lowerModelId = normalizeLowercaseStringOrEmpty(apiModel.id);
const isReasoning = apiSpec?.capabilities?.supportsReasoning || lowerModelId.includes("thinking") || lowerModelId.includes("reason") || lowerModelId.includes("r1");
const hasVision = apiSpec?.capabilities?.supportsVision === true;
models.push({
id: apiModel.id,
name: apiSpec?.name || apiModel.id,
reasoning: isReasoning,
input: hasVision ? ["text", "image"] : ["text"],
cost: VENICE_DEFAULT_COST,
contextWindow: normalizePositiveInt(apiSpec?.availableContextTokens) ?? VENICE_DEFAULT_CONTEXT_WINDOW,
maxTokens: apiMaxTokens ?? VENICE_DEFAULT_MAX_TOKENS,
compat: {
supportsUsageInStreaming: false,
...apiSupportsTools === false ? { supportsTools: false } : {}
}
});
}
}
return models.length > 0 ? models : staticVeniceModelDefinitions();
} catch (error) {
if (error instanceof LiveModelCatalogHttpError) {
log.warn(`Failed to discover models: HTTP ${error.status}, using static catalog`);
return staticVeniceModelDefinitions();
}
log.warn(`Discovery failed: ${String(error)}, using static catalog`);
return staticVeniceModelDefinitions();
}
}
//#endregion
export { discoverVeniceModels as a, buildVeniceModelDefinition as i, VENICE_DEFAULT_MODEL_REF as n, VENICE_MODEL_CATALOG as r, VENICE_BASE_URL as t };