From 637f1540cf9345ef9be1efecbb8ee9e20b32812a Mon Sep 17 00:00:00 2001 From: Christopher Mayor Date: Fri, 24 Apr 2026 14:34:22 -0700 Subject: [PATCH] feat: update research pipeline with Tavily search and progress stages --- src/lib/llm/index.ts | 43 ++++++++++++++++++++++++++++++++++--------- src/lib/llm/types.ts | 1 + 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/lib/llm/index.ts b/src/lib/llm/index.ts index 27eee0d..052a631 100644 --- a/src/lib/llm/index.ts +++ b/src/lib/llm/index.ts @@ -3,7 +3,9 @@ import type { ComparisonResult, ResearchProgress, } from "./types"; -import { generateComparison } from "./providers/openai"; +import { searchItem, type SearchResult } from "./providers/tavily"; +import { generateComparisonWithResearch } from "./providers/openai"; +import { getActiveProvider } from "./providers"; export type { ComparisonRequest, @@ -24,21 +26,44 @@ export async function* runResearch( return; } - for (let i = 0; i < request.items.length; i++) { - yield { - stage: "researching", - item: request.items[i], - progress: Math.round(((i + 0.5) / request.items.length) * 80), - }; + const provider = getActiveProvider(); + const searchResults: Record = {}; + + if (provider.hasSearch) { + for (let i = 0; i < request.items.length; i++) { + const item = request.items[i]; + const results = await searchItem(item, request.query); + searchResults[item] = results; + + yield { + stage: "searching", + item, + results: results.length, + }; + + yield { + stage: "researching", + item, + progress: Math.round(((i + 1) / request.items.length) * 50), + }; + } + } else { + for (let i = 0; i < request.items.length; i++) { + yield { + stage: "researching", + item: request.items[i], + progress: Math.round(((i + 0.5) / request.items.length) * 80), + }; + } } yield { stage: "synthesizing", - message: "Synthesizing research into structured comparison...", + message: `Synthesizing research into structured comparison using ${provider.name}...`, }; try { - const result = await generateComparison(request); + const result = await provider.synthesize(request, searchResults); yield { stage: "complete", result }; } catch (error) { yield { diff --git a/src/lib/llm/types.ts b/src/lib/llm/types.ts index 70c123f..af45835 100644 --- a/src/lib/llm/types.ts +++ b/src/lib/llm/types.ts @@ -31,6 +31,7 @@ export interface ComparisonResult { export type ResearchProgress = | { stage: "parsing"; message: string } + | { stage: "searching"; item: string; results: number } | { stage: "researching"; item: string; progress: number } | { stage: "synthesizing"; message: string } | { stage: "complete"; result: ComparisonResult }