UNPKG

@gguf/claw

Version:

Multi-channel AI gateway with extensible messaging integrations

115 lines (113 loc) 3.63 kB
import { d as isRecord } from "./utils-CP9YLh6M.js"; import { D as resolveImplicitBedrockProvider, E as normalizeProviders, O as resolveImplicitCopilotProvider, Pt as resolveOpenClawAgentDir, k as resolveImplicitProviders } from "./model-selection-CqaTAlhy.js"; import { i as loadConfig } from "./config-PQiujvsf.js"; import path from "node:path"; import fs from "node:fs/promises"; //#region src/agents/models-config.ts const DEFAULT_MODE = "merge"; function mergeProviderModels(implicit, explicit) { const implicitModels = Array.isArray(implicit.models) ? implicit.models : []; const explicitModels = Array.isArray(explicit.models) ? explicit.models : []; if (implicitModels.length === 0) return { ...implicit, ...explicit }; const getId = (model) => { if (!model || typeof model !== "object") return ""; const id = model.id; return typeof id === "string" ? id.trim() : ""; }; const seen = new Set(explicitModels.map(getId).filter(Boolean)); const mergedModels = [...explicitModels, ...implicitModels.filter((model) => { const id = getId(model); if (!id) return false; if (seen.has(id)) return false; seen.add(id); return true; })]; return { ...implicit, ...explicit, models: mergedModels }; } function mergeProviders(params) { const out = params.implicit ? { ...params.implicit } : {}; for (const [key, explicit] of Object.entries(params.explicit ?? {})) { const providerKey = key.trim(); if (!providerKey) continue; const implicit = out[providerKey]; out[providerKey] = implicit ? mergeProviderModels(implicit, explicit) : explicit; } return out; } async function readJson(pathname) { try { const raw = await fs.readFile(pathname, "utf8"); return JSON.parse(raw); } catch { return null; } } async function ensureOpenClawModelsJson(config, agentDirOverride) { const cfg = config ?? loadConfig(); const agentDir = agentDirOverride?.trim() ? agentDirOverride.trim() : resolveOpenClawAgentDir(); const explicitProviders = cfg.models?.providers ?? {}; const providers = mergeProviders({ implicit: await resolveImplicitProviders({ agentDir, explicitProviders }), explicit: explicitProviders }); const implicitBedrock = await resolveImplicitBedrockProvider({ agentDir, config: cfg }); if (implicitBedrock) { const existing = providers["amazon-bedrock"]; providers["amazon-bedrock"] = existing ? mergeProviderModels(implicitBedrock, existing) : implicitBedrock; } const implicitCopilot = await resolveImplicitCopilotProvider({ agentDir }); if (implicitCopilot && !providers["github-copilot"]) providers["github-copilot"] = implicitCopilot; if (Object.keys(providers).length === 0) return { agentDir, wrote: false }; const mode = cfg.models?.mode ?? DEFAULT_MODE; const targetPath = path.join(agentDir, "models.json"); let mergedProviders = providers; let existingRaw = ""; if (mode === "merge") { const existing = await readJson(targetPath); if (isRecord(existing) && isRecord(existing.providers)) mergedProviders = { ...existing.providers, ...providers }; } const normalizedProviders = normalizeProviders({ providers: mergedProviders, agentDir }); const next = `${JSON.stringify({ providers: normalizedProviders }, null, 2)}\n`; try { existingRaw = await fs.readFile(targetPath, "utf8"); } catch { existingRaw = ""; } if (existingRaw === next) return { agentDir, wrote: false }; await fs.mkdir(agentDir, { recursive: true, mode: 448 }); await fs.writeFile(targetPath, next, { mode: 384 }); return { agentDir, wrote: true }; } //#endregion export { ensureOpenClawModelsJson as t };