From c292d58d910a0f83155d815e6da06ea8ed715ea3 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 20 Apr 2026 16:24:21 +0100 Subject: [PATCH] refactor: share tavily tool helpers --- extensions/tavily/src/tavily-client.ts | 59 ++++++++++++-------- extensions/tavily/src/tavily-extract-tool.ts | 14 +---- extensions/tavily/src/tavily-search-tool.ts | 14 +---- extensions/tavily/src/tavily-tool-schema.ts | 14 +++++ 4 files changed, 53 insertions(+), 48 deletions(-) create mode 100644 extensions/tavily/src/tavily-tool-schema.ts diff --git a/extensions/tavily/src/tavily-client.ts b/extensions/tavily/src/tavily-client.ts index 67f83c44720..f61e1514df4 100644 --- a/extensions/tavily/src/tavily-client.ts +++ b/extensions/tavily/src/tavily-client.ts @@ -65,6 +65,27 @@ function resolveEndpoint(baseUrl: string, pathname: string): string { } } +async function postTavilyJson(params: { + baseUrl: string; + pathname: "/extract" | "/search"; + timeoutSeconds: number; + apiKey: string; + body: Record; + errorLabel: string; +}): Promise> { + return postTrustedWebToolsJson( + { + url: resolveEndpoint(params.baseUrl, params.pathname), + timeoutSeconds: params.timeoutSeconds, + apiKey: params.apiKey, + body: params.body, + errorLabel: params.errorLabel, + extraHeaders: { "X-Client-Source": "openclaw" }, + }, + async (response) => (await response.json()) as Record, + ); +} + export async function runTavilySearch( params: TavilySearchParams, ): Promise> { @@ -124,17 +145,14 @@ export async function runTavilySearch( } const start = Date.now(); - const payload = await postTrustedWebToolsJson( - { - url: resolveEndpoint(baseUrl, "/search"), - timeoutSeconds, - apiKey, - body, - errorLabel: "Tavily Search", - extraHeaders: { "X-Client-Source": "openclaw" }, - }, - async (response) => (await response.json()) as Record, - ); + const payload = await postTavilyJson({ + baseUrl, + pathname: "/search", + timeoutSeconds, + apiKey, + body, + errorLabel: "Tavily Search", + }); const rawResults = Array.isArray(payload.results) ? payload.results : []; const results = rawResults.map((r: Record) => @@ -218,17 +236,14 @@ export async function runTavilyExtract( } const start = Date.now(); - const payload = await postTrustedWebToolsJson( - { - url: resolveEndpoint(baseUrl, "/extract"), - timeoutSeconds, - apiKey, - body, - errorLabel: "Tavily Extract", - extraHeaders: { "X-Client-Source": "openclaw" }, - }, - async (response) => (await response.json()) as Record, - ); + const payload = await postTavilyJson({ + baseUrl, + pathname: "/extract", + timeoutSeconds, + apiKey, + body, + errorLabel: "Tavily Extract", + }); const rawResults = Array.isArray(payload.results) ? payload.results : []; const results = rawResults.map((r: Record) => diff --git a/extensions/tavily/src/tavily-extract-tool.ts b/extensions/tavily/src/tavily-extract-tool.ts index f33882358d7..4ec47cff88a 100644 --- a/extensions/tavily/src/tavily-extract-tool.ts +++ b/extensions/tavily/src/tavily-extract-tool.ts @@ -6,19 +6,7 @@ import { readStringParam, } from "openclaw/plugin-sdk/provider-web-search"; import { runTavilyExtract } from "./tavily-client.js"; - -function optionalStringEnum( - values: T, - options: { description?: string } = {}, -) { - return Type.Optional( - Type.Unsafe({ - type: "string", - enum: [...values], - ...options, - }), - ); -} +import { optionalStringEnum } from "./tavily-tool-schema.js"; const TavilyExtractToolSchema = Type.Object( { diff --git a/extensions/tavily/src/tavily-search-tool.ts b/extensions/tavily/src/tavily-search-tool.ts index dad9b7d1bbe..aee0af0079b 100644 --- a/extensions/tavily/src/tavily-search-tool.ts +++ b/extensions/tavily/src/tavily-search-tool.ts @@ -6,19 +6,7 @@ import { readStringParam, } from "openclaw/plugin-sdk/provider-web-search"; import { runTavilySearch } from "./tavily-client.js"; - -function optionalStringEnum( - values: T, - options: { description?: string } = {}, -) { - return Type.Optional( - Type.Unsafe({ - type: "string", - enum: [...values], - ...options, - }), - ); -} +import { optionalStringEnum } from "./tavily-tool-schema.js"; const TavilySearchToolSchema = Type.Object( { diff --git a/extensions/tavily/src/tavily-tool-schema.ts b/extensions/tavily/src/tavily-tool-schema.ts new file mode 100644 index 00000000000..10f7fec46a7 --- /dev/null +++ b/extensions/tavily/src/tavily-tool-schema.ts @@ -0,0 +1,14 @@ +import { Type } from "@sinclair/typebox"; + +export function optionalStringEnum( + values: T, + options: { description?: string } = {}, +) { + return Type.Optional( + Type.Unsafe({ + type: "string", + enum: [...values], + ...options, + }), + ); +}