import type { SearchResponse } from "../../../web/search/types"; import { SearchProviderError } from "../../../web/search/types"; import { findParallelApiKey, ParallelApiError, searchWithParallel } from "../../parallel"; import { clampNumResults } from "../utils"; import type { SearchParams } from "./base"; import { SearchProvider } from "./base"; import { classifyProviderHttpError, toSearchSources } from "./utils"; const DEFAULT_NUM_RESULTS = 10; const MAX_NUM_RESULTS = 40; export async function searchParallel(params: { query: string; num_results?: number; signal?: AbortSignal; }): Promise { const numResults = clampNumResults(params.num_results, DEFAULT_NUM_RESULTS, MAX_NUM_RESULTS); try { const result = await searchWithParallel(params.query, [params.query], { mode: "fast", maxCharsPerResult: 10_000, signal: params.signal, }); return { provider: "parallel", sources: toSearchSources(result.sources, numResults), requestId: result.requestId, }; } catch (err) { if (err instanceof ParallelApiError) { if (typeof err.statusCode === "number") { const classified = classifyProviderHttpError("parallel", err.statusCode, err.message); if (classified) throw classified; } throw new SearchProviderError("parallel", err.message, err.statusCode); } throw err; } } export class ParallelProvider extends SearchProvider { readonly id = "parallel"; readonly label = "Parallel"; async isAvailable() { try { return !!(await findParallelApiKey()); } catch { return false; } } search(params: SearchParams): Promise { return searchParallel({ query: params.query, num_results: params.numSearchResults ?? params.limit, signal: params.signal, }); } }