jbilcke-hf's picture
jbilcke-hf HF staff
add "movie director assistant" LLM step
e4e0e54
raw
history blame
983 Bytes
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))
}