fix: validate perplexity token budgets · openclaw/openclaw@36de671
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 |
|---|
|
1 | 1 | import { |
2 | | -readNumberParam, |
3 | 2 | readPositiveIntegerParam, |
4 | 3 | readStringArrayParam, |
5 | 4 | readStringParam, |
@@ -350,9 +349,12 @@ export async function executePerplexitySearch(
|
350 | 349 | const rawDateAfter = readStringParam(args, "date_after"); |
351 | 350 | const rawDateBefore = readStringParam(args, "date_before"); |
352 | 351 | const domainFilter = readStringArrayParam(args, "domain_filter"); |
353 | | -const maxTokens = readNumberParam(args, "max_tokens", { positiveInteger: true }); |
354 | | -const maxTokensPerPage = readNumberParam(args, "max_tokens_per_page", { |
355 | | -positiveInteger: true, |
| 352 | +const maxTokens = readPositiveIntegerParam(args, "max_tokens", { |
| 353 | +max: 1_000_000, |
| 354 | +message: "max_tokens must be a positive integer.", |
| 355 | +}); |
| 356 | +const maxTokensPerPage = readPositiveIntegerParam(args, "max_tokens_per_page", { |
| 357 | +message: "max_tokens_per_page must be a positive integer.", |
356 | 358 | }); |
357 | 359 | |
358 | 360 | if (!structured) { |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -137,6 +137,28 @@ describe("perplexity web search provider", () => {
|
137 | 137 | }); |
138 | 138 | }); |
139 | 139 | |
| 140 | +it.each([ |
| 141 | +["max_tokens", 0, "max_tokens must be a positive integer."], |
| 142 | +["max_tokens", 1.5, "max_tokens must be a positive integer."], |
| 143 | +["max_tokens", 1_000_001, "max_tokens must be a positive integer."], |
| 144 | +["max_tokens_per_page", 1.5, "max_tokens_per_page must be a positive integer."], |
| 145 | +])("rejects invalid native token budget %s=%s", async (key, value, message) => { |
| 146 | +await withEnvAsync( |
| 147 | +{ [perplexityApiKeyEnv]: directPerplexityApiKey, [openRouterApiKeyEnv]: undefined }, |
| 148 | +async () => { |
| 149 | +const provider = createPerplexityWebSearchProvider(); |
| 150 | +const tool = provider.createTool({ config: {}, searchConfig: {} }); |
| 151 | +if (!tool) { |
| 152 | +throw new Error("Expected tool definition"); |
| 153 | +} |
| 154 | + |
| 155 | +await expect(tool.execute({ query: "OpenClaw docs", [key]: value })).rejects.toThrow( |
| 156 | +message, |
| 157 | +); |
| 158 | +}, |
| 159 | +); |
| 160 | +}); |
| 161 | + |
140 | 162 | it("reports malformed Search API JSON with a stable provider error", async () => { |
141 | 163 | await expect( |
142 | 164 | testing.readPerplexityJsonResponse(new Response("{ nope"), "Perplexity Search"), |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -59,13 +59,13 @@ function createPerplexityParameters(transport?: string): Record<string, unknown>
|
59 | 59 | description: "Native Perplexity Search API only. Domain filter (max 20).", |
60 | 60 | }; |
61 | 61 | properties.max_tokens = { |
62 | | -type: "number", |
| 62 | +type: "integer", |
63 | 63 | description: "Native Perplexity Search API only. Total content budget across all results.", |
64 | 64 | minimum: 1, |
65 | 65 | maximum: 1000000, |
66 | 66 | }; |
67 | 67 | properties.max_tokens_per_page = { |
68 | | -type: "number", |
| 68 | +type: "integer", |
69 | 69 | description: "Native Perplexity Search API only. Max tokens extracted per page.", |
70 | 70 | minimum: 1, |
71 | 71 | }; |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。