Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
import { Readable } from "node:stream" | |
async function* chunksToLines( | |
chunksAsync: AsyncIterable<Buffer> | |
): AsyncIterable<string> { | |
let previous = "" | |
for await (const chunk of chunksAsync) { | |
const bufferChunk = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk) | |
previous += bufferChunk | |
let eolIndex | |
while ((eolIndex = previous.indexOf("\n")) >= 0) { | |
// line includes the EOL | |
const line = previous.slice(0, eolIndex + 1).trimEnd() | |
if (line === "data: [DONE]") break | |
if (line.startsWith("data: ")) yield line | |
previous = previous.slice(eolIndex + 1) | |
} | |
} | |
} | |
async function* linesToMessages( | |
linesAsync: AsyncIterable<string> | |
): AsyncIterable<string> { | |
for await (const line of linesAsync) { | |
const message = line.substring("data :".length) | |
yield message | |
} | |
} | |
export async function* streamCompletion( | |
stream: Readable | |
): AsyncGenerator<string, void, undefined> { | |
yield* linesToMessages(chunksToLines(stream)) | |
} |