Compare commits

...
Author SHA1 Message Date
praisonai-triage-agent[bot]andMervin Praison 9e0f2e96a3 fix(llm): preserve image detail level in Responses API input
Chat Completions image_url objects can carry a 'detail' level (low/high/auto).
The Responses translation rebuilt each input_image using only its URL, dropping
the caller's requested detail. Forward 'detail' onto the input_image part.

Co-authored-by: Mervin Praison <[email protected]>
2026-08-14 19:47:59 +00:00
2 changed files with 28 additions and 5 deletions

No files matched your search

@@ -755,12 +755,14 @@ class OpenAIClient:
"text": part.get("text", ""),
})
elif part_type == "image_url":
responses_content.append({
image_url = part.get("image_url")
image_part: Dict[str, Any] = {
"type": "input_image",
"image_url": cls._normalise_responses_image_url(
part.get("image_url")
),
})
"image_url": cls._normalise_responses_image_url(image_url),
}
if isinstance(image_url, dict) and image_url.get("detail"):
image_part["detail"] = image_url["detail"]
responses_content.append(image_part)
elif part_type == "input_image":
item = dict(part)
item["image_url"] = cls._normalise_responses_image_url(
@@ -372,6 +372,27 @@ class TestOpenAIClientResponsesAPI:
],
}]
def test_build_responses_input_preserves_image_detail(self):
from praisonaiagents.llm.openai_client import OpenAIClient
client = OpenAIClient.__new__(OpenAIClient)
params = client._build_responses_input([{
"role": "user",
"content": [{
"type": "image_url",
"image_url": {
"url": "https://example.com/image.png",
"detail": "high",
},
}],
}], "gpt-4o-mini")
assert params["input"][0]["content"][0] == {
"type": "input_image",
"image_url": "https://example.com/image.png",
"detail": "high",
}
def test_build_responses_input_encodes_local_image(self, tmp_path):
from praisonaiagents.llm.openai_client import OpenAIClient