UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

362 lines (361 loc) 11.5 kB
import { i as normalizeModelCompat } from "./provider-model-compat-BNXu5bti.js"; import "./provider-model-shared-fX-Ywqb3.js"; import { d as projectProviderCatalogSnapshotRows, f as projectUpstreamProviderCatalogSnapshot, l as getCachedUpstreamProviderCatalog, n as buildLiveModelProviderConfig, o as fetchLiveProviderModelIds, u as listProviderCatalogSnapshotEntries } from "./provider-catalog-live-runtime-EZZSw18v.js"; //#region extensions/opencode-go/openclaw.plugin.json var openclaw_plugin_default = { id: "opencode-go", activation: { "onStartup": false }, providerCatalogEntry: "./provider-discovery.ts", enabledByDefault: true, providers: ["opencode-go"], providerEndpoints: [{ "endpointClass": "opencode-go-native", "baseUrls": ["https://opencode.ai/zen/go", "https://opencode.ai/zen/go/v1"] }], providerRequest: { "providers": { "opencode-go": { "family": "opencode" } } }, modelCatalog: { "providers": { "opencode-go": { "baseUrl": "https://opencode.ai/zen/go/v1", "api": "openai-completions", "models": [ { "id": "deepseek-v4-pro", "name": "DeepSeek V4 Pro", "reasoning": true, "input": ["text"], "contextWindow": 1e6, "maxTokens": 384e3, "cost": { "input": .435, "output": .87, "cacheRead": .003625, "cacheWrite": 0 }, "compat": { "supportsUsageInStreaming": true, "supportsReasoningEffort": true, "supportedReasoningEfforts": ["high", "max"], "maxTokensField": "max_tokens", "supportsDeveloperRole": false, "supportsStrictMode": false, "codeMode": "capable" } }, { "id": "deepseek-v4-flash", "name": "DeepSeek V4 Flash", "reasoning": true, "input": ["text"], "contextWindow": 1e6, "maxTokens": 384e3, "cost": { "input": .14, "output": .28, "cacheRead": .0028, "cacheWrite": 0 }, "compat": { "supportsUsageInStreaming": true, "supportsReasoningEffort": true, "supportedReasoningEfforts": [ "low", "high", "max" ], "maxTokensField": "max_tokens", "supportsDeveloperRole": false, "supportsStrictMode": false, "codeMode": "capable" } }, { "id": "kimi-k3", "name": "Kimi K3", "reasoning": true, "input": ["text", "image"], "contextWindow": 1048576, "maxTokens": 131072, "cost": { "input": 3, "output": 15, "cacheRead": .3, "cacheWrite": 0 }, "compat": { "supportsUsageInStreaming": true, "supportsReasoningEffort": true, "supportedReasoningEfforts": ["max"], "maxTokensField": "max_tokens", "supportsDeveloperRole": false, "supportsStrictMode": false, "codeMode": "capable" } }, { "id": "kimi-k2.6", "name": "Kimi K2.6", "reasoning": true, "input": ["text", "image"], "contextWindow": 262144, "maxTokens": 65536, "cost": { "input": .95, "output": 4, "cacheRead": .16, "cacheWrite": 0 }, "compat": { "supportsUsageInStreaming": true, "supportsDeveloperRole": false, "supportsStrictMode": false } }, { "id": "gpt-5.6-luna", "name": "GPT-5.6 Luna", "api": "openai-responses", "reasoning": true, "input": ["text", "image"], "contextWindow": 105e4, "contextTokens": 922e3, "maxTokens": 128e3, "cost": { "input": .2, "output": 1.2, "cacheRead": .02, "cacheWrite": .25, "tieredPricing": [{ "input": .2, "output": 1.2, "cacheRead": .02, "cacheWrite": .25, "range": [0, 272e3] }, { "input": .4, "output": 1.8, "cacheRead": .04, "cacheWrite": .5, "range": [272e3] }] }, "compat": { "supportsUsageInStreaming": true, "supportsReasoningEffort": true, "supportedReasoningEfforts": [ "none", "low", "medium", "high", "xhigh", "max" ], "maxTokensField": "max_tokens", "codeMode": "capable" } }, { "id": "qwen3.8-max", "name": "Qwen3.8 Max", "api": "anthropic-messages", "baseUrl": "https://opencode.ai/zen/go", "reasoning": true, "input": ["text", "image"], "contextWindow": 1e6, "maxTokens": 131072, "cost": { "input": 2, "output": 6, "cacheRead": .25, "cacheWrite": 2.5 }, "compat": { "thinkingFormat": "qwen", "codeMode": "capable" } }, { "id": "hy3-preview", "name": "HY3 Preview", "status": "preview", "reasoning": true, "input": ["text"], "contextWindow": 262144, "maxTokens": 32768, "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }, "compat": { "supportsUsageInStreaming": true, "supportsDeveloperRole": false, "supportsStrictMode": false } } ] } }, "discovery": { "opencode-go": "runtime" } }, setup: { "providers": [{ "id": "opencode-go", "envVars": ["OPENCODE_API_KEY", "OPENCODE_ZEN_API_KEY"] }] }, providerAuthChoices: [{ "provider": "opencode-go", "method": "api-key", "choiceId": "opencode-go", "appGuidedSecret": true, "choiceLabel": "OpenCode Go catalog", "groupId": "opencode", "groupLabel": "OpenCode", "groupHint": "Shared API key infrastructure for Zen + Go", "optionKey": "opencodeGoApiKey", "cliFlag": "--opencode-go-api-key", "cliOption": "--opencode-go-api-key <key>", "cliDescription": "OpenCode API key (Go catalog)" }], contracts: { "mediaUnderstandingProviders": ["opencode-go"] }, mediaUnderstandingProviderMetadata: { "opencode-go": { "capabilities": ["image"], "defaultModels": { "image": "kimi-k2.6" } } }, configSchema: { "type": "object", "additionalProperties": false, "properties": {} } }; //#endregion //#region extensions/opencode-go/provider-catalog.ts const PROVIDER_ID = "opencode-go"; const OPENCODE_GO_OPENAI_BASE_URL = "https://opencode.ai/zen/go/v1"; const OPENCODE_GO_ANTHROPIC_BASE_URL = "https://opencode.ai/zen/go"; const OPENCODE_GO_KIMI_NO_REASONING_MODEL_IDS = /* @__PURE__ */ new Set([ "kimi-k2.5", "kimi-k2.6", "kimi-k2.7-code" ]); const OPENCODE_GO_MODELS_ENDPOINT = "https://opencode.ai/zen/go/v1/models"; const OPENCODE_UPSTREAM_CATALOG_ENDPOINT = "https://models.opencode.ai/api.json"; const OPENCODE_GO_MODELS_TIMEOUT_MS = 5e3; const OPENCODE_GO_MODELS_CACHE_TTL_MS = 6e4; const OPENCODE_GO_MANIFEST_PROVIDER = openclaw_plugin_default.modelCatalog.providers[PROVIDER_ID]; const OPENCODE_GO_SEED_CATALOG = new Map(OPENCODE_GO_MANIFEST_PROVIDER.models.map((row) => { const hydrated = { ...row, provider: PROVIDER_ID, api: "api" in row ? row.api : OPENCODE_GO_MANIFEST_PROVIDER.api, baseUrl: "baseUrl" in row ? row.baseUrl : OPENCODE_GO_MANIFEST_PROVIDER.baseUrl }; const model = normalizeModelCompat(hydrated); return [model.id.toLowerCase(), { model, ..."status" in row && (row.status === "deprecated" || row.status === "preview") ? { status: row.status } : {} }]; })); let opencodeGoCatalog = OPENCODE_GO_SEED_CATALOG; function listStaticOpencodeGoModels() { return [...OPENCODE_GO_SEED_CATALOG.values()].filter(({ model }) => !opencodeGoCatalog.get(model.id)?.status).map(({ model }) => model); } function cacheUpstreamOpencodeGoModels(catalog) { opencodeGoCatalog = projectUpstreamProviderCatalogSnapshot({ providerId: PROVIDER_ID, provider: catalog, seed: OPENCODE_GO_SEED_CATALOG, anthropicBaseUrl: OPENCODE_GO_ANTHROPIC_BASE_URL, defaultBaseUrl: OPENCODE_GO_OPENAI_BASE_URL, decorateModel: (model) => model.api === "anthropic-messages" && model.id.startsWith("qwen") ? { ...model, compat: { ...model.compat, thinkingFormat: "qwen" } } : model }); } function buildStaticOpencodeGoProviderConfig(apiKey) { return { api: "openai-completions", baseUrl: OPENCODE_GO_OPENAI_BASE_URL, ...apiKey ? { apiKey } : {}, models: listStaticOpencodeGoModels() }; } async function resolveOpencodeGoStarterModel(params) { const liveModelIds = await fetchLiveProviderModelIds({ providerId: PROVIDER_ID, endpoint: OPENCODE_GO_MODELS_ENDPOINT, discoveryApiKey: params.apiKey, fetchGuard: params.fetchGuard, signal: params.signal, timeoutMs: OPENCODE_GO_MODELS_TIMEOUT_MS, auditContext: "opencode-go-onboarding-model-discovery" }); const preferredModelId = params.preferredModelRef.replace(`${PROVIDER_ID}/`, ""); return liveModelIds.includes(preferredModelId) ? params.preferredModelRef : void 0; } async function buildOpencodeGoLiveProviderConfig(params = {}) { if (!params.apiKey && !params.discoveryApiKey) return buildStaticOpencodeGoProviderConfig(); try { const upstream = await getCachedUpstreamProviderCatalog({ endpoint: OPENCODE_UPSTREAM_CATALOG_ENDPOINT, providerId: PROVIDER_ID, fetchGuard: params.fetchGuard, signal: params.signal }); if (upstream) cacheUpstreamOpencodeGoModels(upstream); } catch {} return await buildLiveModelProviderConfig({ providerId: PROVIDER_ID, endpoint: OPENCODE_GO_MODELS_ENDPOINT, providerConfig: { api: "openai-completions", baseUrl: OPENCODE_GO_OPENAI_BASE_URL }, models: listStaticOpencodeGoModels(), apiKey: params.apiKey, discoveryApiKey: params.discoveryApiKey, fetchGuard: params.fetchGuard, signal: params.signal, timeoutMs: OPENCODE_GO_MODELS_TIMEOUT_MS, ttlMs: OPENCODE_GO_MODELS_CACHE_TTL_MS, auditContext: "opencode-go-model-discovery", projectRows: (rows) => projectProviderCatalogSnapshotRows(rows, opencodeGoCatalog) }); } function listOpencodeGoModelCatalogEntries() { return listProviderCatalogSnapshotEntries(opencodeGoCatalog); } function resolveOpencodeGoModel(modelId) { return OPENCODE_GO_SEED_CATALOG.get(modelId.trim().toLowerCase())?.model; } function isOpencodeGoKimiNoReasoningModelId(modelId) { return typeof modelId === "string" && OPENCODE_GO_KIMI_NO_REASONING_MODEL_IDS.has(modelId.trim().toLowerCase()); } function normalizeOpencodeGoResolvedModel(model) { if (!isOpencodeGoKimiNoReasoningModelId(model.id)) return; const compat = model.compat && typeof model.compat === "object" && !Array.isArray(model.compat) ? model.compat : void 0; if (!model.reasoning && !compat?.supportsReasoningEffort) return; return { ...model, reasoning: false, compat: { ...compat, supportsReasoningEffort: false } }; } function normalizeBaseUrl(baseUrl) { return (baseUrl ?? "").trim().replace(/\/+$/, ""); } function normalizeOpencodeGoBaseUrl(params) { const normalized = normalizeBaseUrl(params.baseUrl); if (!normalized) return; if (normalized === OPENCODE_GO_OPENAI_BASE_URL) return OPENCODE_GO_OPENAI_BASE_URL; if (normalized === OPENCODE_GO_ANTHROPIC_BASE_URL) return OPENCODE_GO_ANTHROPIC_BASE_URL; if (normalized === "https://opencode.ai/go") return OPENCODE_GO_ANTHROPIC_BASE_URL; if (normalized === "https://opencode.ai/go/v1") return params.api === "anthropic-messages" ? OPENCODE_GO_ANTHROPIC_BASE_URL : OPENCODE_GO_OPENAI_BASE_URL; } //#endregion export { normalizeOpencodeGoBaseUrl as a, resolveOpencodeGoStarterModel as c, listOpencodeGoModelCatalogEntries as i, openclaw_plugin_default as l, buildStaticOpencodeGoProviderConfig as n, normalizeOpencodeGoResolvedModel as o, isOpencodeGoKimiNoReasoningModelId as r, resolveOpencodeGoModel as s, buildOpencodeGoLiveProviderConfig as t };