fix: validate deepinfra model metadata numbers · openclaw/openclaw@423531d
steipete
·
2026-05-29
·
via Recent Commits to openclaw:main
| Original file line number | Diff line number | Diff line change |
|---|
@@ -436,6 +436,50 @@ describe("discoverDeepInfraSurfaces (per-surface bucketing)", () => {
|
436 | 436 | }); |
437 | 437 | }); |
438 | 438 | |
| 439 | +it("drops malformed live numeric metadata", async () => { |
| 440 | +const mockFetch = vi.fn().mockResolvedValue({ |
| 441 | +ok: true, |
| 442 | +json: () => |
| 443 | +Promise.resolve({ |
| 444 | +data: [ |
| 445 | +makeAgentModelEntry({ |
| 446 | +id: "bad/chat", |
| 447 | +metadata: { |
| 448 | +description: "bad chat", |
| 449 | +context_length: -1, |
| 450 | +max_tokens: 1.5, |
| 451 | +pricing: { input_tokens: 3, output_tokens: 15 }, |
| 452 | +tags: ["chat"], |
| 453 | +}, |
| 454 | +}), |
| 455 | +makeAgentModelEntry({ |
| 456 | +id: "bad/image", |
| 457 | +metadata: { |
| 458 | +description: "bad image", |
| 459 | +pricing: { per_image_unit: 0.003 }, |
| 460 | +tags: ["image-gen"], |
| 461 | +default_width: Number.POSITIVE_INFINITY, |
| 462 | +default_height: 1024.5, |
| 463 | +default_iterations: 0, |
| 464 | +}, |
| 465 | +}), |
| 466 | +], |
| 467 | +}), |
| 468 | +}); |
| 469 | + |
| 470 | +await withFetchPathTest(mockFetch, { DEEPINFRA_API_KEY: "sk-test" }, async () => { |
| 471 | +const catalog = await discoverDeepInfraSurfaces(); |
| 472 | + |
| 473 | +expect(catalog.chat[0]).toMatchObject({ id: "bad/chat" }); |
| 474 | +expect(catalog.chat[0]?.contextWindow).toBeUndefined(); |
| 475 | +expect(catalog.chat[0]?.maxTokens).toBeUndefined(); |
| 476 | +expect(catalog.imageGen[0]).toMatchObject({ id: "bad/image" }); |
| 477 | +expect(catalog.imageGen[0]?.defaultWidth).toBeUndefined(); |
| 478 | +expect(catalog.imageGen[0]?.defaultHeight).toBeUndefined(); |
| 479 | +expect(catalog.imageGen[0]?.defaultIterations).toBeUndefined(); |
| 480 | +}); |
| 481 | +}); |
| 482 | + |
439 | 483 | it("returns the manifest static fallback (live=false) when no API key is configured", async () => { |
440 | 484 | const mockFetch = vi.fn(); |
441 | 485 | |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -4,6 +4,7 @@ import { fetchWithTimeout } from "openclaw/plugin-sdk/provider-http";
|
4 | 4 | import type { ModelDefinitionConfig } from "openclaw/plugin-sdk/provider-model-shared"; |
5 | 5 | import { createSubsystemLogger } from "openclaw/plugin-sdk/runtime-env"; |
6 | 6 | import { hasConfiguredSecretInput } from "openclaw/plugin-sdk/secret-input"; |
| 7 | +import { asPositiveSafeInteger } from "openclaw/plugin-sdk/string-coerce-runtime"; |
7 | 8 | import manifest from "./openclaw.plugin.json" with { type: "json" }; |
8 | 9 | |
9 | 10 | const log = createSubsystemLogger("deepinfra-models"); |
@@ -131,15 +132,12 @@ function entryToSurfaceModel(entry: DeepInfraAgentModelEntry): DeepInfraSurfaceM
|
131 | 132 | name: id, |
132 | 133 | description: metadata.description ?? undefined, |
133 | 134 | tags, |
134 | | -contextWindow: |
135 | | -typeof metadata.context_length === "number" ? metadata.context_length : undefined, |
136 | | -maxTokens: typeof metadata.max_tokens === "number" ? metadata.max_tokens : undefined, |
| 135 | +contextWindow: asPositiveSafeInteger(metadata.context_length), |
| 136 | +maxTokens: asPositiveSafeInteger(metadata.max_tokens), |
137 | 137 | pricing, |
138 | | -defaultWidth: typeof metadata.default_width === "number" ? metadata.default_width : undefined, |
139 | | -defaultHeight: |
140 | | -typeof metadata.default_height === "number" ? metadata.default_height : undefined, |
141 | | -defaultIterations: |
142 | | -typeof metadata.default_iterations === "number" ? metadata.default_iterations : undefined, |
| 138 | +defaultWidth: asPositiveSafeInteger(metadata.default_width), |
| 139 | +defaultHeight: asPositiveSafeInteger(metadata.default_height), |
| 140 | +defaultIterations: asPositiveSafeInteger(metadata.default_iterations), |
143 | 141 | }; |
144 | 142 | } |
145 | 143 | |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。