openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
156 lines (155 loc) • 6.38 kB
JavaScript
import { m as resolveAgentWorkspaceDir, y as resolveDefaultAgentId } from "./agent-scope-config-DcbEhP0R.js";
import { n as resolveDefaultAgentWorkspaceDir } from "./workspace-default-DPT1Dhad.js";
import { y as resolveModelRefFromString } from "./model-selection-shared-BlLyx1r2.js";
import { r as DEFAULT_PROVIDER } from "./defaults-CdX9UGcX.js";
import { o as resolveAgentEffectiveModelPrimary } from "./agent-scope-DbtJyKUL.js";
import { i as resolveModelCatalogIdentityKey } from "./openai-model-routes-Bte2KVl5.js";
import { u as getActivePluginRegistry } from "./runtime-BL4wZfTq.js";
import { t as resolveAgentHarnessPolicy } from "./policy-D9i1QMuw.js";
import { t as dedupeByKey } from "./dedupe-by-key-BUZiazge.js";
import { n as collectPreparedModelRuntimeConfiguredRefs } from "./prepared-model-runtime.configured-fNJibGQY.js";
import "./workspace-ConDEamr.js";
//#region src/agents/harness/model-catalog.ts
function normalizeRouteBaseUrl(value) {
if (!value) return "";
try {
const url = new URL(value);
url.pathname = url.pathname.replace(/\/+$/u, "") || "/";
return url.toString();
} catch {
return value.trim();
}
}
function routeVariantKey(entry, identityKey = resolveModelCatalogIdentityKey(entry)) {
return [
identityKey,
entry.api ?? "",
normalizeRouteBaseUrl(entry.baseUrl)
].join("\0");
}
function mergeHarnessCompat(observed, provider) {
if (!observed && !provider) return;
const compat = {
...provider,
...observed
};
if (observed?.supportedReasoningEfforts?.length === 0) return {
...compat,
supportsReasoningEffort: false,
supportedReasoningEfforts: []
};
const efforts = [.../* @__PURE__ */ new Set([...provider?.supportedReasoningEfforts ?? [], ...observed?.supportedReasoningEfforts ?? []])];
return efforts.length > 0 ? {
...compat,
supportsReasoningEffort: true,
supportedReasoningEfforts: efforts
} : compat;
}
function enrichHarnessRows(rows, snapshot) {
const routeDonors = /* @__PURE__ */ new Map();
const identityDonors = /* @__PURE__ */ new Map();
let donorsPrepared = false;
return rows.map((entry) => {
if (entry.nativeRuntime) return entry;
if (!donorsPrepared) {
for (const donor of [...snapshot.entries, ...snapshot.staticEntries ?? []]) {
const identityKey = resolveModelCatalogIdentityKey(donor);
const routeKey = routeVariantKey(donor, identityKey);
if (!routeDonors.has(routeKey)) routeDonors.set(routeKey, donor);
if (!identityDonors.has(identityKey)) identityDonors.set(identityKey, donor);
}
donorsPrepared = true;
}
const identityKey = resolveModelCatalogIdentityKey(entry);
const donor = routeDonors.get(routeVariantKey(entry, identityKey)) ?? (entry.api === void 0 && entry.baseUrl === void 0 ? identityDonors.get(identityKey) : void 0);
if (!donor) return entry;
const compat = mergeHarnessCompat(entry.compat, donor.compat);
const mergedParams = donor.params || entry.params ? {
...donor.params,
...entry.params
} : void 0;
return {
...donor,
...entry,
...mergedParams ? { params: mergedParams } : {},
...compat ? { compat } : {}
};
});
}
async function augmentModelCatalogWithAgentHarness(params) {
const rawDefaultModel = params.defaultModel?.trim();
if (!rawDefaultModel) return params.snapshot;
const ref = resolveModelRefFromString({
cfg: params.cfg,
raw: rawDefaultModel,
defaultProvider: params.defaultProvider,
allowManifestNormalization: true,
allowPluginNormalization: true
})?.ref;
if (!ref) return params.snapshot;
const refKey = resolveModelCatalogIdentityKey({
provider: ref.provider,
id: ref.model
});
const routeEntry = [...params.snapshot.entries, ...params.snapshot.staticEntries ?? []].find((entry) => resolveModelCatalogIdentityKey(entry) === refKey);
const runtime = resolveAgentHarnessPolicy({
provider: ref.provider,
modelId: ref.model,
modelApi: routeEntry?.api,
modelBaseUrl: routeEntry?.baseUrl,
config: params.cfg,
agentId: params.agentId
}).runtime;
if (runtime === "auto" || runtime === "openclaw") return params.snapshot;
const pluginRegistry = params.observationConfig ? params.pluginRegistry : params.pluginRegistry ?? getActivePluginRegistry();
const harness = pluginRegistry?.agentHarnesses.find((entry) => entry.harness.id === runtime)?.harness;
if (!harness?.loadModelCatalog || params.isCurrent?.() === false) return params.snapshot;
try {
const configuredModelRefs = collectPreparedModelRuntimeConfiguredRefs(params.cfg, params.agentId).flatMap(({ value }) => {
const resolved = resolveModelRefFromString({
cfg: params.cfg,
agentId: params.agentId,
raw: value,
defaultProvider: params.defaultProvider,
allowManifestNormalization: true,
allowPluginNormalization: true
})?.ref;
return resolved ? [resolved] : [];
});
const listedRows = await harness.loadModelCatalog({
config: params.observationConfig ?? params.cfg,
agentId: params.agentId,
agentDir: params.agentDir,
workspaceDir: params.workspaceDir,
configuredModelRefs
});
if (params.isCurrent?.() === false || !params.pluginRegistry && getActivePluginRegistry() !== pluginRegistry) return params.snapshot;
if (listedRows.length === 0) return params.snapshot;
const rows = enrichHarnessRows(listedRows, params.snapshot);
return {
...params.snapshot,
entries: dedupeByKey([...rows, ...params.snapshot.entries], resolveModelCatalogIdentityKey),
routeVariants: dedupeByKey([...rows, ...params.snapshot.routeVariants], routeVariantKey)
};
} catch (error) {
params.onError?.(error);
return params.snapshot;
}
}
function augmentPreparedModelCatalogWithAgentHarness(params) {
const agentId = params.input.agentId ?? resolveDefaultAgentId(params.input.config);
return augmentModelCatalogWithAgentHarness({
cfg: params.input.config,
agentId,
agentDir: params.input.agentDir,
workspaceDir: params.input.workspaceDir ?? resolveAgentWorkspaceDir(params.input.config, agentId) ?? resolveDefaultAgentWorkspaceDir(),
defaultProvider: DEFAULT_PROVIDER,
defaultModel: resolveAgentEffectiveModelPrimary(params.input.config, agentId),
snapshot: params.snapshot,
pluginRegistry: params.pluginRegistry,
isCurrent: params.isCurrent,
observationConfig: params.input.config
});
}
//#endregion
export { augmentPreparedModelCatalogWithAgentHarness as n, augmentModelCatalogWithAgentHarness as t };