@@ -505,6 +505,34 @@ describe('ToolRunner', () => {
505
505
await expectDone ( iterator ) ;
506
506
} ) ;
507
507
508
+ it ( 'handles api errors streaming' , async ( ) => {
509
+ const { runner, handleRequest, handleAssistantMessageStream } = setupTest ( {
510
+ messages : [ { role : 'user' , content : 'Test error handling' } ] ,
511
+ tools : [ weatherTool ] ,
512
+ stream : true ,
513
+ } ) ;
514
+
515
+ handleRequest ( async ( ) => {
516
+ return new Response ( null , {
517
+ status : 400 ,
518
+ } ) ;
519
+ } ) ;
520
+ const iterator1 = runner [ Symbol . asyncIterator ] ( ) ;
521
+ await expectEvent ( iterator1 , async ( stream ) => {
522
+ await expect ( stream . finalMessage ( ) ) . rejects . toThrow ( '400' ) ;
523
+ } ) ;
524
+ await expect ( iterator1 . next ( ) ) . rejects . toThrow ( '400' ) ;
525
+ await expectDone ( iterator1 ) ;
526
+
527
+ // We let you consume the iterator again to continue the conversation when there is an error.
528
+ handleAssistantMessageStream ( getTextContent ( ) ) ;
529
+ const iterator2 = runner [ Symbol . asyncIterator ] ( ) ;
530
+ await expectEvent ( iterator2 , ( message ) => {
531
+ expect ( message . finalMessage ( ) ) . resolves . toMatchObject ( { content : [ getTextContent ( ) ] } ) ;
532
+ } ) ;
533
+ await expectDone ( iterator2 ) ;
534
+ } ) ;
535
+
508
536
it ( 'handles api errors' , async ( ) => {
509
537
const { runner, handleRequest, handleAssistantMessage } = setupTest ( {
510
538
messages : [ { role : 'user' , content : 'Test error handling' } ] ,
0 commit comments