From a3c2745ef49362482ab3c0c540e385416c901da0 Mon Sep 17 00:00:00 2001 From: kamilbenkirane Date: Tue, 24 Feb 2026 11:34:59 +0100 Subject: [PATCH] fix(openai): route streaming image edits to correct endpoint and format Streaming edits were hitting /v1/images/generations instead of /v1/images/edits and serializing the image as a flat string instead of the required images array format. --- src/celeste/providers/openai/images/client.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/celeste/providers/openai/images/client.py b/src/celeste/providers/openai/images/client.py index 367cbf0d..d8f084c3 100644 --- a/src/celeste/providers/openai/images/client.py +++ b/src/celeste/providers/openai/images/client.py @@ -11,7 +11,7 @@ from celeste.client import APIMixin from celeste.core import UsageField from celeste.io import FinishReason -from celeste.utils import detect_mime_type +from celeste.utils import build_image_data_url, detect_mime_type from . import config @@ -127,7 +127,7 @@ def _make_stream_request( endpoint: str | None = None, **parameters: Any, ) -> AsyncIterator[dict[str, Any]]: - """Make streaming request to OpenAI Images API generations endpoint. + """Make streaming request to OpenAI Images API. Streaming is only supported for gpt-image-1. """ @@ -137,6 +137,13 @@ def _make_stream_request( if "partial_images" not in request_body: request_body["partial_images"] = 1 + # Serialize ImageArtifact for JSON streaming edit + # Non-streaming uses multipart; streaming uses JSON with images array + if "image" in request_body and hasattr(request_body["image"], "get_base64"): + artifact = request_body.pop("image") + request_body["images"] = [{"image_url": build_image_data_url(artifact)}] + endpoint = config.OpenAIImagesEndpoint.CREATE_EDIT + headers = self._json_headers() return self.http_client.stream_post(