@@ -82,10 +82,18 @@ async def _handle_complete_event(self, event: FastAPIEvent) -> None:
82
82
async def _handle_error_event (self , event : FastAPIEvent ) -> None :
83
83
try :
84
84
item_id = event [1 ]["data" ]["queue_item_id" ]
85
- error = event [1 ]["data" ]["error" ]
85
+ error_type = event [1 ]["data" ]["error_type" ]
86
+ error_message = event [1 ]["data" ]["error_message" ]
87
+ error_traceback = event [1 ]["data" ]["error_traceback" ]
86
88
queue_item = self .get_queue_item (item_id )
87
89
# always set to failed if have an error, even if previously the item was marked completed or canceled
88
- queue_item = self ._set_queue_item_status (item_id = queue_item .item_id , status = "failed" , error = error )
90
+ queue_item = self ._set_queue_item_status (
91
+ item_id = queue_item .item_id ,
92
+ status = "failed" ,
93
+ error_type = error_type ,
94
+ error_message = error_message ,
95
+ error_traceback = error_traceback ,
96
+ )
89
97
except SessionQueueItemNotFoundError :
90
98
return
91
99
@@ -272,17 +280,22 @@ def get_current(self, queue_id: str) -> Optional[SessionQueueItem]:
272
280
return SessionQueueItem .queue_item_from_dict (dict (result ))
273
281
274
282
def _set_queue_item_status (
275
- self , item_id : int , status : QUEUE_ITEM_STATUS , error : Optional [str ] = None
283
+ self ,
284
+ item_id : int ,
285
+ status : QUEUE_ITEM_STATUS ,
286
+ error_type : Optional [str ] = None ,
287
+ error_message : Optional [str ] = None ,
288
+ error_traceback : Optional [str ] = None ,
276
289
) -> SessionQueueItem :
277
290
try :
278
291
self .__lock .acquire ()
279
292
self .__cursor .execute (
280
293
"""--sql
281
294
UPDATE session_queue
282
- SET status = ?, error = ?
295
+ SET status = ?, error_type = ?, error_message = ?, error_traceback = ?
283
296
WHERE item_id = ?
284
297
""" ,
285
- (status , error , item_id ),
298
+ (status , error_type , error_message , error_traceback , item_id ),
286
299
)
287
300
self .__conn .commit ()
288
301
except Exception :
@@ -425,11 +438,34 @@ def prune(self, queue_id: str) -> PruneResult:
425
438
self .__lock .release ()
426
439
return PruneResult (deleted = count )
427
440
428
- def cancel_queue_item (self , item_id : int , error : Optional [ str ] = None ) -> SessionQueueItem :
441
+ def cancel_queue_item (self , item_id : int ) -> SessionQueueItem :
429
442
queue_item = self .get_queue_item (item_id )
430
443
if queue_item .status not in ["canceled" , "failed" , "completed" ]:
431
- status = "failed" if error is not None else "canceled"
432
- queue_item = self ._set_queue_item_status (item_id = item_id , status = status , error = error ) # type: ignore [arg-type] # mypy seems to not narrow the Literals here
444
+ queue_item = self ._set_queue_item_status (item_id = item_id , status = "canceled" )
445
+ self .__invoker .services .events .emit_session_canceled (
446
+ queue_item_id = queue_item .item_id ,
447
+ queue_id = queue_item .queue_id ,
448
+ queue_batch_id = queue_item .batch_id ,
449
+ graph_execution_state_id = queue_item .session_id ,
450
+ )
451
+ return queue_item
452
+
453
+ def fail_queue_item (
454
+ self ,
455
+ item_id : int ,
456
+ error_type : str ,
457
+ error_message : str ,
458
+ error_traceback : str ,
459
+ ) -> SessionQueueItem :
460
+ queue_item = self .get_queue_item (item_id )
461
+ if queue_item .status not in ["canceled" , "failed" , "completed" ]:
462
+ queue_item = self ._set_queue_item_status (
463
+ item_id = item_id ,
464
+ status = "failed" ,
465
+ error_type = error_type ,
466
+ error_message = error_message ,
467
+ error_traceback = error_traceback ,
468
+ )
433
469
self .__invoker .services .events .emit_session_canceled (
434
470
queue_item_id = queue_item .item_id ,
435
471
queue_id = queue_item .queue_id ,
@@ -602,7 +638,9 @@ def list_queue_items(
602
638
status,
603
639
priority,
604
640
field_values,
605
- error,
641
+ error_type,
642
+ error_message,
643
+ error_traceback,
606
644
created_at,
607
645
updated_at,
608
646
completed_at,
0 commit comments