{"record":{"id":"c726d3bbe979b47d","repo":"microsoft/autogen","slug":"unknown-content-type-part-c726d3","errorCode":null,"errorMessage":"Unknown content type: {part}","messagePattern":"Unknown content type: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/packages/autogen-ext/src/autogen_ext/models/ollama/_ollama_client.py","lineNumber":187,"sourceCode":"                # name=message.source, # TODO: No name parameter in Ollama\n            )\n        ]\n    else:\n        ollama_messages: List[Message] = []\n        for part in message.content:\n            if isinstance(part, str):\n                ollama_messages.append(Message(content=part, role=\"user\"))\n            elif isinstance(part, Image):\n                # TODO: should images go into their own message? Should each image get its own message?\n                if not ollama_messages:\n                    ollama_messages.append(Message(role=\"user\", images=[OllamaImage(value=part.to_base64())]))\n                else:\n                    if ollama_messages[-1].images is None:\n                        ollama_messages[-1].images = [OllamaImage(value=part.to_base64())]\n                    else:\n                        ollama_messages[-1].images.append(OllamaImage(value=part.to_base64()))  # type: ignore\n            else:\n                raise ValueError(f\"Unknown content type: {part}\")\n        return ollama_messages\n\n\ndef system_message_to_ollama(message: SystemMessage) -> Message:\n    return Message(\n        content=message.content,\n        role=\"system\",\n    )\n\n\ndef _func_args_to_ollama_args(args: str) -> Dict[str, Any]:\n    return json.loads(args)  # type: ignore\n\n\ndef func_call_to_ollama(message: FunctionCall) -> Message.ToolCall:\n    return Message.ToolCall(\n        function=Message.ToolCall.Function(\n            name=message.name,","sourceCodeStart":169,"sourceCodeEnd":205,"githubUrl":"https://github.com/microsoft/autogen/blob/027ecf0a379bcc1d09956d46d12d44a3ad9cee14/python/packages/autogen-ext/src/autogen_ext/models/ollama/_ollama_client.py#L169-L205","documentation":"In _ollama_client.py's message conversion, each part of a list-content user message must be either a str or an autogen_core Image. Any other object (float, dict, a different image class, None) hits the else and raises ValueError with the offending part. The check is per-part, so a single bad element poisons the whole message.","triggerScenarios":"UserMessage(content=['hi', 123]) or content=['text', {'type': 'image_url', ...}] (raw OpenAI-style part dicts); mixing in a PIL.Image or numpy array instead of autogen_core.models.Image; None entries from conditional part building.","commonSituations":"Translating OpenAI multi-part format directly instead of using Image.from_pil()/from_file; building content lists with appends that sometimes append falsy/None; a different library's Image type leaking into the message.","solutions":["Wrap binary images with autogen_core Image: Image.from_pil(pil_img) or Image.from_file('x.png')","Filter/normalize parts before sending: keep only str and Image instances","Replace OpenAI-style part dicts with the corresponding str/Image values"],"exampleFix":"# before\ncontent = [\"describe\", {\"type\": \"image_url\", \"image_url\": {\"url\": uri}}]\nmsg = UserMessage(content=content, source=\"user\")\n\n# after\nfrom autogen_core.models import Image\ncontent = [\"describe\", Image.from_file(image_path)]\nmsg = UserMessage(content=content, source=\"user\")","handlingStrategy":"validation","validationCode":"from autogen_core.models import Image\n\ndef sanitize_parts(parts: Sequence[object]) -> list[str | Image]:\n    out: list[str | Image] = []\n    for p in parts:\n        if isinstance(p, (str, Image)):\n            out.append(p)\n        else:\n            raise TypeError(f\"Unsupported content part: {type(p)!r}\")\n    return out\n\nmsg = UserMessage(content=sanitize_parts(raw_parts), source=\"user\")","typeGuard":"def is_valid_content_part(p: object) -> TypeGuard[str | Image]:\n    return isinstance(p, (str, Image))","tryCatchPattern":"try:\n    result = await client.create([msg])\nexcept ValueError as e:\n    if \"Unknown content type\" in str(e):\n        msg = UserMessage(content=[p for p in msg.content if is_valid_content_part(p)], source=\"user\")\n        result = await client.create([msg])\n    else:\n        raise","preventionTips":["Always construct image parts with autogen_core Image.from_pil/from_file, never raw dicts or PIL objects","Filter content lists at the boundary of your message-builder module","Add a unit test that every emitted message part is str or Image"],"tags":["ollama","multimodal","vision","messages","validation"],"backgroundTag":null,"analyzedSha":"027ecf0a379bcc1d09956d46d12d44a3ad9cee14","analyzedAt":"2026-08-15T03:38:00.719Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}