This commit is contained in:
Deniz Şafak 2026-03-28 22:22:53 -04:00 committed by GitHub
commit 2134e05b0a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 49 additions and 7 deletions

View File

@ -223,11 +223,13 @@ def get_outputs_summary(outputs: dict) -> tuple[int, Optional[dict]]:
Preview priority (matching frontend): Preview priority (matching frontend):
1. type="output" with previewable media 1. type="output" with previewable media
2. Any previewable media 2. Any non-text previewable media
3. Text preview fallback
""" """
count = 0 count = 0
preview_output = None preview_output = None
fallback_preview = None fallback_preview = None
text_fallback_preview = None
for node_id, node_outputs in outputs.items(): for node_id, node_outputs in outputs.items():
if not isinstance(node_outputs, dict): if not isinstance(node_outputs, dict):
@ -245,7 +247,13 @@ def get_outputs_summary(outputs: dict) -> tuple[int, Optional[dict]]:
# Not a 3D file string — check for text preview # Not a 3D file string — check for text preview
if media_type == 'text': if media_type == 'text':
count += 1 count += 1
if preview_output is None: # Only create/store a text fallback when we don't yet
# have a primary preview or a non-text fallback.
if (
preview_output is None
and fallback_preview is None
and text_fallback_preview is None
):
if isinstance(item, tuple): if isinstance(item, tuple):
text_value = item[0] if item else '' text_value = item[0] if item else ''
else: else:
@ -256,8 +264,7 @@ def get_outputs_summary(outputs: dict) -> tuple[int, Optional[dict]]:
'nodeId': node_id, 'nodeId': node_id,
'mediaType': media_type 'mediaType': media_type
} }
if fallback_preview is None: text_fallback_preview = enriched
fallback_preview = enriched
continue continue
# normalize_output_item returned a dict (e.g. 3D file) # normalize_output_item returned a dict (e.g. 3D file)
item = normalized item = normalized
@ -276,10 +283,14 @@ def get_outputs_summary(outputs: dict) -> tuple[int, Optional[dict]]:
enriched['mediaType'] = media_type enriched['mediaType'] = media_type
if item.get('type') == 'output': if item.get('type') == 'output':
preview_output = enriched preview_output = enriched
elif fallback_preview is None: elif media_type != 'text':
fallback_preview = enriched # Prefer non-text media (images/video/audio/3d) over text fallback.
if fallback_preview is None:
fallback_preview = enriched
elif fallback_preview is None and text_fallback_preview is None:
text_fallback_preview = enriched
return count, preview_output or fallback_preview return count, preview_output or fallback_preview or text_fallback_preview
def apply_sorting(jobs: list[dict], sort_by: str, sort_order: str) -> list[dict]: def apply_sorting(jobs: list[dict], sort_by: str, sort_order: str) -> list[dict]:

View File

@ -136,6 +136,37 @@ class TestGetOutputsSummary:
count, preview = get_outputs_summary(outputs) count, preview = get_outputs_summary(outputs)
assert preview['filename'] == 'temp1.png' assert preview['filename'] == 'temp1.png'
def test_text_preview_does_not_override_image_fallback(self):
"""Text output should not take precedence over image fallback previews."""
outputs = {
'node1': {
'text': ['debug text from PreviewAny']
},
'node2': {
'images': [
{'filename': 'temp1.png', 'type': 'temp'}
]
}
}
count, preview = get_outputs_summary(outputs)
assert count == 2
assert preview is not None
assert preview['mediaType'] == 'images'
assert preview['filename'] == 'temp1.png'
def test_text_fallback_used_when_only_text_exists(self):
"""Text preview should still be used when no non-text previewable outputs exist."""
outputs = {
'node1': {
'text': ['debug text from PreviewAny']
}
}
count, preview = get_outputs_summary(outputs)
assert count == 1
assert preview is not None
assert preview['mediaType'] == 'text'
assert preview['content'] == 'debug text from PreviewAny'
def test_non_previewable_media_types_counted_but_no_preview(self): def test_non_previewable_media_types_counted_but_no_preview(self):
"""Non-previewable media types should be counted but not used as preview.""" """Non-previewable media types should be counted but not used as preview."""
outputs = { outputs = {