{"record":{"id":"b7e0459299b7e2fd","repo":"deepset-ai/haystack","slug":"for-openai-compatibility-a-chatmessage-with-a","errorCode":null,"errorMessage":"For OpenAI compatibility, a `ChatMessage` with a `ToolCallResult` cannot contain any other content.","messagePattern":"For OpenAI compatibility, a `ChatMessage` with a `ToolCallResult` cannot contain any other content\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"haystack/components/generators/chat/openai_responses.py","lineNumber":1001,"sourceCode":"                \"filename\": part.filename or \"filename\",\n                \"file_data\": f\"data:{part.mime_type or 'application/pdf'};base64,{part.base64_data}\",\n            }\n        raise ValueError(f\"Unsupported content type: {type(part)}\")\n\n    text_contents = message.texts\n    tool_calls = message.tool_calls\n    tool_call_results = message.tool_call_results\n    images = message.images\n    reasonings = message.reasonings\n    files = message.files\n\n    if not any([text_contents, tool_calls, tool_call_results, images, reasonings, files]):\n        raise ValueError(\n            \"\"\"A `ChatMessage` must contain at least one `TextContent`, `ToolCall`, `ToolCallResult`,\n              `ImageContent`, `FileContent`, or `ReasoningContent`.\"\"\"\n        )\n    if len(tool_call_results) > 0 and len(message._content) > 1:\n        raise ValueError(\n            \"For OpenAI compatibility, a `ChatMessage` with a `ToolCallResult` cannot contain any other content.\"\n        )\n\n    formatted_messages: list[dict[str, Any]] = []\n    openai_msg: dict[str, Any] = {\"role\": message._role.value}\n    if message._name is not None:\n        openai_msg[\"name\"] = message._name\n\n    # user message\n    if message._role.value == \"user\":\n        content = [convert_part(part) for part in message._content]\n        openai_msg[\"content\"] = content\n        return [openai_msg]\n\n    # tool message\n    if tool_call_results:\n        formatted_tool_results = []\n        for result in tool_call_results:","sourceCodeStart":983,"sourceCodeEnd":1019,"githubUrl":"https://github.com/deepset-ai/haystack/blob/e318778c9bf60a1963e3b5f451359655dd696c30/haystack/components/generators/chat/openai_responses.py#L983-L1019","documentation":"The OpenAI Responses API models tool results as standalone function_call_output items with no mixed content. haystack therefore rejects ChatMessages that contain a ToolCallResult together with any other content part (except a single one).","triggerScenarios":"Appending a ToolCallResult to a message that also has TextContent/ImageContent/etc., then passing it to OpenAIResponsesChatGenerator.","commonSituations":"Merging tool output and commentary in one message (a habit from other APIs like Anthropic or openai chat completions where tool role messages can mix).","solutions":["Put the ToolCallResult in its own ChatMessage with no other content","Move accompanying text into a separate assistant/user message","Rebuild the message: ChatMessage from only the ToolCallResult content"],"exampleFix":"// before\nmsg = ChatMessage(_role=role, _content=[tool_result, TextContent(text=\"done\")])\n// after\nmsg_tool = ChatMessage(_role=role, _content=[tool_result])\nmsg_text = ChatMessage.from_user(\"done\")","handlingStrategy":"validation","validationCode":"from haystack.dataclasses import ToolCallResult\nfor m in messages:\n    if any(isinstance(p, ToolCallResult) for p in m._content) and len(m._content) > 1:\n        raise ValueError(\"ToolCallResult must be alone in its message\")","typeGuard":"def is_tool_result_only(m) -> bool:\n    from haystack.dataclasses import ToolCallResult\n    return len(m._content) == 1 and isinstance(m._content[0], ToolCallResult)","tryCatchPattern":"try:\n    gen.run(messages=messages)\nexcept ValueError as e:\n    if \"ToolCallResult\" in str(e):\n        messages = split_tool_results_into_own_messages(messages)","preventionTips":["One ToolCallResult per message","Put commentary text in a separate message","Follow OpenAI Responses API tool-call semantics"],"tags":["python","haystack","openai","tool-result","responses-api"],"backgroundTag":"mixed-tool-result-content","analyzedSha":"e318778c9bf60a1963e3b5f451359655dd696c30","analyzedAt":"2026-08-30T11:45:20.711Z","schemaVersion":2},"datasetVersion":"2026-08-30T13:17:10.514Z"}