Skip to content

Commit cd1d30a

Browse files
fix(api): return HTTP errors from session queue handlers
1 parent 7363384 commit cd1d30a

File tree

1 file changed

+111
-44
lines changed

1 file changed

+111
-44
lines changed

invokeai/app/api/routers/session_queue.py

Lines changed: 111 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from typing import Optional
22

3-
from fastapi import Body, Path, Query
3+
from fastapi import Body, HTTPException, Path, Query
44
from fastapi.routing import APIRouter
55
from pydantic import BaseModel, Field
66

@@ -22,6 +22,7 @@
2222
RetryItemsResult,
2323
SessionQueueCountsByDestination,
2424
SessionQueueItem,
25+
SessionQueueItemNotFoundError,
2526
SessionQueueStatus,
2627
)
2728
from invokeai.app.services.shared.pagination import CursorPaginatedResults
@@ -59,10 +60,12 @@ async def enqueue_batch(
5960
),
6061
) -> EnqueueBatchResult:
6162
"""Processes a batch and enqueues the output graphs for execution."""
62-
63-
return await ApiDependencies.invoker.services.session_queue.enqueue_batch(
64-
queue_id=queue_id, batch=batch, prepend=prepend
65-
)
63+
try:
64+
return await ApiDependencies.invoker.services.session_queue.enqueue_batch(
65+
queue_id=queue_id, batch=batch, prepend=prepend
66+
)
67+
except Exception as e:
68+
raise HTTPException(status_code=500, detail=f"Unexpected error while enqueuing batch: {e}")
6669

6770

