openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
102 lines (101 loc) • 3.56 kB
JavaScript
import { t as formatCliCommand } from "./command-format-CKGmlpAQ.js";
import { r as writeRuntimeJson } from "./runtime-B4lgFmsS.js";
import { r as logConfigUpdated } from "./logging-Cr7I5jF_.js";
import { d as updateConfig, r as ensureFlagCompatibility, u as resolveModelTarget } from "./shared-B3B7qn2l.js";
import { t as normalizeAlias } from "./alias-name-Bwsh7Ooz.js";
import { t as loadModelsConfig } from "./load-config-BBaPFZx-.js";
//#region src/commands/models/aliases.ts
/** Commands for listing, adding, and removing model aliases. */
/** Lists configured model aliases as JSON, plain pairs, or human-readable rows. */
async function modelsAliasesListCommand(opts, runtime) {
ensureFlagCompatibility(opts);
const models = (await loadModelsConfig({
commandName: "models aliases list",
runtime
})).agents?.defaults?.models ?? {};
const aliases = Object.entries(models).reduce((acc, [modelKey, entry]) => {
const alias = entry?.alias?.trim();
if (alias) acc[alias] = modelKey;
return acc;
}, {});
if (opts.json) {
writeRuntimeJson(runtime, { aliases });
return;
}
if (opts.plain) {
for (const [alias, target] of Object.entries(aliases)) runtime.log(`${alias} ${target}`);
return;
}
runtime.log(`Aliases (${Object.keys(aliases).length}):`);
if (Object.keys(aliases).length === 0) {
runtime.log("- none");
return;
}
for (const [alias, target] of Object.entries(aliases)) runtime.log(`- ${alias} -> ${target}`);
}
/** Adds or replaces an alias for a resolved provider/model target. */
async function modelsAliasesAddCommand(aliasRaw, modelRaw, runtime) {
const alias = normalizeAlias(aliasRaw);
const resolved = resolveModelTarget({
raw: modelRaw,
cfg: await loadModelsConfig({
commandName: "models aliases add",
runtime
})
});
await updateConfig((cfgLocal) => {
const modelKey = `${resolved.provider}/${resolved.model}`;
const nextModels = { ...cfgLocal.agents?.defaults?.models };
for (const [key, entry] of Object.entries(nextModels)) {
const existing = entry?.alias?.trim();
if (existing && existing === alias && key !== modelKey) throw new Error(`Alias ${alias} already points to ${key}.`);
}
nextModels[modelKey] = {
...nextModels[modelKey] ?? {},
alias
};
return {
...cfgLocal,
agents: {
...cfgLocal.agents,
defaults: {
...cfgLocal.agents?.defaults,
models: nextModels
}
}
};
});
logConfigUpdated(runtime);
runtime.log(`Alias ${alias} -> ${resolved.provider}/${resolved.model}`);
}
/** Removes a configured alias by name. */
async function modelsAliasesRemoveCommand(aliasRaw, runtime) {
const alias = normalizeAlias(aliasRaw);
const updated = await updateConfig((cfg) => {
const nextModels = { ...cfg.agents?.defaults?.models };
let found = false;
for (const [key, entry] of Object.entries(nextModels)) if (entry?.alias?.trim() === alias) {
nextModels[key] = {
...entry,
alias: void 0
};
found = true;
break;
}
if (!found) throw new Error(`Alias not found: ${alias}. Run ${formatCliCommand("openclaw models aliases list")} to see configured aliases.`);
return {
...cfg,
agents: {
...cfg.agents,
defaults: {
...cfg.agents?.defaults,
models: nextModels
}
}
};
});
logConfigUpdated(runtime);
if (!updated.agents?.defaults?.models || Object.values(updated.agents.defaults.models).every((entry) => !entry?.alias?.trim())) runtime.log("No aliases configured.");
}
//#endregion
export { modelsAliasesAddCommand, modelsAliasesListCommand, modelsAliasesRemoveCommand };