{"record":{"id":"3d8d7e54a072b09a","repo":"microsoft/semantic-kernel","slug":"invalid-output-message-type-type-output-message","errorCode":null,"errorMessage":"Invalid output message type: {type(output_message)}. Expected {self.t_out}.","messagePattern":"Invalid output message type: (.+?)\\. Expected (.+?)\\.","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"python/semantic_kernel/agents/orchestration/orchestration_base.py","lineNumber":339,"sourceCode":"    def _default_output_transform(self, output_message: DefaultTypeAlias) -> TOut:\n        \"\"\"Default output transform function.\n\n        This function transforms the internal output message to the external output message.\n        If the output message is already in the correct format, it is returned as is.\n\n        Args:\n            output_message (DefaultTypeAlias): The output message to be transformed.\n\n        Returns:\n            TOut: The transformed output message.\n        \"\"\"\n        if self.t_out == DefaultTypeAlias or self.t_out in get_args(DefaultTypeAlias):\n            if isinstance(output_message, ChatMessageContent) or (\n                isinstance(output_message, list)\n                and all(isinstance(item, ChatMessageContent) for item in output_message)\n            ):\n                return output_message  # type: ignore[return-value]\n            raise TypeError(f\"Invalid output message type: {type(output_message)}. Expected {self.t_out}.\")\n\n        if isinstance(output_message, ChatMessageContent):\n            return self.t_out(**json.loads(output_message.content))  # type: ignore[misc]\n\n        raise TypeError(f\"Unable to transform output message of type {type(output_message)} to {self.t_out}.\")\n","sourceCodeStart":321,"sourceCodeEnd":345,"githubUrl":"https://github.com/microsoft/semantic-kernel/blob/c028a0c7dc4f0814cdcbaba9d998f187a41197bf/python/semantic_kernel/agents/orchestration/orchestration_base.py#L321-L345","documentation":"Raised inside _default_output_transform when the orchestration's output type is the default alias (ChatMessageContent | list[ChatMessageContent]) but the actual internal output message is neither a single ChatMessageContent nor a homogeneous list of them. The default-output branch trusts that downstream actors produce chat content; any other shape is a programming error in the orchestration pipeline or a custom transform that returned the wrong type.","triggerScenarios":"The orchestration's t_out equals DefaultTypeAlias (or one of its args) and an internal actor, agent, or a user-supplied intermediate transform returned something that is not ChatMessageContent and not a list of ChatMessageContent. Also triggered by returning None, a tuple, a dict, or a pydantic model from a transform wired into the default-output path.","commonSituations":"Plugging a custom agent whose invoke returns StreamingChatMessageContent or a raw string into a default-output orchestration; a transform that accidentally returns a tuple instead of a list; mixing concurrent and sequential orchestration whose message shapes disagree.","solutions":["Ensure every component feeding the orchestration output returns ChatMessageContent or list[ChatMessageContent] when t_out is the default alias.","If you need a structured output type, set the orchestration generic/output type so it takes the typed branch instead (e.g. MyOrchestration[..., MyModel]) and supply an output_transform.","Inspect the value reported by type(output_message) in the error and fix the producing transform to return the correct shape.","Wrap non-chat returns: return ChatMessageContent(role=AuthorRole.ASSISTANT, content=json.dumps(obj))."],"exampleFix":"// before\nasync def my_output_transform(output):\n    return {\"text\": output.content}   # dict -> triggers [941]\n// after\nfrom semantic_kernel.contents import ChatMessageContent, AuthorRole\nasync def my_output_transform(output):\n    return ChatMessageContent(role=AuthorRole.ASSISTANT, content=output.content)","handlingStrategy":"type-guard","validationCode":"from semantic_kernel.contents import ChatMessageContent\n\ndef is_default_output(msg) -> bool:\n    if isinstance(msg, ChatMessageContent):\n        return True\n    return isinstance(msg, list) and all(isinstance(i, ChatMessageContent) for i in msg)","typeGuard":"from typing import Any\nfrom semantic_kernel.contents import ChatMessageContent\n\ndef is_chat_or_chat_list(value: Any) -> bool:\n    if isinstance(value, ChatMessageContent):\n        return True\n    return isinstance(value, list) and bool(value) and all(isinstance(i, ChatMessageContent) for i in value)","tryCatchPattern":"try:\n    out = await orchestration.invoke(...)\nexcept TypeError as e:\n    if \"Invalid output message type\" in str(e):\n        # fix upstream producer or supply an output_transform\n        raise\n    raise","preventionTips":["When t_out is the default alias, ensure all internal actors return ChatMessageContent or list of it.","Validate transforms with a small unit test that checks the returned shape.","Avoid returning None, tuples, dicts, or pydantic models from default-output transforms.","Use an explicit output_transform for structured outputs."],"tags":["orchestration","type-mismatch","message-transform","semantic-kernel"],"backgroundTag":null,"analyzedSha":"c028a0c7dc4f0814cdcbaba9d998f187a41197bf","analyzedAt":"2026-08-13T13:48:05.040Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}