@@ -307,86 +307,89 @@ def is_active_line_chunk(chunk):
307
307
308
308
last_flag_base = None
309
309
310
- for chunk in respond (self ):
311
- # For async usage
312
- if hasattr (self , "stop_event" ) and self .stop_event .is_set ():
313
- break
314
-
315
- if chunk ["content" ] == "" :
316
- continue
317
-
318
- # Handle the special "confirmation" chunk, which neither triggers a flag or creates a message
319
- if chunk ["type" ] == "confirmation" :
320
- # Emit a end flag for the last message type, and reset last_flag_base
321
- if last_flag_base :
322
- yield {** last_flag_base , "end" : True }
323
- last_flag_base = None
324
-
325
- if self .auto_run == False :
326
- yield chunk
327
-
328
- # We want to append this now, so even if content is never filled, we know that the execution didn't produce output.
329
- # ... rethink this though.
330
- self .messages .append (
331
- {
332
- "role" : "computer" ,
333
- "type" : "console" ,
334
- "format" : "output" ,
335
- "content" : "" ,
336
- }
337
- )
338
- continue
339
-
340
- # Check if the chunk's role, type, and format (if present) match the last_flag_base
341
- if (
342
- last_flag_base
343
- and "role" in chunk
344
- and "type" in chunk
345
- and last_flag_base ["role" ] == chunk ["role" ]
346
- and last_flag_base ["type" ] == chunk ["type" ]
347
- and (
348
- "format" not in last_flag_base
349
- or (
350
- "format" in chunk
351
- and chunk ["format" ] == last_flag_base ["format" ]
310
+ try :
311
+ for chunk in respond (self ):
312
+ # For async usage
313
+ if hasattr (self , "stop_event" ) and self .stop_event .is_set ():
314
+ break
315
+
316
+ if chunk ["content" ] == "" :
317
+ continue
318
+
319
+ # Handle the special "confirmation" chunk, which neither triggers a flag or creates a message
320
+ if chunk ["type" ] == "confirmation" :
321
+ # Emit a end flag for the last message type, and reset last_flag_base
322
+ if last_flag_base :
323
+ yield {** last_flag_base , "end" : True }
324
+ last_flag_base = None
325
+
326
+ if self .auto_run == False :
327
+ yield chunk
328
+
329
+ # We want to append this now, so even if content is never filled, we know that the execution didn't produce output.
330
+ # ... rethink this though.
331
+ self .messages .append (
332
+ {
333
+ "role" : "computer" ,
334
+ "type" : "console" ,
335
+ "format" : "output" ,
336
+ "content" : "" ,
337
+ }
338
+ )
339
+ continue
340
+
341
+ # Check if the chunk's role, type, and format (if present) match the last_flag_base
342
+ if (
343
+ last_flag_base
344
+ and "role" in chunk
345
+ and "type" in chunk
346
+ and last_flag_base ["role" ] == chunk ["role" ]
347
+ and last_flag_base ["type" ] == chunk ["type" ]
348
+ and (
349
+ "format" not in last_flag_base
350
+ or (
351
+ "format" in chunk
352
+ and chunk ["format" ] == last_flag_base ["format" ]
353
+ )
354
+ )
355
+ ):
356
+ # If they match, append the chunk's content to the current message's content
357
+ # (Except active_line, which shouldn't be stored)
358
+ if not is_active_line_chunk (chunk ):
359
+ self .messages [- 1 ]["content" ] += chunk ["content" ]
360
+ else :
361
+ # If they don't match, yield a end message for the last message type and a start message for the new one
362
+ if last_flag_base :
363
+ yield {** last_flag_base , "end" : True }
364
+
365
+ last_flag_base = {"role" : chunk ["role" ], "type" : chunk ["type" ]}
366
+
367
+ # Don't add format to type: "console" flags, to accommodate active_line AND output formats
368
+ if "format" in chunk and chunk ["type" ] != "console" :
369
+ last_flag_base ["format" ] = chunk ["format" ]
370
+
371
+ yield {** last_flag_base , "start" : True }
372
+
373
+ # Add the chunk as a new message
374
+ if not is_active_line_chunk (chunk ):
375
+ self .messages .append (chunk )
376
+
377
+ # Yield the chunk itself
378
+ yield chunk
379
+
380
+ # Truncate output if it's console output
381
+ if chunk ["type" ] == "console" and chunk ["format" ] == "output" :
382
+ self .messages [- 1 ]["content" ] = truncate_output (
383
+ self .messages [- 1 ]["content" ],
384
+ self .max_output ,
385
+ add_scrollbars = self .computer .import_computer_api , # I consider scrollbars to be a computer API thing
352
386
)
353
- )
354
- ):
355
- # If they match, append the chunk's content to the current message's content
356
- # (Except active_line, which shouldn't be stored)
357
- if not is_active_line_chunk (chunk ):
358
- self .messages [- 1 ]["content" ] += chunk ["content" ]
359
- else :
360
- # If they don't match, yield a end message for the last message type and a start message for the new one
361
- if last_flag_base :
362
- yield {** last_flag_base , "end" : True }
363
-
364
- last_flag_base = {"role" : chunk ["role" ], "type" : chunk ["type" ]}
365
-
366
- # Don't add format to type: "console" flags, to accommodate active_line AND output formats
367
- if "format" in chunk and chunk ["type" ] != "console" :
368
- last_flag_base ["format" ] = chunk ["format" ]
369
-
370
- yield {** last_flag_base , "start" : True }
371
-
372
- # Add the chunk as a new message
373
- if not is_active_line_chunk (chunk ):
374
- self .messages .append (chunk )
375
-
376
- # Yield the chunk itself
377
- yield chunk
378
-
379
- # Truncate output if it's console output
380
- if chunk ["type" ] == "console" and chunk ["format" ] == "output" :
381
- self .messages [- 1 ]["content" ] = truncate_output (
382
- self .messages [- 1 ]["content" ],
383
- self .max_output ,
384
- add_scrollbars = self .computer .import_computer_api , # I consider scrollbars to be a computer API thing
385
- )
386
387
387
- # Yield a final end flag
388
- if last_flag_base :
389
- yield {** last_flag_base , "end" : True }
388
+ # Yield a final end flag
389
+ if last_flag_base :
390
+ yield {** last_flag_base , "end" : True }
391
+ except GeneratorExit :
392
+ pass # It's fine
390
393
391
394
def reset (self ):
392
395
self .computer .terminate () # Terminates all languages
0 commit comments