diff --git a/backend/open_webui/routers/openai.py b/backend/open_webui/routers/openai.py index e5c9f2e7e8..2e93d47e41 100644 --- a/backend/open_webui/routers/openai.py +++ b/backend/open_webui/routers/openai.py @@ -1092,8 +1092,13 @@ def convert_to_responses_payload(payload: dict) -> dict: content_parts.append({'type': text_type, 'text': part.get('text', '')}) elif part.get('type') == 'image_url': url_data = part.get('image_url', {}) - url = url_data.get('url', '') if isinstance(url_data, dict) else url_data - content_parts.append({'type': 'input_image', 'image_url': url}) + if isinstance(url_data, dict): + url = url_data.get('url', '') + detail = url_data.get('detail') or 'auto' + else: + url = url_data + detail = 'auto' + content_parts.append({'type': 'input_image', 'image_url': url, 'detail': detail}) else: content_parts = [{'type': text_type, 'text': str(content)}] diff --git a/backend/test/routers/test_openai.py b/backend/test/routers/test_openai.py new file mode 100644 index 0000000000..851e775482 --- /dev/null +++ b/backend/test/routers/test_openai.py @@ -0,0 +1,40 @@ +from copy import deepcopy + +from open_webui.routers.openai import convert_to_responses_payload + + +def _convert(image_url: object) -> dict: + payload = { + 'messages': [ + { + 'role': 'user', + 'content': [{'type': 'image_url', 'image_url': image_url}], + } + ] + } + result = convert_to_responses_payload(deepcopy(payload)) + return result['input'][0]['content'][0] + + +def test_image_object_without_detail_defaults_to_auto() -> None: + assert _convert({'url': 'data:image/png;base64,abc'}) == { + 'type': 'input_image', + 'image_url': 'data:image/png;base64,abc', + 'detail': 'auto', + } + + +def test_image_object_preserves_explicit_detail() -> None: + assert _convert({'url': 'https://example.test/image.png', 'detail': 'high'}) == { + 'type': 'input_image', + 'image_url': 'https://example.test/image.png', + 'detail': 'high', + } + + +def test_string_image_url_defaults_to_auto() -> None: + assert _convert('https://example.test/image.png') == { + 'type': 'input_image', + 'image_url': 'https://example.test/image.png', + 'detail': 'auto', + }