openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
151 lines (150 loc) • 7.03 kB
JavaScript
import { t as dedupeByKey } from "./dedupe-by-key-DnqEVrst.mjs";
import { o as dedupeModelCatalogEntries } from "./model-selection-shared-B7jheFJO.mjs";
import { a as resolveModelCatalogIdentityKey, t as createModelCatalogIdentityKeyResolver } from "./openai-model-routes-DsXHQaeh.mjs";
import { n as compareModelCatalogEntries, r as orderModelCatalogForPicker } from "./model-catalog-order-CppoLIkR.mjs";
import { n as createModelVisibilityPolicy, t as RUNTIME_MODEL_VISIBILITY_NORMALIZATION } from "./model-visibility-policy-BBN2rsE7.mjs";
import { t as createModelCatalogView } from "./model-catalog-view-BdaxmFcB.mjs";
//#region src/agents/model-catalog-visibility.ts
/** Maps one shared auth evaluation into logical catalog selection state. */
function resolveLogicalModelCatalogEntryState(params) {
const routeManaged = params.evaluation.routeResolution !== null;
const selectedRoute = params.evaluation.selectedRoute;
const routeProjection = !routeManaged ? { kind: "unmanaged" } : selectedRoute ? {
kind: "selected",
route: selectedRoute,
policy: params.routePolicy
} : {
kind: "unresolved",
policy: params.routePolicy
};
return {
authBacked: params.authBacked ?? params.evaluation.availability === true,
compatible: params.evaluation.routeResolution?.kind !== "incompatible",
routeManaged,
routeProjection,
...params.evaluation.runtimeAuth ? { nativeRuntime: params.evaluation.runtimeAuth.id } : {}
};
}
function sortModelCatalogEntries(entries) {
return entries.toSorted(compareModelCatalogEntries);
}
/** Resolves logical rows while keeping provider-owned physical route precedence. */
async function resolveLogicalVisibleModelCatalog(params) {
return (await prepareLogicalVisibleModelCatalog({
...params,
prepareEntry: async (entry, variants) => {
const state = await params.evaluateEntry(entry, variants);
return () => state;
}
}))();
}
/** Prepare host facts once; observe revocable state only in the synchronous publication. */
async function prepareLogicalVisibleModelCatalog(params) {
const policy = params.policy ?? createModelVisibilityPolicy({
cfg: params.cfg,
catalog: params.catalog,
defaultProvider: params.defaultProvider,
defaultModel: params.defaultModel,
agentId: params.agentId,
...RUNTIME_MODEL_VISIBILITY_NORMALIZATION
});
const keyOf = createModelCatalogIdentityKeyResolver();
const catalogView = createModelCatalogView({
cfg: params.cfg,
catalog: params.catalog,
routeVariants: params.routeVariants?.length ? params.routeVariants : params.catalog,
routePolicy: params.routePolicy,
keyOf
});
const { configuredKeys, retainedKeys } = policy;
const retainedKey = params.retainedModel ? keyOf({
provider: params.retainedModel.provider,
id: params.retainedModel.model
}) : void 0;
const retained = params.catalog.filter((entry) => retainedKeys.has(keyOf(entry)) || keyOf(entry) === retainedKey);
const wildcard = policy.allowAny || policy.hasProviderWildcards;
const configuredCatalog = wildcard ? sortModelCatalogEntries([...policy.configuredCatalog]) : [];
const candidates = params.view === "all" ? params.catalog : [
...wildcard ? params.catalog : [],
...configuredCatalog,
...policy.allowedCatalog,
...retained
];
const readers = /* @__PURE__ */ new Map();
for (const entry of candidates) {
const key = resolveModelCatalogIdentityKey(entry);
if (!readers.has(key)) {
const variants = catalogView.variantsOf(entry, key) ?? [entry];
readers.set(key, await params.prepareEntry(variants[0] ?? entry, variants));
}
}
const { buildManifestBuiltInModelSuppressionResolver } = await import("./manifest-model-suppression-BbPgDuQj.mjs");
const suppression = buildManifestBuiltInModelSuppressionResolver({
config: params.cfg,
workspaceDir: params.workspaceDir,
metadataSnapshot: params.metadataSnapshot
});
const catalogKeys = new Set(params.catalog.map(createModelCatalogIdentityKeyResolver()));
return () => {
const states = new Map([...readers].map(([key, read]) => [key, read()]));
const publicationKeyOf = createModelCatalogIdentityKeyResolver();
const getEntryState = (entry) => {
const state = states.get(publicationKeyOf(entry));
if (!state) throw new Error("Model catalog publication omitted prepared entry state");
return state;
};
const projectEntries = (entries) => {
const projected = entries.flatMap((entry) => {
const state = getEntryState(entry);
const row = catalogView.readProjection(entry, state.routeProjection, publicationKeyOf(entry)).entry;
if (!state.nativeRuntime && suppression({
provider: row.provider,
id: row.id,
api: row.api,
baseUrl: row.baseUrl
})?.retirement) return [];
return [row];
});
return orderModelCatalogForPicker(dedupeByKey(projected, publicationKeyOf), params.selectedModel ?? params.retainedModel);
};
if (params.view === "all") return projectEntries(params.catalog);
const defaultVisibleCatalog = wildcard ? sortModelCatalogEntries(dedupeModelCatalogEntries([...configuredCatalog, ...params.catalog.filter((entry) => getEntryState(entry).authBacked)])) : [];
const visible = sortModelCatalogEntries(dedupeModelCatalogEntries(policy.visibleCatalog({
catalog: params.catalog,
defaultVisibleCatalog,
view: params.view
}))).filter((entry) => catalogKeys.has(publicationKeyOf(entry)) || configuredKeys.has(publicationKeyOf(entry)));
const preferredKeys = new Set([...visible, ...retained].map(publicationKeyOf));
const preferred = [];
const routeBacked = /* @__PURE__ */ new Set();
for (const entry of params.catalog) {
const key = publicationKeyOf(entry);
const preferredKey = preferredKeys.has(key);
const wildcardRoute = policy.allowAny || policy.hasProviderWildcards && policy.allowsByWildcard({
provider: entry.provider,
model: entry.id
});
if (!preferredKey && !wildcardRoute) continue;
const state = getEntryState(entry);
if (!state.compatible && !configuredKeys.has(key)) continue;
if (preferredKey && state.routeProjection.kind === "selected" && params.routePolicy.matchesRoute(entry, state.routeProjection.route)) preferred.push(entry);
if (wildcardRoute && state.routeManaged && state.authBacked) routeBacked.add(entry);
}
const kept = visible.filter((entry) => {
const state = getEntryState(entry);
const configured = configuredKeys.has(publicationKeyOf(entry));
return (state.compatible || configured) && (!state.routeManaged || configured || routeBacked.has(entry));
});
return projectEntries([
...preferred,
...kept,
...retained,
...routeBacked
]).filter((entry) => (params.view === "configured" || policy.allows({
provider: entry.provider,
model: entry.id
})) && (publicationKeyOf(entry) === retainedKey || entry.status !== "deprecated" && entry.status !== "disabled" || configuredKeys.has(publicationKeyOf(entry))));
};
}
//#endregion
export { resolveLogicalModelCatalogEntryState as n, resolveLogicalVisibleModelCatalog as r, prepareLogicalVisibleModelCatalog as t };