import type { KilocodeModelCatalogEntry } from "openclaw/plugin-sdk/provider-model-shared"; import type { ModelDefinitionConfig } from "openclaw/plugin-sdk/provider-model-shared"; import { createSubsystemLogger } from "openclaw/plugin-sdk/runtime-env"; import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/text-runtime";
function toPricePerMillion(perToken: string | undefined): number { if (!perToken) { return0;
} const num = Number(perToken); if (!Number.isFinite(num) || num < 0) { return0;
} return num * 1_000_000;
}
if (!response.ok) {
log.warn(`Failed to discover models: HTTP ${response.status}, using static catalog`); return buildStaticCatalog();
}
const data = (await response.json()) as GatewayModelsResponse; if (!Array.isArray(data.data) || data.data.length === 0) {
log.warn("No models found from gateway API, using static catalog"); return buildStaticCatalog();
}
const models: ModelDefinitionConfig[] = []; const discoveredIds = new Set<string>();
for (const entry of data.data) { if (!entry || typeof entry !== "object") { continue;
} const id = typeof entry.id === "string" ? entry.id.trim() : ""; if (!id || discoveredIds.has(id)) { continue;
} try {
models.push(toModelDefinition(entry));
discoveredIds.add(id);
} catch (e) {
log.warn(`Skipping malformed model entry "${id}": ${String(e)}`);
}
}
const staticModels = buildStaticCatalog(); for (const staticModel of staticModels) { if (!discoveredIds.has(staticModel.id)) {
models.unshift(staticModel);
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.