fix: validate perplexity token budgets · openclaw/openclaw@2df9b2e
steipete
·
2026-05-29
·
via Recent Commits to openclaw:main
File tree
extensions/perplexity/src
| Original file line number | Diff line number | Diff line change |
|---|
@@ -343,8 +343,10 @@ export async function executePerplexitySearch(
|
343 | 343 | const rawDateAfter = readStringParam(args, "date_after"); |
344 | 344 | const rawDateBefore = readStringParam(args, "date_before"); |
345 | 345 | const domainFilter = readStringArrayParam(args, "domain_filter"); |
346 | | -const maxTokens = readNumberParam(args, "max_tokens", { integer: true }); |
347 | | -const maxTokensPerPage = readNumberParam(args, "max_tokens_per_page", { integer: true }); |
| 346 | +const maxTokens = readNumberParam(args, "max_tokens", { positiveInteger: true }); |
| 347 | +const maxTokensPerPage = readNumberParam(args, "max_tokens_per_page", { |
| 348 | +positiveInteger: true, |
| 349 | +}); |
348 | 350 | |
349 | 351 | if (!structured) { |
350 | 352 | if (country) { |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -57,6 +57,23 @@ describe("readNumberParam", () => {
|
57 | 57 | const params = { messageId: "42.9" }; |
58 | 58 | expect(readNumberParam(params, "messageId", { integer: true })).toBe(42); |
59 | 59 | }); |
| 60 | + |
| 61 | +it("accepts only positive safe integers when positiveInteger is true", () => { |
| 62 | +expect(readNumberParam({ tokenBudget: "42" }, "tokenBudget", { positiveInteger: true })).toBe( |
| 63 | +42, |
| 64 | +); |
| 65 | +expect( |
| 66 | +readNumberParam({ tokenBudget: "42.9" }, "tokenBudget", { positiveInteger: true }), |
| 67 | +).toBeUndefined(); |
| 68 | +expect( |
| 69 | +readNumberParam({ tokenBudget: 0 }, "tokenBudget", { positiveInteger: true }), |
| 70 | +).toBeUndefined(); |
| 71 | +expect( |
| 72 | +readNumberParam({ tokenBudget: Number.POSITIVE_INFINITY }, "tokenBudget", { |
| 73 | +positiveInteger: true, |
| 74 | +}), |
| 75 | +).toBeUndefined(); |
| 76 | +}); |
60 | 77 | }); |
61 | 78 | |
62 | 79 | describe("snake_case aliases", () => { |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -157,9 +157,21 @@ export function readStringOrNumberParam(
|
157 | 157 | export function readNumberParam( |
158 | 158 | params: Record<string, unknown>, |
159 | 159 | key: string, |
160 | | -options: { required?: boolean; label?: string; integer?: boolean; strict?: boolean } = {}, |
| 160 | +options: { |
| 161 | +required?: boolean; |
| 162 | +label?: string; |
| 163 | +integer?: boolean; |
| 164 | +strict?: boolean; |
| 165 | +positiveInteger?: boolean; |
| 166 | +} = {}, |
161 | 167 | ): number | undefined { |
162 | | -const { required = false, label = key, integer = false, strict = false } = options; |
| 168 | +const { |
| 169 | + required = false, |
| 170 | + label = key, |
| 171 | + integer = false, |
| 172 | + strict = false, |
| 173 | + positiveInteger = false, |
| 174 | +} = options; |
163 | 175 | const raw = readParamRaw(params, key); |
164 | 176 | let value: number | undefined; |
165 | 177 | if (typeof raw === "number" && Number.isFinite(raw)) { |
@@ -179,6 +191,9 @@ export function readNumberParam(
|
179 | 191 | } |
180 | 192 | return undefined; |
181 | 193 | } |
| 194 | +if (positiveInteger) { |
| 195 | +return Number.isSafeInteger(value) && value > 0 ? value : undefined; |
| 196 | +} |
182 | 197 | return integer ? Math.trunc(value) : value; |
183 | 198 | } |
184 | 199 | |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。