diff --git a/dev/test_router_support.py b/dev/test_router_support.py index c7e8be2..8613174 100644 --- a/dev/test_router_support.py +++ b/dev/test_router_support.py @@ -156,6 +156,11 @@ class ImageEditMultipartTests(unittest.TestCase): 'Content-Disposition: form-data; name="prompt"\r\n\r\n' "Nur die Farbe ändern\r\n" ).encode(), + ( + f"--{boundary}\r\n" + 'Content-Disposition: form-data; name="n"\r\n\r\n' + "1\r\n" + ).encode(), ( f"--{boundary}\r\n" 'Content-Disposition: form-data; name="image[]"; filename="a.png"\r\n' @@ -174,6 +179,8 @@ class ImageEditMultipartTests(unittest.TestCase): self.assertEqual(fields["model"], "Qwen-Image-2.1-int8") self.assertEqual(fields["prompt"], "Nur die Farbe ändern") + normalized = handler._normalize_image_multipart_fields(fields) + self.assertEqual(normalized["n"], 1) self.assertEqual( files, [("image[]", "a.png", b"PNG-A"), diff --git a/router/ai_profile_router.py b/router/ai_profile_router.py index c3692d9..5e3285b 100755 --- a/router/ai_profile_router.py +++ b/router/ai_profile_router.py @@ -2229,6 +2229,7 @@ class Handler(BaseHTTPRequestHandler): try: body = self._read_body() files, data = self._parse_multipart_parts(body, content_type) + data = self._normalize_image_multipart_fields(data) except ValueError as exc: self._send_error(400, str(exc), "invalid_request_error", "invalid_multipart") @@ -2733,6 +2734,19 @@ class Handler(BaseHTTPRequestHandler): return files, fields + @staticmethod + def _normalize_image_multipart_fields(fields: dict[str, str]) -> dict: + """Konvertiert OpenAI-Formularzahlen in die JSON-API-Typen.""" + normalized: dict = dict(fields) + for key in ("n", "steps"): + if key not in normalized: + continue + try: + normalized[key] = int(normalized[key]) + except (TypeError, ValueError) as exc: + raise ValueError(f"'{key}' muss eine Ganzzahl sein") from exc + return normalized + def _parse_multipart(self, data: bytes, content_type: str ) -> tuple[bytes, str, dict]: """Kompatibler Einzeldatei-Wrapper für den STT-Pfad."""