@@ -158,6 +158,32 @@ export class AssistantStream
158158 } ;
159159 }
160160
161+ static fromReadableStream ( stream : ReadableStream ) : AssistantStream {
162+ const runner = new AssistantStream ( ) ;
163+ runner . _run ( ( ) => runner . _fromReadableStream ( stream ) ) ;
164+ return runner ;
165+ }
166+
167+ protected async _fromReadableStream (
168+ readableStream : ReadableStream ,
169+ options ?: Core . RequestOptions ,
170+ ) : Promise < Run > {
171+ const signal = options ?. signal ;
172+ if ( signal ) {
173+ if ( signal . aborted ) this . controller . abort ( ) ;
174+ signal . addEventListener ( 'abort' , ( ) => this . controller . abort ( ) ) ;
175+ }
176+ this . _connected ( ) ;
177+ const stream = Stream . fromReadableStream < AssistantStreamEvent > ( readableStream , this . controller ) ;
178+ for await ( const event of stream ) {
179+ this . #handleEvent( event ) ;
180+ }
181+ if ( stream . controller . signal ?. aborted ) {
182+ throw new APIUserAbortError ( ) ;
183+ }
184+ return this . _addRun ( this . #endRequest( ) ) ;
185+ }
186+
161187 toReadableStream ( ) : ReadableStream {
162188 const stream = new Stream ( this [ Symbol . asyncIterator ] . bind ( this ) , this . controller ) ;
163189 return stream . toReadableStream ( ) ;
@@ -385,7 +411,7 @@ export class AssistantStream
385411 throw new OpenAIError ( `stream has ended, this shouldn't happen` ) ;
386412 }
387413
388- if ( ! this . #finalRun) throw Error ( 'Final run has been been received' ) ;
414+ if ( ! this . #finalRun) throw Error ( 'Final run has not been received' ) ;
389415
390416 return this . #finalRun;
391417 }
0 commit comments