{"record":{"id":"80606658a493683c","repo":"microsoft/autogen","slug":"unknown-message-type-m-gettype","errorCode":null,"errorMessage":"Unknown message type: {m.GetType()}","messagePattern":"Unknown message type: (.+?)","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"dotnet/src/AutoGen.OpenAI.V1/Extension/MessageExtension.cs","lineNumber":108,"sourceCode":"            }\n            else if (message is ToolCallResultMessage toolCallResult)\n            {\n                return toolCallResult.ToolCalls.Select(m =>\n                {\n                    var msg = new ChatRequestToolMessage(m.Result, m.FunctionName);\n\n                    return msg;\n                });\n            }\n            else if (message is MultiModalMessage multiModalMessage)\n            {\n                var messageContent = multiModalMessage.Content.Select<IMessage, ChatMessageContentItem>(m =>\n                {\n                    return m switch\n                    {\n                        TextMessage textMessage => new ChatMessageTextContentItem(textMessage.Content),\n                        ImageMessage imageMessage => new ChatMessageImageContentItem(new Uri(imageMessage.Url ?? imageMessage.BuildDataUri())),\n                        _ => throw new ArgumentException($\"Unknown message type: {m.GetType()}\")\n                    };\n                });\n\n                var msg = new ChatRequestUserMessage(messageContent);\n                return [msg];\n            }\n            else if (message is AggregateMessage<ToolCallMessage, ToolCallResultMessage> aggregateMessage)\n            {\n                // convert as user message\n                var resultMessage = aggregateMessage.Message2;\n                return resultMessage.ToolCalls.Select(m => new ChatRequestUserMessage(m.Result));\n            }\n            else if (message is Message msg)\n            {\n                if (msg.Role == Role.System)\n                {\n                    var systemMessage = new ChatRequestSystemMessage(msg.Content ?? string.Empty);\n                    return [systemMessage];","sourceCodeStart":90,"sourceCodeEnd":126,"githubUrl":"https://github.com/microsoft/autogen/blob/027ecf0a379bcc1d09956d46d12d44a3ad9cee14/dotnet/src/AutoGen.OpenAI.V1/Extension/MessageExtension.cs#L90-L126","documentation":"While flattening a MultiModalMessage into ChatMessageContentItem parts, this ArgumentException fires when an inner message of the multi-modal collection is neither TextMessage nor ImageMessage. Only text and image parts can map to OpenAI content items.","triggerScenarios":"Constructing MultiModalMessage.Content with a ToolCallMessage, another MultiModalMessage, or any custom IMessage implementation instead of TextMessage/ImageMessage elements.","commonSituations":"Programmatically aggregating mixed conversation turns into one multi-modal message; custom IMessage types introduced by user middleware leaking into multi-modal collections.","solutions":["Restrict MultiModalMessage.Content to TextMessage and ImageMessage instances only","Flatten nested structures (e.g. inner MultiModalMessage) into their text/image parts before building the outer message","Add an assert/validate step when composing multi-modal content dynamically"],"exampleFix":"// before\nvar mm = new MultiModalMessage(Role.User,\n    new IMessage[] { textMsg, imageMsg, otherAgentToolCall });\n\n// after\nvar mm = new MultiModalMessage(Role.User,\n    new IMessage[] { textMsg, imageMsg });\n// convert otherAgentToolCall to a TextMessage if its content matters","handlingStrategy":"type-guard","validationCode":"bool partsValid = multiModalMessage.Content.All(m => m is TextMessage or ImageMessage);","typeGuard":"static bool IsSupportedContentPart(IMessage m) => m is TextMessage or ImageMessage;","tryCatchPattern":"catch (ArgumentException ex) when (ex.Message.Contains(\"Unknown message type\"))\n{\n    var parts = mm.Content.OfType<TextMessage>().Select(t => t.Content);\n    return string.Join(\"\\n\", parts);\n}","preventionTips":["Only TextMessage/ImageMessage inside MultiModalMessage","Flatten nested multi-modal messages before composing","Validate content collections at construction"],"tags":["openai","multi-modal","message-type","validation"],"backgroundTag":null,"analyzedSha":"027ecf0a379bcc1d09956d46d12d44a3ad9cee14","analyzedAt":"2026-08-15T03:38:00.719Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}