export type ChatRequest = { query: string; clarification_answer?: string | null; verbose?: boolean; }; export type RecommendRequest = { query: string; llm_model?: string | null; verbose?: boolean; }; export async function fetchChat(base: string, body: ChatRequest, signal?: AbortSignal) { return request(`${base.replace(/\/$/, "")}/chat`, body, signal); } export async function fetchRecommend(base: string, body: RecommendRequest, signal?: AbortSignal) { return request(`${base.replace(/\/$/, "")}/recommend`, body, signal); } async function request(url: string, body: any, signal?: AbortSignal) { const controller = new AbortController(); const timeout = setTimeout(() => controller.abort(), 30000); try { const res = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body), signal: signal || controller.signal, }); if (!res.ok) { const text = await res.text(); throw new Error(`HTTP ${res.status}: ${text}`); } return res.json(); } finally { clearTimeout(timeout); } }