fix: clamp web provider subsecond timeouts · openclaw/openclaw@0d18910
steipete
·
2026-05-29
·
via Recent Commits to openclaw:main
| Original file line number | Diff line number | Diff line change |
|---|
|
1 | 1 | import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts"; |
2 | 2 | import { canResolveEnvSecretRefInReadOnlyPath } from "openclaw/plugin-sdk/extension-shared"; |
| 3 | +import { resolvePositiveTimeoutSeconds } from "openclaw/plugin-sdk/provider-web-fetch"; |
3 | 4 | import { resolveSecretInputString, normalizeSecretInput } from "openclaw/plugin-sdk/secret-input"; |
4 | 5 | |
5 | 6 | export const DEFAULT_FIRECRAWL_BASE_URL = "https://api.firecrawl.dev"; |
@@ -225,23 +226,13 @@ export function resolveFirecrawlScrapeTimeoutSeconds(
|
225 | 226 | cfg?: OpenClawConfig, |
226 | 227 | override?: number, |
227 | 228 | ): number { |
228 | | -if (typeof override === "number" && Number.isFinite(override) && override > 0) { |
229 | | -return Math.floor(override); |
230 | | -} |
231 | 229 | const fetch = resolveFirecrawlFetchConfig(cfg); |
232 | | -if ( |
233 | | -typeof fetch?.timeoutSeconds === "number" && |
234 | | -Number.isFinite(fetch.timeoutSeconds) && |
235 | | -fetch.timeoutSeconds > 0 |
236 | | -) { |
237 | | -return Math.floor(fetch.timeoutSeconds); |
238 | | -} |
239 | | -return DEFAULT_FIRECRAWL_SCRAPE_TIMEOUT_SECONDS; |
| 230 | +return resolvePositiveTimeoutSeconds( |
| 231 | +override, |
| 232 | +resolvePositiveTimeoutSeconds(fetch?.timeoutSeconds, DEFAULT_FIRECRAWL_SCRAPE_TIMEOUT_SECONDS), |
| 233 | +); |
240 | 234 | } |
241 | 235 | |
242 | 236 | export function resolveFirecrawlSearchTimeoutSeconds(override?: number): number { |
243 | | -if (typeof override === "number" && Number.isFinite(override) && override > 0) { |
244 | | -return Math.floor(override); |
245 | | -} |
246 | | -return DEFAULT_FIRECRAWL_SEARCH_TIMEOUT_SECONDS; |
| 237 | +return resolvePositiveTimeoutSeconds(override, DEFAULT_FIRECRAWL_SEARCH_TIMEOUT_SECONDS); |
247 | 238 | } |
| Original file line number | Diff line number | Diff line change |
|---|
@@ -936,6 +936,9 @@ describe("firecrawl tools", () => {
|
936 | 936 | expect(resolveFirecrawlScrapeTimeoutSeconds(cfg)).toBe(42); |
937 | 937 | expect(resolveFirecrawlScrapeTimeoutSeconds(cfg, 19.8)).toBe(19); |
938 | 938 | expect(resolveFirecrawlSearchTimeoutSeconds(9.7)).toBe(9); |
| 939 | +expect(resolveFirecrawlScrapeTimeoutSeconds(cfg, 0.5)).toBe(1); |
| 940 | +expect(resolveFirecrawlScrapeTimeoutSeconds(cfg, 0)).toBe(42); |
| 941 | +expect(resolveFirecrawlSearchTimeoutSeconds(0.5)).toBe(1); |
939 | 942 | }); |
940 | 943 | |
941 | 944 | it("normalizes mixed search payload shapes into search items", () => { |
|
| Original file line number | Diff line number | Diff line change |
|---|
|
1 | 1 | import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts"; |
| 2 | +import { resolvePositiveTimeoutSeconds } from "openclaw/plugin-sdk/provider-web-search"; |
2 | 3 | import { |
3 | 4 | normalizeResolvedSecretInputString, |
4 | 5 | normalizeSecretInput, |
@@ -60,15 +61,9 @@ export function resolveTavilyBaseUrl(cfg?: OpenClawConfig): string {
|
60 | 61 | } |
61 | 62 | |
62 | 63 | export function resolveTavilySearchTimeoutSeconds(override?: number): number { |
63 | | -if (typeof override === "number" && Number.isFinite(override) && override > 0) { |
64 | | -return Math.floor(override); |
65 | | -} |
66 | | -return DEFAULT_TAVILY_SEARCH_TIMEOUT_SECONDS; |
| 64 | +return resolvePositiveTimeoutSeconds(override, DEFAULT_TAVILY_SEARCH_TIMEOUT_SECONDS); |
67 | 65 | } |
68 | 66 | |
69 | 67 | export function resolveTavilyExtractTimeoutSeconds(override?: number): number { |
70 | | -if (typeof override === "number" && Number.isFinite(override) && override > 0) { |
71 | | -return Math.floor(override); |
72 | | -} |
73 | | -return DEFAULT_TAVILY_EXTRACT_TIMEOUT_SECONDS; |
| 68 | +return resolvePositiveTimeoutSeconds(override, DEFAULT_TAVILY_EXTRACT_TIMEOUT_SECONDS); |
74 | 69 | } |
| Original file line number | Diff line number | Diff line change |
|---|
@@ -400,6 +400,8 @@ describe("tavily tools", () => {
|
400 | 400 | it("accepts positive numeric timeout overrides and floors them", () => { |
401 | 401 | expect(resolveTavilySearchTimeoutSeconds(19.9)).toBe(19); |
402 | 402 | expect(resolveTavilyExtractTimeoutSeconds(42.7)).toBe(42); |
| 403 | +expect(resolveTavilySearchTimeoutSeconds(0.5)).toBe(1); |
| 404 | +expect(resolveTavilyExtractTimeoutSeconds(0.5)).toBe(1); |
403 | 405 | expect(resolveTavilySearchTimeoutSeconds(0)).toBe(DEFAULT_TAVILY_SEARCH_TIMEOUT_SECONDS); |
404 | 406 | expect(resolveTavilyExtractTimeoutSeconds(Number.NaN)).toBe( |
405 | 407 | DEFAULT_TAVILY_EXTRACT_TIMEOUT_SECONDS, |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -15,6 +15,12 @@ export function resolveTimeoutSeconds(value: unknown, fallback: number): number
|
15 | 15 | return Math.max(1, Math.floor(parsed)); |
16 | 16 | } |
17 | 17 | |
| 18 | +export function resolvePositiveTimeoutSeconds(value: unknown, fallback: number): number { |
| 19 | +const parsed = |
| 20 | +typeof value === "number" && Number.isFinite(value) && value > 0 ? value : fallback; |
| 21 | +return Math.max(1, Math.floor(parsed)); |
| 22 | +} |
| 23 | + |
18 | 24 | export function resolveCacheTtlMs(value: unknown, fallbackMinutes: number): number { |
19 | 25 | const minutes = |
20 | 26 | typeof value === "number" && Number.isFinite(value) ? Math.max(0, value) : fallbackMinutes; |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -19,6 +19,7 @@ export {
|
19 | 19 | readCache, |
20 | 20 | readResponseText, |
21 | 21 | resolveCacheTtlMs, |
| 22 | +resolvePositiveTimeoutSeconds, |
22 | 23 | resolveTimeoutSeconds, |
23 | 24 | writeCache, |
24 | 25 | } from "../agents/tools/web-shared.js"; |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -62,6 +62,7 @@ export {
|
62 | 62 | readCache, |
63 | 63 | readResponseText, |
64 | 64 | resolveCacheTtlMs, |
| 65 | +resolvePositiveTimeoutSeconds, |
65 | 66 | resolveTimeoutSeconds, |
66 | 67 | writeCache, |
67 | 68 | } from "../agents/tools/web-shared.js"; |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。