From dd2666d97b508bee9e135709ec4dd8c0b2bb805b Mon Sep 17 00:00:00 2001 From: CharlieX Date: Mon, 15 Jun 2026 13:41:49 -0700 Subject: [PATCH] fix(api): allow nested dicts in ChatMessage.content for multimodal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ChatMessage.content was typed Optional[Union[str, List[Dict[str, str]]]]. The OpenAI multimodal format nests a dict under image_url: {"type": "image_url", "image_url": {"url": "..."}} so Dict[str, str] fails validation and FastAPI returns 422 before the handler runs — every vision request is rejected at the schema layer. Widen the value type to Any (Dict[str, Any]) so multimodal content validates. Any is already imported. --- src/mlx_omni_server/chat/openai/schema.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mlx_omni_server/chat/openai/schema.py b/src/mlx_omni_server/chat/openai/schema.py index 3bf1536..095c7ea 100644 --- a/src/mlx_omni_server/chat/openai/schema.py +++ b/src/mlx_omni_server/chat/openai/schema.py @@ -81,7 +81,7 @@ class Role(str, Enum): class ChatMessage(BaseModel): role: Role - content: Optional[Union[str, List[Dict[str, str]]]] = None + content: Optional[Union[str, List[Dict[str, Any]]]] = None reasoning: Optional[str] = None name: Optional[str] = None tool_calls: Optional[List[ToolCall]] = None