






















@@ -1,3 +1,4 @@
1+import { readProviderJsonArrayFieldResponse } from "openclaw/plugin-sdk/provider-http";
12import type { ModelDefinitionConfig } from "openclaw/plugin-sdk/provider-model-shared";
23import { createSubsystemLogger } from "openclaw/plugin-sdk/runtime-env";
34import {
@@ -70,10 +71,6 @@ interface GatewayModelEntry {
7071supported_parameters?: string[];
7172}
727373-interface GatewayModelsResponse {
74-data: GatewayModelEntry[];
75-}
76-7774function toPricePerMillion(perToken: string | undefined): number {
7875if (!perToken) {
7976return 0;
@@ -133,6 +130,30 @@ function buildStaticCatalog(): ModelDefinitionConfig[] {
133130}));
134131}
135132133+function asGatewayModelEntry(value: unknown): GatewayModelEntry {
134+if (typeof value !== "object" || value === null || Array.isArray(value)) {
135+throw new Error("Kilocode model list: malformed JSON response");
136+}
137+const entry = value as Partial<GatewayModelEntry>;
138+if (
139+typeof entry.id !== "string" ||
140+typeof entry.pricing !== "object" ||
141+entry.pricing === null ||
142+Array.isArray(entry.pricing)
143+) {
144+throw new Error("Kilocode model list: malformed JSON response");
145+}
146+return value as GatewayModelEntry;
147+}
148+149+function readGatewayModelId(value: unknown): string {
150+if (typeof value !== "object" || value === null || Array.isArray(value)) {
151+return "";
152+}
153+const id = (value as Partial<GatewayModelEntry>).id;
154+return typeof id === "string" ? id.trim() : "";
155+}
156+136157export async function discoverKilocodeModels(): Promise<ModelDefinitionConfig[]> {
137158if (process.env.NODE_ENV === "test" || process.env.VITEST) {
138159return buildStaticCatalog();
@@ -154,24 +175,26 @@ export async function discoverKilocodeModels(): Promise<ModelDefinitionConfig[]>
154175return buildStaticCatalog();
155176}
156177157-const data = (await response.json()) as GatewayModelsResponse;
158-if (!Array.isArray(data.data) || data.data.length === 0) {
178+const data = await readProviderJsonArrayFieldResponse(
179+response,
180+"Kilocode model list",
181+"data",
182+);
183+if (data.length === 0) {
159184log.warn("No models found from gateway API, using static catalog");
160185return buildStaticCatalog();
161186}
162187163188const models: ModelDefinitionConfig[] = [];
164189const discoveredIds = new Set<string>();
165190166-for (const entry of data.data) {
167-if (!entry || typeof entry !== "object") {
168-continue;
169-}
170-const id = typeof entry.id === "string" ? entry.id.trim() : "";
171-if (!id || discoveredIds.has(id)) {
172-continue;
173-}
191+for (const rawEntry of data) {
192+const id = readGatewayModelId(rawEntry);
174193try {
194+const entry = asGatewayModelEntry(rawEntry);
195+if (!id || discoveredIds.has(id)) {
196+continue;
197+}
175198models.push(toModelDefinition(entry));
176199discoveredIds.add(id);
177200} catch (e) {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。