diff --git a/comfy_execution/jobs.py b/comfy_execution/jobs.py index 4e5bd4273..6597fb0b2 100644 --- a/comfy_execution/jobs.py +++ b/comfy_execution/jobs.py @@ -10,9 +10,8 @@ class JobStatus: IN_PROGRESS = 'in_progress' COMPLETED = 'completed' FAILED = 'failed' - CANCELLED = 'cancelled' - ALL = [PENDING, IN_PROGRESS, COMPLETED, FAILED, CANCELLED] + ALL = [PENDING, IN_PROGRESS, COMPLETED, FAILED] # Media types that can be previewed in the frontend @@ -86,7 +85,7 @@ def normalize_history_item(prompt_id, history_item, include_outputs=False): else: status = JobStatus.COMPLETED - outputs = history_item.get('outputs', {}) + outputs = history_item.get('outputs') or {} outputs_count, preview_output = get_outputs_summary(outputs) execution_error = None @@ -150,6 +149,8 @@ def get_outputs_summary(outputs): continue for item in items: + if not isinstance(item, dict): + continue count += 1 if preview_output is None and is_previewable(media_type, item): diff --git a/server.py b/server.py index 65a25fd16..140f69c48 100644 --- a/server.py +++ b/server.py @@ -703,20 +703,23 @@ class PromptServer(): status_param = query.get("status", None) status_filter = None if status_param: - status_filter = [s.strip() for s in status_param.split(',') if s.strip()] + status_filter = [s.strip().lower() for s in status_param.split(',') if s.strip()] valid_statuses = set(JobStatus.ALL) - status_filter = [s for s in status_filter if s in valid_statuses] - if not status_filter: - status_filter = None + invalid_statuses = [s for s in status_filter if s not in valid_statuses] + if invalid_statuses: + return web.json_response( + {"error": f"Invalid status value(s): {', '.join(invalid_statuses)}. Valid values: {', '.join(JobStatus.ALL)}"}, + status=400 + ) - sort_by = query.get('sort_by', 'created_at') + sort_by = query.get('sort_by', 'created_at').lower() if sort_by not in {'created_at', 'execution_duration'}: return web.json_response( {"error": "sort_by must be 'created_at' or 'execution_duration'"}, status=400 ) - sort_order = query.get('sort_order', 'desc') + sort_order = query.get('sort_order', 'desc').lower() if sort_order not in {'asc', 'desc'}: return web.json_response( {"error": "sort_order must be 'asc' or 'desc'"}, diff --git a/tests/execution/test_jobs.py b/tests/execution/test_jobs.py index b01d26ecc..bedd142e6 100644 --- a/tests/execution/test_jobs.py +++ b/tests/execution/test_jobs.py @@ -19,7 +19,6 @@ class TestJobStatus: assert JobStatus.IN_PROGRESS == 'in_progress' assert JobStatus.COMPLETED == 'completed' assert JobStatus.FAILED == 'failed' - assert JobStatus.CANCELLED == 'cancelled' def test_all_contains_all_statuses(self): """ALL should contain all status values.""" @@ -27,8 +26,7 @@ class TestJobStatus: assert JobStatus.IN_PROGRESS in JobStatus.ALL assert JobStatus.COMPLETED in JobStatus.ALL assert JobStatus.FAILED in JobStatus.ALL - assert JobStatus.CANCELLED in JobStatus.ALL - assert len(JobStatus.ALL) == 5 + assert len(JobStatus.ALL) == 4 class TestIsPreviewable: