From e01b04d48a6dbce73034a418688458e2d05249ae Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 29 May 2026 08:00:40 -0400 Subject: [PATCH] fix(agents): centralize live model limit parsing --- src/agents/live-model-filter.test.ts | 20 ++++++++++++++++++++ src/agents/live-model-filter.ts | 4 ++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/agents/live-model-filter.test.ts b/src/agents/live-model-filter.test.ts index 84107a5a2d3..f983a064a26 100644 --- a/src/agents/live-model-filter.test.ts +++ b/src/agents/live-model-filter.test.ts @@ -92,6 +92,16 @@ describe("shouldExcludeProviderFromDefaultHighSignalLiveSweep", () => { }); describe("resolveHighSignalLiveModelLimit", () => { + it("accepts signed decimal max model limits", () => { + expect( + resolveHighSignalLiveModelLimit({ + rawMaxModels: "+3", + useExplicitModels: false, + defaultLimit: 5, + }), + ).toBe(3); + }); + it("does not coerce partial max model limits", () => { expect( resolveHighSignalLiveModelLimit({ @@ -101,4 +111,14 @@ describe("resolveHighSignalLiveModelLimit", () => { }), ).toBe(0); }); + + it("does not coerce non-decimal max model limits", () => { + expect( + resolveHighSignalLiveModelLimit({ + rawMaxModels: "0x3", + useExplicitModels: false, + defaultLimit: 5, + }), + ).toBe(0); + }); }); diff --git a/src/agents/live-model-filter.ts b/src/agents/live-model-filter.ts index f9f7fd83748..211e780f1b2 100644 --- a/src/agents/live-model-filter.ts +++ b/src/agents/live-model-filter.ts @@ -1,5 +1,6 @@ import type { OpenClawConfig } from "../config/types.openclaw.js"; import { resolveProviderModernModelRef } from "../plugins/provider-runtime.js"; +import { parseStrictNonNegativeInteger } from "../shared/number-coercion.js"; import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js"; import { liveProvidersShareOwningPlugin } from "./live-provider-owner.js"; import { normalizeProviderId } from "./provider-id.js"; @@ -414,8 +415,7 @@ export function resolveHighSignalLiveModelLimit(params: { }): number { const trimmed = params.rawMaxModels?.trim(); if (trimmed) { - const parsed = /^\d+$/.test(trimmed) ? Number(trimmed) : Number.NaN; - return Number.isSafeInteger(parsed) ? Math.max(0, parsed) : 0; + return parseStrictNonNegativeInteger(trimmed) ?? 0; } if (params.useExplicitModels) { return 0;