openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
156 lines (155 loc) • 7.4 kB
JavaScript
import { _ as resolvePrimaryStringValue, l as normalizeOptionalString, o as normalizeLowercaseStringOrEmpty } from "./string-coerce-1VuiLaaR.mjs";
import { s as resolveAgentModelPrimaryValue } from "./model-input-C9K4a_6k.mjs";
import "./defaults-Jag53zwP.mjs";
import { t as splitTrailingAuthProfile } from "./model-ref-profile-BNjB2hED.mjs";
import "./model-ref-shared-KBg0y299.mjs";
import { t as modelKey } from "./model-key-5zORvMDY.mjs";
import { h as resolveConfiguredModelRef, i as buildModelAliasIndex, v as resolveModelRefFromString } from "./model-selection-shared-DcM6hdAC.mjs";
import { n as findModelInCatalog } from "./model-catalog-lookup-4OgPvT6V.mjs";
import { n as parseModelRef } from "./model-selection-normalize-AjjSfI-g.mjs";
import { n as resolveSubagentConfiguredModelSelection, t as resolveDefaultModelForAgent } from "./model-selection-config-BdeHEviO.mjs";
import "./model-selection-resolve-PdD2eskm.mjs";
import "./model-thinking-default-twlQ6xyp.mjs";
import "./model-selection-cli-DjravRCg.mjs";
//#region src/agents/model-selection-persisted.ts
function resolvePersistedOverrideModelRef(params) {
const defaultProvider = normalizeOptionalString(params.defaultProvider) ?? "openai";
const overrideProvider = normalizeOptionalString(params.overrideProvider);
const overrideModel = normalizeOptionalString(params.overrideModel);
if (!overrideModel) return null;
if (params.routeResolution === "resolved") return {
provider: overrideProvider ?? defaultProvider,
model: overrideModel
};
const encodedOverride = overrideProvider ? `${overrideProvider}/${overrideModel}` : overrideModel;
return parseModelRef(encodedOverride, defaultProvider, {
allowManifestNormalization: params.allowManifestNormalization,
allowPluginNormalization: params.allowPluginNormalization,
manifestPlugins: params.manifestPlugins
}) ?? {
provider: overrideProvider || defaultProvider,
model: overrideModel
};
}
function normalizeStoredOverrideModel(params) {
const providerOverride = normalizeOptionalString(params.providerOverride);
const modelOverride = normalizeOptionalString(params.modelOverride);
if (!providerOverride || !modelOverride || params.routeResolution === "resolved") return {
providerOverride,
modelOverride
};
const providerPrefix = `${providerOverride.toLowerCase()}/`;
return {
providerOverride,
modelOverride: modelOverride.toLowerCase().startsWith(providerPrefix) ? modelOverride.slice(providerOverride.length + 1).trim() || modelOverride : modelOverride
};
}
//#endregion
//#region src/agents/model-selection.ts
/**
* Public model-selection facade for persisted, configured, and allowed refs.
*/
/** Explicit session selections win over the last executed model on control/status surfaces. */
function resolvePersistedSelectedModelRef(params) {
const override = resolvePersistedOverrideModelRef({
...params,
routeResolution: params.overrideRouteResolution
});
if (override) return override;
const defaultProvider = normalizeOptionalString(params.defaultProvider) ?? "openai";
const runtimeProvider = normalizeOptionalString(params.runtimeProvider);
const runtimeModel = normalizeOptionalString(params.runtimeModel);
if (runtimeModel) {
if (runtimeProvider) return {
provider: runtimeProvider,
model: runtimeModel
};
return parseModelRef(runtimeModel, defaultProvider, params) ?? {
provider: defaultProvider,
model: runtimeModel
};
}
return null;
}
async function canonicalizeCaseOnlyCatalogModelRef(params) {
const rawModel = normalizeOptionalString(params.raw);
if (!rawModel) return;
const split = splitTrailingAuthProfile(rawModel);
if (split.profile && params.preserveAuthProfile === false) return rawModel;
const slash = split.model.indexOf("/");
if (slash <= 0 || slash === split.model.length - 1 || split.model === split.model.toLowerCase()) return rawModel;
const resolved = resolveModelRefFromString({
cfg: params.cfg,
raw: split.model,
defaultProvider: params.defaultProvider,
aliasIndex: params.aliasIndex,
allowManifestNormalization: params.allowManifestNormalization,
allowPluginNormalization: params.allowPluginNormalization
});
if (!resolved) return rawModel;
const entry = findModelInCatalog(await params.loadCatalog(), resolved.ref.provider, resolved.ref.model);
return entry ? appendAuthProfileSuffix(`${entry.provider}/${entry.id}`, split.profile) : rawModel;
}
function appendAuthProfileSuffix(modelRef, profile) {
return profile ? `${modelRef}@${profile}` : modelRef;
}
/**
* Resolve a normalized model string through a pre-built alias index, returning
* a fully qualified `provider/model` string. If the value is already qualified
* or not a known alias, returns it unchanged.
*/
function resolveModelThroughAliases(value, aliasIndex) {
const { model, profile } = splitTrailingAuthProfile(value);
const aliasMatch = model.includes("/") ? void 0 : aliasIndex.byAlias.get(normalizeLowercaseStringOrEmpty(model));
return appendAuthProfileSuffix(aliasMatch ? `${aliasMatch.ref.provider}/${aliasMatch.ref.model}` : model, profile);
}
function resolveSubagentSpawnModelSelection(params) {
const runtimeDefault = resolveDefaultModelForAgent({
cfg: params.cfg,
agentId: params.agentId
});
const configured = resolveConfiguredSubagentSpawnModelSelection({
cfg: params.cfg,
agentId: params.agentId,
modelOverride: params.modelOverride,
defaultProvider: runtimeDefault.provider,
includeAgentPrimary: !params.inheritedModel
});
if (configured) return { model: configured };
if (params.inheritedModel) return {
model: `${params.inheritedModel.provider}/${params.inheritedModel.model}`,
resolvedModel: { ...params.inheritedModel }
};
return { model: resolveModelThroughAliases(resolveAgentModelPrimaryValue(params.cfg.agents?.defaults?.model) ?? `${runtimeDefault.provider}/${runtimeDefault.model}`, buildModelAliasIndex({
cfg: params.cfg,
agentId: params.agentId,
defaultProvider: runtimeDefault.provider
})) };
}
function resolveConfiguredSubagentSpawnModelSelection(params) {
const raw = resolvePrimaryStringValue(params.modelOverride) ?? resolveSubagentConfiguredModelSelection({
cfg: params.cfg,
agentId: params.agentId,
includeAgentPrimary: params.includeAgentPrimary,
modelRuntime: params.modelRuntime
});
if (!raw) return;
const defaultProvider = normalizeOptionalString(params.defaultProvider) ?? resolveConfiguredModelRef({
cfg: params.cfg,
agentId: params.agentId,
defaultProvider: "openai",
defaultModel: "gpt-6-astra"
}, params.modelRuntime).provider;
return resolveModelThroughAliases(raw, buildModelAliasIndex({
cfg: params.cfg,
agentId: params.agentId,
defaultProvider
}));
}
/** Default reasoning level when session/directive do not set it: "on" if model supports reasoning, else "off". */
function resolveReasoningDefault(params) {
const key = modelKey(params.provider, params.model);
return (params.catalog?.find((entry) => entry.provider === params.provider && entry.id === params.model || entry.provider === key && entry.id === params.model))?.reasoning === true ? "on" : "off";
}
//#endregion
export { resolveSubagentSpawnModelSelection as a, resolveReasoningDefault as i, resolveConfiguredSubagentSpawnModelSelection as n, normalizeStoredOverrideModel as o, resolvePersistedSelectedModelRef as r, resolvePersistedOverrideModelRef as s, canonicalizeCaseOnlyCatalogModelRef as t };