ai-utils.js
Version:
Build AI applications, chatbots, and agents with JavaScript and TypeScript.
47 lines (46 loc) • 1.54 kB
JavaScript
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;
}