import { createParser, ParsedEvent, ReconnectInterval } from "eventsource-parser"; export async function handleSourcesAndAnswer(question: string) { let sourcesResponse = await fetch("/api/getSources", { method: "POST", body: JSON.stringify({ question }), }); let sources = await sourcesResponse.json(); const response = await fetch("/api/getAnswer", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ question, sources }), }); if (!response.ok) { throw new Error(response.statusText); } if (response.status === 202) { const fullAnswer = await response.text(); return fullAnswer; } // This data is a ReadableStream const data = response.body; if (!data) { return; } const onParse = (event: ParsedEvent | ReconnectInterval) => { if (event.type === "event") { const data = event.data; try { const text = JSON.parse(data).text ?? ""; return text; } catch (e) { console.error(e); } } }; // https://web.dev/streams/#the-getreader-and-read-methods const reader = data.getReader(); const decoder = new TextDecoder(); const parser = createParser(onParse); let done = false; while (!done) { const { value, done: doneReading } = await reader.read(); done = doneReading; const chunkValue = decoder.decode(value); parser.feed(chunkValue); } } export async function handleSimilarQuestions(question: string) { let res = await fetch("/api/getSimilarQuestions", { method: "POST", body: JSON.stringify({ question }), }); let questions = await res.json(); return questions; } export async function handleLanggraphAnswer(question: string) { const response = await fetch("/api/generateLanggraph", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ question }), }); if (!response.ok) { throw new Error(response.statusText); } // This data is a ReadableStream const data = response.body; if (!data) { return; } const onParse = (event: ParsedEvent | ReconnectInterval) => { if (event.type === "event") { const data = event.data; try { const text = JSON.parse(data).text ?? ""; return text; } catch (e) { console.error(e); } } }; const reader = data.getReader(); const decoder = new TextDecoder(); const parser = createParser(onParse); let done = false; while (!done) { const { value, done: doneReading } = await reader.read(); done = doneReading; const chunkValue = decoder.decode(value); parser.feed(chunkValue); } }