From a516ebfa1992693ab602e92f4cd9caf71b5fdffd Mon Sep 17 00:00:00 2001 From: Tavily PR Agent Date: Thu, 30 Apr 2026 12:07:14 +0000 Subject: [PATCH] feat: add TavilySearchService alongside ExaSearchService in core --- packages/core/package.json | 1 + packages/core/src/index.ts | 2 +- packages/core/src/service/chat-service.ts | 1 + packages/core/src/service/index.ts | 1 + packages/core/src/service/tavily-search.ts | 51 ++++++++++++++++++++++ 5 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 packages/core/src/service/tavily-search.ts diff --git a/packages/core/package.json b/packages/core/package.json index 8bf3f62..9e91713 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -53,6 +53,7 @@ "@openrouter/ai-sdk-provider": "^1.5.3", "secure-json-parse": "^4.1.0", "@xmldom/xmldom": "^0.8.11", + "@tavily/core": "^0.6.1", "zod": "^4.1.13" }, "devDependencies": { diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 9117b3d..25cb129 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -57,7 +57,7 @@ export { } from "./tools"; export type { ChatService, BrowserService } from "./service"; -export { ExaSearchService } from "./service"; +export { ExaSearchService, TavilySearchService } from "./service"; export { sub, diff --git a/packages/core/src/service/chat-service.ts b/packages/core/src/service/chat-service.ts index f02c944..de88285 100644 --- a/packages/core/src/service/chat-service.ts +++ b/packages/core/src/service/chat-service.ts @@ -24,6 +24,7 @@ export default interface ChatService { livecrawl?: "fallback" | "preferred"; type?: "auto" | "fast" | "deep"; contextMaxCharacters?: number; + provider?: "exa" | "tavily"; } ): Promise; } diff --git a/packages/core/src/service/index.ts b/packages/core/src/service/index.ts index 50ff23e..1fe3c08 100644 --- a/packages/core/src/service/index.ts +++ b/packages/core/src/service/index.ts @@ -1,5 +1,6 @@ import { ChatService } from "./chat-service"; import { BrowserService } from "./browser-service"; export { ExaSearchService } from "./exa-search"; +export { TavilySearchService } from "./tavily-search"; export type { ChatService, BrowserService }; diff --git a/packages/core/src/service/tavily-search.ts b/packages/core/src/service/tavily-search.ts new file mode 100644 index 0000000..5a3df04 --- /dev/null +++ b/packages/core/src/service/tavily-search.ts @@ -0,0 +1,51 @@ +import { tavily } from "@tavily/core"; + +export interface TavilySearchOptions { + query: string; + maxResults?: number; + searchDepth?: "basic" | "advanced"; + topic?: "general" | "news" | "finance"; +} + +/** + * Service for performing web searches using Tavily API + * Returns raw formatted content optimized for LLM consumption + */ +export class TavilySearchService { + /** + * Performs a web search and returns formatted content from Tavily + * @param options Search options + * @param apiKey Tavily API key for authentication + * @returns Raw text content formatted for LLM consumption + */ + static async search( + options: TavilySearchOptions, + apiKey: string + ): Promise { + const { + query, + maxResults = 8, + searchDepth = "advanced", + topic = "general" + } = options; + + const client = tavily({ apiKey }); + + const response = await client.search(query, { + maxResults, + searchDepth, + topic + }); + + if (!response.results || response.results.length === 0) { + return "No search results found. Please try a different query."; + } + + return response.results + .map( + (result: { title: string; url: string; content: string }) => + `Title: ${result.title}\nURL: ${result.url}\nContent: ${result.content}` + ) + .join("\n\n---\n\n"); + } +}