Spaces:
Running
on
L4
Running
on
L4
def process_all_vision_info(messages, examples=None): | |
""" | |
Process vision information from both messages and in-context examples, supporting batch processing. | |
Args: | |
messages: List of message dictionaries (single input) OR list of message lists (batch input) | |
examples: Optional list of example dictionaries (single input) OR list of example lists (batch) | |
Returns: | |
A flat list of all images in the correct order: | |
- For single input: example images followed by message images | |
- For batch input: interleaved as (item1 examples, item1 input, item2 examples, item2 input, etc.) | |
- Returns None if no images were found | |
""" | |
from qwen_vl_utils import process_vision_info, fetch_image | |
# Helper function to extract images from examples | |
def extract_example_images(example_item): | |
if not example_item: | |
return [] | |
# Handle both list of examples and single example | |
examples_to_process = example_item if isinstance(example_item, list) else [example_item] | |
images = [] | |
for example in examples_to_process: | |
if isinstance(example.get('input'), dict) and example['input'].get('type') == 'image': | |
images.append(fetch_image(example['input'])) | |
return images | |
# Normalize inputs to always be batched format | |
is_batch = messages and isinstance(messages[0], list) | |
messages_batch = messages if is_batch else [messages] | |
is_batch_examples = examples and isinstance(examples, list) and (isinstance(examples[0], list) or examples[0] is None) | |
examples_batch = examples if is_batch_examples else ([examples] if examples is not None else None) | |
# Ensure examples batch matches messages batch if provided | |
if examples and len(examples_batch) != len(messages_batch): | |
if not is_batch and len(examples_batch) == 1: | |
# Single example set for a single input is fine | |
pass | |
else: | |
raise ValueError("Examples batch length must match messages batch length") | |
# Process all inputs, maintaining correct order | |
all_images = [] | |
for i, message_group in enumerate(messages_batch): | |
# Get example images for this input | |
if examples and i < len(examples_batch): | |
input_example_images = extract_example_images(examples_batch[i]) | |
all_images.extend(input_example_images) | |
# Get message images for this input | |
input_message_images = process_vision_info(message_group)[0] or [] | |
all_images.extend(input_message_images) | |
return all_images if all_images else None | |