From 1f81697069ea882a3523490e88aa551f07b0272e Mon Sep 17 00:00:00 2001 From: Max Leiter Date: Sun, 11 Jun 2023 18:24:23 -0700 Subject: [PATCH 1/2] ai-stream: fix trimStartOfStreamHelper --- packages/core/streams/ai-stream.ts | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/packages/core/streams/ai-stream.ts b/packages/core/streams/ai-stream.ts index 89fecf0..d6ac79f 100644 --- a/packages/core/streams/ai-stream.ts +++ b/packages/core/streams/ai-stream.ts @@ -12,13 +12,17 @@ export interface AIStreamCallbacks { } export interface AIStreamParser { - (data: string): string | void + (data: string, isStream: boolean): string | void } export function createEventStreamTransformer(customParser: AIStreamParser) { const decoder = new TextDecoder() let parser: EventSourceParser + let isSSE = false; + let isFirstChunk = true; + + return new TransformStream({ async start(controller): Promise { function onParse(event: ParsedEvent | ReconnectInterval) { @@ -29,7 +33,12 @@ export function createEventStreamTransformer(customParser: AIStreamParser) { return } - const message = customParser(data) + if (isFirstChunk) { + isFirstChunk = false; + isSSE = data.startsWith('data: '); + } + + const message = customParser(data, isSSE) if (message) controller.enqueue(message) } } @@ -76,13 +85,17 @@ export function createCallbacksTransformer( // If we're still at the start of the stream, we want to trim the leading // `\n\n`. But, after we've seen some text, we no longer want to trim out // whitespace. + export function trimStartOfStreamHelper() { - let start = true + let start = true; return (text: string) => { - if (start) text = text.trimStart() - if (text) start = false - return text - } + let trimmedText = text; + if (start) { + trimmedText = text.trimStart(); + start = trimmedText.length > 0; + } + return trimmedText; + }; } export function AIStream( @@ -90,6 +103,7 @@ export function AIStream( customParser: AIStreamParser, callbacks?: AIStreamCallbacks ): ReadableStream { + console.log('res.body', res.body) const stream = res.body || new ReadableStream({ From 380f340492e1aa4b3afb5ed86bcea8f17ddbd480 Mon Sep 17 00:00:00 2001 From: Max Leiter Date: Sun, 11 Jun 2023 18:27:39 -0700 Subject: [PATCH 2/2] undo change --- packages/core/streams/ai-stream.ts | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/packages/core/streams/ai-stream.ts b/packages/core/streams/ai-stream.ts index d6ac79f..311c69b 100644 --- a/packages/core/streams/ai-stream.ts +++ b/packages/core/streams/ai-stream.ts @@ -12,17 +12,13 @@ export interface AIStreamCallbacks { } export interface AIStreamParser { - (data: string, isStream: boolean): string | void + (data: string): string | void } export function createEventStreamTransformer(customParser: AIStreamParser) { const decoder = new TextDecoder() let parser: EventSourceParser - let isSSE = false; - let isFirstChunk = true; - - return new TransformStream({ async start(controller): Promise { function onParse(event: ParsedEvent | ReconnectInterval) { @@ -33,12 +29,7 @@ export function createEventStreamTransformer(customParser: AIStreamParser) { return } - if (isFirstChunk) { - isFirstChunk = false; - isSSE = data.startsWith('data: '); - } - - const message = customParser(data, isSSE) + const message = customParser(data) if (message) controller.enqueue(message) } } @@ -85,17 +76,16 @@ export function createCallbacksTransformer( // If we're still at the start of the stream, we want to trim the leading // `\n\n`. But, after we've seen some text, we no longer want to trim out // whitespace. - export function trimStartOfStreamHelper() { - let start = true; + let start = true return (text: string) => { - let trimmedText = text; + let trimmedText = text if (start) { - trimmedText = text.trimStart(); - start = trimmedText.length > 0; + trimmedText = text.trimStart() + start = trimmedText.length > 0 } - return trimmedText; - }; + return trimmedText + } } export function AIStream( @@ -103,7 +93,6 @@ export function AIStream( customParser: AIStreamParser, callbacks?: AIStreamCallbacks ): ReadableStream { - console.log('res.body', res.body) const stream = res.body || new ReadableStream({