openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
81 lines (80 loc) • 3.24 kB
JavaScript
import { u as asPositiveFiniteNumber } from "./number-coercion-CLj0HTDM.js";
import { c as isRecord } from "./record-coerce-DItp3I4t.js";
import { l as normalizeOptionalString } from "./string-coerce-CIXf7egm.js";
import { r as normalizeProviderId } from "./provider-id-DMd-TDFp.js";
import { t as MODEL_APIS } from "./types.models-Z6EPRVI_.js";
import { i as isGeneratedPluginModelCatalog, r as filterGeneratedPluginModelCatalogProviders, s as loadPersistedPluginModelCatalogsReadOnly } from "./plugin-model-catalog-MRmefceV.js";
//#region src/commands/models/list.persisted-catalog.ts
/** Reads persisted generated catalogs without constructing a model registry. */
const modelApis = new Set(MODEL_APIS);
const modelInputs = /* @__PURE__ */ new Set([
"text",
"image",
"audio",
"video",
"document"
]);
function readModelApi(value) {
const api = normalizeOptionalString(value);
return api && modelApis.has(api) ? api : void 0;
}
function readModelInput(value) {
if (!Array.isArray(value)) return;
const input = value.filter((item) => typeof item === "string" && modelInputs.has(item));
return input.length > 0 ? input : void 0;
}
function parseProviderModels(params) {
if (!isRecord(params.provider) || !Array.isArray(params.provider.models)) return [];
const providerApi = readModelApi(params.provider.api);
const providerBaseUrl = normalizeOptionalString(params.provider.baseUrl);
return params.provider.models.flatMap((model) => {
if (!isRecord(model)) return [];
const id = normalizeOptionalString(model.id);
const api = readModelApi(model.api) ?? providerApi;
if (!id || !api) return [];
const baseUrl = normalizeOptionalString(model.baseUrl) ?? providerBaseUrl;
const input = readModelInput(model.input);
const contextWindow = asPositiveFiniteNumber(model.contextWindow);
const contextTokens = asPositiveFiniteNumber(model.contextTokens);
return [{
id,
name: normalizeOptionalString(model.name) ?? id,
provider: normalizeProviderId(params.providerId),
api,
...baseUrl ? { baseUrl } : {},
...contextWindow !== void 0 ? { contextWindow } : {},
...contextTokens !== void 0 ? { contextTokens } : {},
...typeof model.reasoning === "boolean" ? { reasoning: model.reasoning } : {},
...input ? { input } : {}
}];
});
}
/** Loads valid provider-owned rows from the agent's generated catalog cache. */
function loadPersistedListCatalogEntries(params) {
const entries = [];
for (const catalog of loadPersistedPluginModelCatalogsReadOnly(params.agentDir)) {
let parsed;
try {
parsed = JSON.parse(catalog.contents);
} catch {
continue;
}
if (!isRecord(parsed) || !isGeneratedPluginModelCatalog(parsed) || !isRecord(parsed.providers)) continue;
const providers = filterGeneratedPluginModelCatalogProviders({
catalogPluginId: catalog.pluginId,
parsedCatalog: parsed,
pluginMetadataSnapshot: params.metadataSnapshot,
providers: parsed.providers
});
for (const [providerId, provider] of Object.entries(providers)) {
if (!params.providerIds.has(normalizeProviderId(providerId))) continue;
entries.push(...parseProviderModels({
providerId,
provider
}));
}
}
return entries;
}
//#endregion
export { loadPersistedListCatalogEntries };