6871
@session_queue_router.get(
@@ -82,14 +85,17 @@ async def list_queue_items(
8285
) -> CursorPaginatedResults[SessionQueueItem]:
8386
"""Gets cursor-paginated queue items"""
8487

85-
return ApiDependencies.invoker.services.session_queue.list_queue_items(
86-
queue_id=queue_id,
87-
limit=limit,
88-
status=status,
89-
cursor=cursor,
90-
priority=priority,
91-
destination=destination,
92-
)
88+
try:
89+
return ApiDependencies.invoker.services.session_queue.list_queue_items(
90+
queue_id=queue_id,
91+
limit=limit,
92+
status=status,
93+
cursor=cursor,
94+
priority=priority,
95+
destination=destination,
96+
)
97+
except Exception as e:
98+
raise HTTPException(status_code=500, detail=f"Unexpected error while listing all items: {e}")
9399

94100

95101
@session_queue_router.get(
@@ -104,11 +110,13 @@ async def list_all_queue_items(
104110
destination: Optional[str] = Query(default=None, description="The destination of queue items to fetch"),
105111
) -> list[SessionQueueItem]:
106112
"""Gets all queue items"""
107-
108-
return ApiDependencies.invoker.services.session_queue.list_all_queue_items(
113+
try:
114+
return ApiDependencies.invoker.services.session_queue.list_all_queue_items(
109115
queue_id=queue_id,
110116
destination=destination,
111117
)
118+
except Exception as e:
119+
raise HTTPException(status_code=500, detail=f"Unexpected error while listing all queue items: {e}")
112120

113121

114122
@session_queue_router.put(
@@ -120,7 +128,10 @@ async def resume(
120128
queue_id: str = Path(description="The queue id to perform this operation on"),
121129
) -> SessionProcessorStatus:
122130
"""Resumes session processor"""
123-
return ApiDependencies.invoker.services.session_processor.resume()
131+
try:
132+
return ApiDependencies.invoker.services.session_processor.resume()
133+
except Exception as e:
134+
raise HTTPException(status_code=500, detail=f"Unexpected error while resuming queue: {e}")
124135

125136

126137
@session_queue_router.put(
@@ -132,7 +143,10 @@ async def Pause(
132143
queue_id: str = Path(description="The queue id to perform this operation on"),
133144
) -> SessionProcessorStatus:
134145
"""Pauses session processor"""
135-
return ApiDependencies.invoker.services.session_processor.pause()
146+
try:
147+
return ApiDependencies.invoker.services.session_processor.pause()
148+
except Exception as e:
149+
raise HTTPException(status_code=500, detail=f"Unexpected error while pausing queue: {e}")
136150

137151

138152
@session_queue_router.put(
@@ -144,7 +158,10 @@ async def cancel_all_except_current(
144158
queue_id: str = Path(description="The queue id to perform this operation on"),
145159
) -> CancelAllExceptCurrentResult:
146160
"""Immediately cancels all queue items except in-processing items"""
147-
return ApiDependencies.invoker.services.session_queue.cancel_all_except_current(queue_id=queue_id)
161+
try:
162+
return ApiDependencies.invoker.services.session_queue.cancel_all_except_current(queue_id=queue_id)
163+
except Exception as e:
164+
raise HTTPException(status_code=500, detail=f"Unexpected error while canceling all except current: {e}")
148165

149166

150167
@session_queue_router.put(
@@ -156,7 +173,10 @@ async def delete_all_except_current(
156173
queue_id: str = Path(description="The queue id to perform this operation on"),
157174
) -> DeleteAllExceptCurrentResult:
158175
"""Immediately deletes all queue items except in-processing items"""
159-
return ApiDependencies.invoker.services.session_queue.delete_all_except_current(queue_id=queue_id)
176+
try:
177+
return ApiDependencies.invoker.services.session_queue.delete_all_except_current(queue_id=queue_id)
178+
except Exception as e:
179+
raise HTTPException(status_code=500, detail=f"Unexpected error while deleting all except current: {e}")
160180

161181

162182
@session_queue_router.put(
@@ -169,7 +189,10 @@ async def cancel_by_batch_ids(
169189
batch_ids: list[str] = Body(description="The list of batch_ids to cancel all queue items for", embed=True),
170190
) -> CancelByBatchIDsResult:
171191
"""Immediately cancels all queue items from the given batch ids"""
172-
return ApiDependencies.invoker.services.session_queue.cancel_by_batch_ids(queue_id=queue_id, batch_ids=batch_ids)
192+
try:
193+
return ApiDependencies.invoker.services.session_queue.cancel_by_batch_ids(queue_id=queue_id, batch_ids=batch_ids)
194+
except Exception as e:
195+
raise HTTPException(status_code=500, detail=f"Unexpected error while canceling by batch id: {e}")
173196

174197

175198
@session_queue_router.put(
@@ -182,9 +205,12 @@ async def cancel_by_destination(
182205
destination: str = Query(description="The destination to cancel all queue items for"),
183206
) -> CancelByDestinationResult:
184207
"""Immediately cancels all queue items with the given origin"""
185-
return ApiDependencies.invoker.services.session_queue.cancel_by_destination(
186-
queue_id=queue_id, destination=destination
187-
)
208+
try:
209+
return ApiDependencies.invoker.services.session_queue.cancel_by_destination(
210+
queue_id=queue_id, destination=destination
211+
)
212+
except Exception as e:
213+
raise HTTPException(status_code=500, detail=f"Unexpected error while canceling by destination: {e}")
188214

189215

190216
@session_queue_router.put(
@@ -197,7 +223,10 @@ async def retry_items_by_id(
197223
item_ids: list[int] = Body(description="The queue item ids to retry"),
198224
) -> RetryItemsResult:
199225
"""Immediately cancels all queue items with the given origin"""
200-
return ApiDependencies.invoker.services.session_queue.retry_items_by_id(queue_id=queue_id, item_ids=item_ids)
226+
try:
227+
return ApiDependencies.invoker.services.session_queue.retry_items_by_id(queue_id=queue_id, item_ids=item_ids)
228+
except Exception as e:
229+
raise HTTPException(status_code=500, detail=f"Unexpected error while retrying queue items: {e}")
201230

202231

203232
@session_queue_router.put(
@@ -211,11 +240,14 @@ async def clear(
211240
queue_id: str = Path(description="The queue id to perform this operation on"),
212241
) -> ClearResult:
213242
"""Clears the queue entirely, immediately canceling the currently-executing session"""
214-
queue_item = ApiDependencies.invoker.services.session_queue.get_current(queue_id)
215-
if queue_item is not None:
216-
ApiDependencies.invoker.services.session_queue.cancel_queue_item(queue_item.item_id)
217-
clear_result = ApiDependencies.invoker.services.session_queue.clear(queue_id)
218-
return clear_result
243+
try:
244+
queue_item = ApiDependencies.invoker.services.session_queue.get_current(queue_id)
245+
if queue_item is not None:
246+
ApiDependencies.invoker.services.session_queue.cancel_queue_item(queue_item.item_id)
247+
clear_result = ApiDependencies.invoker.services.session_queue.clear(queue_id)
248+
return clear_result
249+
except Exception as e:
250+
raise HTTPException(status_code=500, detail=f"Unexpected error while clearing queue: {e}")
219251

220252

221253
@session_queue_router.put(
@@ -229,7 +261,10 @@ async def prune(
229261
queue_id: str = Path(description="The queue id to perform this operation on"),
230262
) -> PruneResult:
231263
"""Prunes all completed or errored queue items"""
232-
return ApiDependencies.invoker.services.session_queue.prune(queue_id)
264+
try:
265+
return ApiDependencies.invoker.services.session_queue.prune(queue_id)
266+
except Exception as e:
267+
raise HTTPException(status_code=500, detail=f"Unexpected error while pruning queue: {e}")
233268

234269

235270
@session_queue_router.get(
@@ -243,7 +278,10 @@ async def get_current_queue_item(
243278
queue_id: str = Path(description="The queue id to perform this operation on"),
244279
) -> Optional[SessionQueueItem]:
245280
"""Gets the currently execution queue item"""
246-
return ApiDependencies.invoker.services.session_queue.get_current(queue_id)
281+
try:
282+
return ApiDependencies.invoker.services.session_queue.get_current(queue_id)
283+
except Exception as e:
284+
raise HTTPException(status_code=500, detail=f"Unexpected error while getting current queue item: {e}")
247285

248286

249287
@session_queue_router.get(
@@ -257,7 +295,10 @@ async def get_next_queue_item(
257295
queue_id: str = Path(description="The queue id to perform this operation on"),
258296
) -> Optional[SessionQueueItem]:
259297
"""Gets the next queue item, without executing it"""
260-
return ApiDependencies.invoker.services.session_queue.get_next(queue_id)
298+
try:
299+
return ApiDependencies.invoker.services.session_queue.get_next(queue_id)
300+
except Exception as e:
301+
raise HTTPException(status_code=500, detail=f"Unexpected error while getting next queue item: {e}")
261302

262303

263304
@session_queue_router.get(
@@ -271,9 +312,13 @@ async def get_queue_status(
271312
queue_id: str = Path(description="The queue id to perform this operation on"),
272313
) -> SessionQueueAndProcessorStatus:
273314
"""Gets the status of the session queue"""
274-
queue = ApiDependencies.invoker.services.session_queue.get_queue_status(queue_id)
275-
processor = ApiDependencies.invoker.services.session_processor.get_status()
276-
return SessionQueueAndProcessorStatus(queue=queue, processor=processor)
315+
try:
316+
queue = ApiDependencies.invoker.services.session_queue.get_queue_status(queue_id)
317+
processor = ApiDependencies.invoker.services.session_processor.get_status()
318+
return SessionQueueAndProcessorStatus(queue=queue, processor=processor)
319+
except Exception as e:
320+
raise HTTPException(status_code=500, detail=f"Unexpected error while getting queue status: {e}")
321+
277322

278323

279324
@session_queue_router.get(
@@ -288,7 +333,11 @@ async def get_batch_status(
288333
batch_id: str = Path(description="The batch to get the status of"),
289334
) -> BatchStatus:
290335
"""Gets the status of the session queue"""
291-
return ApiDependencies.invoker.services.session_queue.get_batch_status(queue_id=queue_id, batch_id=batch_id)
336+
try:
337+
return ApiDependencies.invoker.services.session_queue.get_batch_status(queue_id=queue_id, batch_id=batch_id)
338+
except Exception as e:
339+
raise HTTPException(status_code=500, detail=f"Unexpected error while getting batch status: {e}")
340+
292341

293342

294343
@session_queue_router.get(
@@ -304,7 +353,12 @@ async def get_queue_item(
304353
item_id: int = Path(description="The queue item to get"),
305354
) -> SessionQueueItem:
306355
"""Gets a queue item"""
307-
return ApiDependencies.invoker.services.session_queue.get_queue_item(item_id)
356+
try:
357+
return ApiDependencies.invoker.services.session_queue.get_queue_item(item_id)
358+
except SessionQueueItemNotFoundError:
359+
raise HTTPException(status_code=404, detail=f"Queue item with id {item_id} not found in queue {queue_id}")
360+
except Exception as e:
361+
raise HTTPException(status_code=500, detail=f"Unexpected error while fetching queue item: {e}")
308362

309363

310364
@session_queue_router.delete(
@@ -316,7 +370,10 @@ async def delete_queue_item(
316370
item_id: int = Path(description="The queue item to delete"),
317371
) -> None:
318372
"""Deletes a queue item"""
319-
ApiDependencies.invoker.services.session_queue.delete_queue_item(item_id)
373+
try:
374+
ApiDependencies.invoker.services.session_queue.delete_queue_item(item_id)
375+
except Exception as e:
376+
raise HTTPException(status_code=500, detail=f"Unexpected error while deleting queue item: {e}")
320377

321378

322379
@session_queue_router.put(
@@ -331,8 +388,12 @@ async def cancel_queue_item(
331388
item_id: int = Path(description="The queue item to cancel"),
332389
) -> SessionQueueItem:
333390
"""Deletes a queue item"""
334-
335-
return ApiDependencies.invoker.services.session_queue.cancel_queue_item(item_id)
391+
try:
392+
return ApiDependencies.invoker.services.session_queue.cancel_queue_item(item_id)
393+
except SessionQueueItemNotFoundError:
394+
raise HTTPException(status_code=404, detail=f"Queue item with id {item_id} not found in queue {queue_id}")
395+
except Exception as e:
396+
raise HTTPException(status_code=500, detail=f"Unexpected error while canceling queue item: {e}")
336397

337398

338399
@session_queue_router.get(
@@ -345,9 +406,12 @@ async def counts_by_destination(
345406
destination: str = Query(description="The destination to query"),
346407
) -> SessionQueueCountsByDestination:
347408
"""Gets the counts of queue items by destination"""
348-
return ApiDependencies.invoker.services.session_queue.get_counts_by_destination(
409+
try:
410+
return ApiDependencies.invoker.services.session_queue.get_counts_by_destination(
349411
queue_id=queue_id, destination=destination
350412
)
413+
except Exception as e:
414+
raise HTTPException(status_code=500, detail=f"Unexpected error while fetching counts by destination: {e}")
351415

352416

353417
@session_queue_router.delete(
@@ -360,6 +424,9 @@ async def delete_by_destination(
360424
destination: str = Path(description="The destination to query"),
361425
) -> DeleteByDestinationResult:
362426
"""Deletes all items with the given destination"""
363-
return ApiDependencies.invoker.services.session_queue.delete_by_destination(
364-
queue_id=queue_id, destination=destination
365-
)
427+
try:
428+
return ApiDependencies.invoker.services.session_queue.delete_by_destination(
429+
queue_id=queue_id, destination=destination
430+
)
431+
except Exception as e:
432+
raise HTTPException(status_code=500, detail=f"Unexpected error while deleting by destination: {e}")

0 commit comments

Comments
 (0)