UNPKG

ai-utils.js

Version:

Build AI applications, chatbots, and agents with JavaScript and TypeScript.

47 lines (46 loc) 1.54 kB
import SecureJSON from "secure-json-parse"; import { z } from "zod"; import { AsyncQueue } from "./AsyncQueue.js"; import { parseEventSourceReadableStream } from "./parseEventSourceReadableStream.js"; const textEncoder = new TextEncoder(); const textDeltaEventDataSchema = z.object({ textDelta: z.string().optional(), isFinished: z.boolean(), }); function enqueueData(controller, data) { controller.enqueue(textEncoder.encode(`data: ${JSON.stringify(data)}\n\n`)); } export function createTextDeltaEventSource(textDeltas) { return new ReadableStream({ async start(controller) { for await (const textDelta of textDeltas) { enqueueData(controller, { textDelta, isFinished: false }); } enqueueData(controller, { isFinished: true }); }, }); } export function parseTextDeltaEventSource(stream, options) { const queue = new AsyncQueue(); // run async (no await on purpose): parseEventSourceReadableStream({ stream, callback: (event) => { if (event.type !== "event") { return; } try { const data = textDeltaEventDataSchema.parse(SecureJSON.parse(event.data)); queue.push(data.textDelta); if (data.isFinished) { queue.close(); } } catch (error) { options?.errorHandler(error); queue.close(); } }, }); return queue; }