interface SearchResult { title: string; url: string; excerpt: string; } interface SearchResponse { results: SearchResult[]; query: string; cannot_search_more: boolean; } interface SearchOptions { pastResults?: SearchResult[]; useWebSearch?: boolean; } export async function searchTopics( query: string, options?: SearchOptions ): Promise { const url = `${process.env.PUBLIC_COPILOT_URL || import.meta.env.PUBLIC_COPILOT_URL || 'http://100.70.30.1:8000'}/search`; const body = { q: query, use_web_search: options?.useWebSearch ?? false, ...(options?.pastResults?.length && { past_results: options.pastResults }), }; const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(body), signal: AbortSignal.timeout(60000), }); if (!response.ok) { if (response.status === 429) { throw new Error('Rate limit exceeded. Please try again later.'); } throw new Error(`Search failed: ${response.statusText}`); } return response.json(); }