openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
485 lines (484 loc) • 17.9 kB
JavaScript
import { t as createLazyImportLoader } from "./lazy-promise-BONnzNfb.js";
import { i as normalizeProviderId } from "./provider-id-Dq06Bcx6.js";
import "./defaults-mDjiWzE5.js";
import { h as normalizeProviderResolvedModelWithPlugin } from "./provider-runtime-CJtW0nDR.js";
import { i as modelKey } from "./model-selection-normalize-roKDxQ9_.js";
import { i as shouldSuppressBuiltInModelFromManifest, r as shouldSuppressBuiltInModel } from "./model-suppression-DKe1ELlS.js";
import { m as canonicalizeModelCatalogProviderAlias, p as isLocalBaseUrl } from "./shared-B3B7qn2l.js";
import { t as toModelRow } from "./list.model-row-T9Fdh8B4.js";
//#region src/commands/models/list.rows.ts
const modelCatalogModuleLoader = createLazyImportLoader(() => import("./model-catalog-BflZHqiC.js"));
const modelResolverModuleLoader = createLazyImportLoader(() => import("./model-C_i8oCk4.js"));
const providerCatalogModuleLoader = createLazyImportLoader(() => import("./list.provider-catalog-DExsmK6_.js"));
function loadModelCatalogModule() {
return modelCatalogModuleLoader.load();
}
function loadModelResolverModule() {
return modelResolverModuleLoader.load();
}
function loadProviderCatalogModule() {
return providerCatalogModuleLoader.load();
}
function matchesProviderFilter(context, provider) {
const providerFilter = context.filter.provider;
if (!providerFilter) return true;
return normalizeProviderId(canonicalizeModelCatalogProviderAlias(provider, {
cfg: context.cfg,
metadataSnapshot: context.metadataSnapshot
})) === providerFilter;
}
function matchesRowFilter(context, model) {
if (!matchesProviderFilter(context, model.provider)) return false;
if (context.filter.local && !isLocalBaseUrl(model.baseUrl ?? "")) return false;
return true;
}
async function buildRow(params) {
const configured = params.context.configuredByKey.get(params.key);
const allowProviderAvailabilityFallback = params.allowProviderAvailabilityFallback === true || configured !== void 0 && params.context.authIndex.allowsProviderAuthAvailabilityFallback(params.model.provider);
const shouldResolveProviderAuth = params.context.availableKeys === void 0 || allowProviderAvailabilityFallback;
return toModelRow({
model: params.model,
key: params.key,
tags: configured ? Array.from(configured.tags) : [],
aliases: configured?.aliases ?? [],
availableKeys: params.context.availableKeys,
allowProviderAvailabilityFallback,
hasAuthForProvider: shouldResolveProviderAuth ? (provider) => params.context.authIndex.hasProviderAuth(provider) : void 0
});
}
function shouldSuppressListModel(params) {
if (params.context.skipRuntimeModelSuppression) return shouldSuppressBuiltInModelFromManifest({
provider: params.model.provider,
id: params.model.id,
config: params.context.cfg
});
return shouldSuppressBuiltInModel({
provider: params.model.provider,
id: params.model.id,
baseUrl: params.model.baseUrl,
config: params.context.cfg
});
}
function normalizeListRowWithProviderPlugin(params) {
const normalized = normalizeProviderResolvedModelWithPlugin({
provider: params.model.provider,
config: params.context.cfg,
workspaceDir: params.context.workspaceDir,
context: {
config: params.context.cfg,
agentDir: params.context.agentDir,
workspaceDir: params.context.workspaceDir,
provider: params.model.provider,
modelId: params.model.id,
model: params.model
}
});
if (!normalized) return params.model;
return {
...params.model,
id: normalized.id,
name: normalized.name,
provider: normalized.provider,
baseUrl: normalized.baseUrl,
input: toListRowInput(normalized.input),
contextWindow: normalized.contextWindow,
contextTokens: normalized.contextTokens
};
}
async function appendVisibleRow(params) {
if (params.seenKeys?.has(params.key)) return false;
if (!matchesRowFilter(params.context, params.model)) return false;
const normalizedModel = normalizeListRowWithProviderPlugin({
model: params.model,
context: params.context
});
if (!params.skipSuppression && shouldSuppressListModel({
model: normalizedModel,
context: params.context
})) return false;
params.rows.push(await buildRow({
model: normalizedModel,
key: params.key,
context: params.context,
allowProviderAvailabilityFallback: params.allowProviderAvailabilityFallback
}));
params.seenKeys?.add(params.key);
return true;
}
function resolveConfiguredModelInput(params) {
const input = Array.isArray(params.model.input) ? params.model.input.filter((item) => item === "text" || item === "image") : [];
return input.length > 0 ? input : ["text"];
}
function toConfiguredProviderListModel(params) {
return {
provider: params.provider,
id: params.model.id,
name: params.model.name ?? params.model.id,
baseUrl: params.model.baseUrl ?? params.providerConfig.baseUrl,
input: resolveConfiguredModelInput({ model: params.model }),
contextWindow: params.model.contextWindow ?? 2e5,
contextTokens: params.model.contextTokens
};
}
function toListRowInput(input) {
const parsed = input?.filter((item) => item === "text" || item === "image" || item === "document");
return parsed?.length ? parsed : ["text"];
}
function toManifestCatalogListModel(row) {
return {
provider: row.provider,
id: row.id,
name: row.name,
baseUrl: row.baseUrl,
input: toListRowInput(row.input),
contextWindow: row.contextWindow ?? 2e5
};
}
function shouldListConfiguredProviderModel(params) {
return params.providerConfig.api !== void 0 || params.model.api !== void 0;
}
function findConfiguredProviderModel(params) {
const providerConfig = params.cfg.models?.providers?.[params.provider];
const configuredModel = providerConfig?.models?.find((model) => model.id === params.modelId);
if (!providerConfig || !configuredModel) return;
return toConfiguredProviderListModel({
provider: params.provider,
providerConfig,
model: configuredModel
});
}
function toFallbackConfiguredListModel(entry, cfg) {
return findConfiguredProviderModel({
cfg,
provider: entry.ref.provider,
modelId: entry.ref.model
}) ?? {
provider: entry.ref.provider,
id: entry.ref.model,
name: entry.ref.model,
input: ["text"],
contextWindow: 2e5
};
}
/** Appends rows discovered from the loaded model registry. */
async function appendDiscoveredRows(params) {
const seenKeys = /* @__PURE__ */ new Set();
const modelResolver = params.modelRegistry && params.resolveWithRegistry !== false ? (await loadModelResolverModule()).resolveModelWithRegistry : void 0;
const sorted = [...params.models].toSorted((a, b) => {
const providerCompare = a.provider.localeCompare(b.provider);
if (providerCompare !== 0) return providerCompare;
return a.id.localeCompare(b.id);
});
for (const model of sorted) {
const key = modelKey(model.provider, model.id);
const resolvedModel = params.modelRegistry && modelResolver ? modelResolver({
provider: model.provider,
modelId: model.id,
modelRegistry: params.modelRegistry,
cfg: params.context.cfg,
agentDir: params.context.agentDir
}) : void 0;
const rowModel = resolvedModel && modelKey(resolvedModel.provider, resolvedModel.id) === key ? resolvedModel : model;
await appendVisibleRow({
rows: params.rows,
model: rowModel,
key,
context: params.context,
seenKeys,
skipSuppression: params.skipSuppression
});
}
return seenKeys;
}
/** Appends models explicitly configured under models.providers. */
async function appendConfiguredProviderRows(params) {
for (const [provider, providerConfig] of Object.entries(params.context.cfg.models?.providers ?? {})) for (const configuredModel of providerConfig.models ?? []) {
if (!shouldListConfiguredProviderModel({
providerConfig,
model: configuredModel
})) continue;
const key = modelKey(provider, configuredModel.id);
const model = toConfiguredProviderListModel({
provider,
providerConfig,
model: configuredModel
});
await appendVisibleRow({
rows: params.rows,
model,
key,
context: params.context,
seenKeys: params.seenKeys,
allowProviderAvailabilityFallback: !params.context.discoveredKeys.has(key)
});
}
}
/** Appends catalog models for providers that have configured auth. */
async function appendAuthenticatedCatalogRows(params) {
const { loadModelCatalog } = await loadModelCatalogModule();
const catalog = await loadModelCatalog({
config: params.context.cfg,
readOnly: true,
metadataSnapshot: params.context.metadataSnapshot
});
for (const entry of catalog) {
if (!params.context.authIndex.hasProviderAuth(entry.provider)) continue;
const key = modelKey(entry.provider, entry.id);
await appendVisibleRow({
rows: params.rows,
model: toManifestCatalogListModel(entry),
key,
context: params.context,
seenKeys: params.seenKeys,
allowProviderAvailabilityFallback: true
});
}
}
/** Appends normalized model catalog rows into the shared row list. */
async function appendModelCatalogRows(params) {
let appended = 0;
for (const catalogRow of params.catalogRows) {
const key = modelKey(catalogRow.provider, catalogRow.id);
if (await appendVisibleRow({
rows: params.rows,
model: toManifestCatalogListModel(catalogRow),
key,
context: params.context,
seenKeys: params.seenKeys,
allowProviderAvailabilityFallback: true
})) appended += 1;
}
return appended;
}
/** Appends manifest catalog rows through the generic catalog-row path. */
function appendManifestCatalogRows(params) {
return appendModelCatalogRows({
...params,
catalogRows: params.manifestRows
});
}
/** Appends catalog rows that are resolvable by the registry but missing from registry output. */
async function appendCatalogSupplementRows(params) {
const [{ loadModelCatalog }, { resolveModelWithRegistry }] = await Promise.all([loadModelCatalogModule(), loadModelResolverModule()]);
const catalog = await loadModelCatalog({
config: params.context.cfg,
readOnly: true,
metadataSnapshot: params.context.metadataSnapshot
});
for (const entry of catalog) {
if (!matchesProviderFilter(params.context, entry.provider)) continue;
const key = modelKey(entry.provider, entry.id);
if (params.seenKeys.has(key)) continue;
const model = resolveModelWithRegistry({
provider: entry.provider,
modelId: entry.id,
modelRegistry: params.modelRegistry,
cfg: params.context.cfg
});
if (!model) continue;
await appendVisibleRow({
rows: params.rows,
model,
key,
context: params.context,
seenKeys: params.seenKeys,
allowProviderAvailabilityFallback: !params.context.discoveredKeys.has(key)
});
}
if (params.context.filter.local || !params.context.filter.provider) return;
await appendProviderCatalogRows({
rows: params.rows,
context: params.context,
seenKeys: params.seenKeys
});
}
/** Appends model rows returned by provider catalog hooks. */
async function appendProviderCatalogRows(params) {
let appended = 0;
let catalogModels = params.catalogModels;
if (catalogModels == null) {
const { loadProviderCatalogModelsForList } = await loadProviderCatalogModule();
catalogModels = await loadProviderCatalogModelsForList({
cfg: params.context.cfg,
agentDir: params.context.agentDir,
providerFilter: params.context.filter.provider,
staticOnly: params.staticOnly,
metadataSnapshot: params.context.metadataSnapshot
});
}
for (const model of catalogModels) {
const key = modelKey(model.provider, model.id);
if (await appendVisibleRow({
rows: params.rows,
model,
key,
context: params.context,
seenKeys: params.seenKeys,
allowProviderAvailabilityFallback: !params.context.discoveredKeys.has(key)
})) appended += 1;
}
return appended;
}
/** Appends rows from default/fallback/configured model references. */
async function appendConfiguredRows(params) {
const resolveModelWithRegistry = params.modelRegistry ? (await loadModelResolverModule()).resolveModelWithRegistry : void 0;
for (const entry of params.entries) {
if (!matchesProviderFilter(params.context, entry.ref.provider)) continue;
const resolvedModel = params.modelRegistry && resolveModelWithRegistry ? resolveModelWithRegistry({
provider: entry.ref.provider,
modelId: entry.ref.model,
modelRegistry: params.modelRegistry,
cfg: params.context.cfg
}) : toFallbackConfiguredListModel(entry, params.context.cfg);
const model = resolvedModel ? normalizeListRowWithProviderPlugin({
model: resolvedModel,
context: params.context
}) : resolvedModel;
if (params.context.filter.local && model && !isLocalBaseUrl(model.baseUrl ?? "")) continue;
if (params.context.filter.local && !model) continue;
if (model && shouldSuppressListModel({
model,
context: params.context
})) continue;
const allowProviderAvailabilityFallback = model && (!params.context.discoveredKeys.has(modelKey(model.provider, model.id)) || params.context.authIndex.allowsProviderAuthAvailabilityFallback(model.provider));
const shouldResolveProviderAuth = model && (params.context.availableKeys === void 0 || allowProviderAvailabilityFallback);
params.rows.push(toModelRow({
model,
key: entry.key,
tags: Array.from(entry.tags),
aliases: entry.aliases,
availableKeys: params.context.availableKeys,
allowProviderAvailabilityFallback: allowProviderAvailabilityFallback === true,
hasAuthForProvider: shouldResolveProviderAuth ? (provider) => params.context.authIndex.hasProviderAuth(provider) : void 0
}));
}
}
//#endregion
//#region src/commands/models/list.row-sources.ts
/** Appends all rows requested by `models list --all` or a provider-filtered list. */
async function appendAllModelRowSources(params) {
if (params.context.filter.provider && params.sourcePlan.kind !== "registry") {
const seenKeys = /* @__PURE__ */ new Set();
let catalogRows = 0;
if (params.sourcePlan.kind === "manifest") catalogRows = await appendManifestCatalogRows({
rows: params.rows,
context: params.context,
seenKeys,
manifestRows: params.sourcePlan.manifestCatalogRows
});
if (catalogRows === 0 && params.sourcePlan.kind === "provider-index") catalogRows = await appendModelCatalogRows({
rows: params.rows,
context: params.context,
seenKeys,
catalogRows: params.sourcePlan.providerIndexCatalogRows
});
if (catalogRows === 0 && (params.sourcePlan.kind === "provider-runtime-static" || params.sourcePlan.kind === "provider-runtime-scoped")) catalogRows = await appendProviderCatalogRows({
rows: params.rows,
context: params.context,
seenKeys,
staticOnly: params.sourcePlan.kind === "provider-runtime-static"
});
if (params.entries && params.entries.length > 0) {
const missingEntries = params.entries.filter((entry) => !seenKeys.has(entry.key));
if (missingEntries.length > 0) {
await appendConfiguredRows({
rows: params.rows,
entries: missingEntries,
modelRegistry: params.modelRegistry,
context: params.context
});
for (const row of params.rows) seenKeys.add(row.key);
}
}
await appendConfiguredProviderRows({
rows: params.rows,
context: params.context,
seenKeys
});
if (catalogRows === 0 && params.rows.length === 0 && params.sourcePlan.fallbackToRegistryWhenEmpty) {
if (!params.modelRegistry) return { requiresRegistryFallback: true };
await appendDiscoveredRows({
rows: params.rows,
models: params.registryModels ?? params.modelRegistry.getAll(),
modelRegistry: params.modelRegistry,
context: params.context,
resolveWithRegistry: false
});
}
return { requiresRegistryFallback: false };
}
const seenKeys = await appendDiscoveredRows({
rows: params.rows,
models: params.registryModels ?? params.modelRegistry?.getAll() ?? [],
modelRegistry: params.modelRegistry,
context: params.context,
resolveWithRegistry: Boolean(params.context.filter.provider),
skipSuppression: Boolean(params.modelRegistry)
});
if (params.context.filter.provider && params.entries && params.entries.length > 0) {
const missingEntries = params.entries.filter((entry) => !seenKeys.has(entry.key));
if (missingEntries.length > 0) {
const appendedRowsStart = params.rows.length;
await appendConfiguredRows({
rows: params.rows,
entries: missingEntries,
modelRegistry: params.modelRegistry,
context: params.context
});
for (const row of params.rows.slice(appendedRowsStart)) seenKeys.add(row.key);
}
}
await appendConfiguredProviderRows({
rows: params.rows,
context: params.context,
seenKeys
});
if (params.sourcePlan.manifestCatalogRows.length > 0) await appendManifestCatalogRows({
rows: params.rows,
context: {
...params.context,
skipRuntimeModelSuppression: true
},
seenKeys,
manifestRows: params.sourcePlan.manifestCatalogRows
});
if (params.sourcePlan.providerIndexCatalogRows.length > 0) await appendModelCatalogRows({
rows: params.rows,
context: {
...params.context,
skipRuntimeModelSuppression: true
},
seenKeys,
catalogRows: params.sourcePlan.providerIndexCatalogRows
});
if (params.modelRegistry && params.context.filter.provider) await appendCatalogSupplementRows({
rows: params.rows,
modelRegistry: params.modelRegistry,
context: params.context,
seenKeys
});
if (params.modelRegistry) return { requiresRegistryFallback: false };
await appendProviderCatalogRows({
rows: params.rows,
context: params.context,
seenKeys
});
return { requiresRegistryFallback: false };
}
/** Appends the configured/default rows used by the cheap default list path. */
async function appendConfiguredModelRowSources(params) {
await appendConfiguredRows(params);
const seenKeys = new Set(params.rows.map((row) => row.key));
await appendConfiguredProviderRows({
rows: params.rows,
context: params.context,
seenKeys
});
await appendAuthenticatedCatalogRows({
rows: params.rows,
context: params.context,
seenKeys
});
}
//#endregion
export { appendAllModelRowSources, appendConfiguredModelRowSources };