{"record":{"id":"61e11a0343791b3b","repo":"microsoft/autogen","slug":"invalid-role-61e11a","errorCode":null,"errorMessage":"Invalid Role","messagePattern":"Invalid Role","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"dotnet/src/AutoGen.OpenAI.V1/Middleware/OpenAIChatRequestMessageConnector.cs","lineNumber":286,"sourceCode":"\n    private IEnumerable<ChatRequestMessage> ProcessTextMessage(IAgent agent, TextMessage message)\n    {\n        if (message.Role == Role.System)\n        {\n            return [new ChatRequestSystemMessage(message.Content) { Name = message.From }];\n        }\n\n        if (agent.Name == message.From)\n        {\n            return [new ChatRequestAssistantMessage(message.Content) { Name = agent.Name }];\n        }\n        else\n        {\n            return message.From switch\n            {\n                null when message.Role == Role.User => [new ChatRequestUserMessage(message.Content)],\n                null when message.Role == Role.Assistant => [new ChatRequestAssistantMessage(message.Content)],\n                null => throw new InvalidOperationException(\"Invalid Role\"),\n                _ => [new ChatRequestUserMessage(message.Content) { Name = message.From }]\n            };\n        }\n    }\n\n    private IEnumerable<ChatRequestMessage> ProcessImageMessage(IAgent agent, ImageMessage message)\n    {\n        if (agent.Name == message.From)\n        {\n            // image message from assistant is not supported\n            throw new ArgumentException(\"ImageMessage is not supported when message.From is the same with agent\");\n        }\n\n        var imageContentItem = this.CreateChatMessageImageContentItemFromImageMessage(message);\n        return [new ChatRequestUserMessage([imageContentItem]) { Name = message.From }];\n    }\n\n    private IEnumerable<ChatRequestMessage> ProcessMultiModalMessage(IAgent agent, MultiModalMessage message)","sourceCodeStart":268,"sourceCodeEnd":304,"githubUrl":"https://github.com/microsoft/autogen/blob/027ecf0a379bcc1d09956d46d12d44a3ad9cee14/dotnet/src/AutoGen.OpenAI.V1/Middleware/OpenAIChatRequestMessageConnector.cs#L268-L304","documentation":"Thrown by ProcessTextMessage when a TextMessage has From == null and a Role that is neither User nor Assistant (System is handled earlier, so this typically means Role.Tool or an unexpected role). The connector cannot decide whether to emit a ChatRequestUserMessage or ChatRequestAssistantMessage for an anonymous sender with an ambiguous role.","triggerScenarios":"Constructing new TextMessage(Role.Tool, ...) (or any non-User/Assistant/System role) without setting From, then sending it to an agent using this connector.","commonSituations":"Tool-result messages mistakenly created as TextMessage with Role.Tool instead of ToolCallResultMessage; role enums extended with custom values; messages built by generic code that leaves From unset.","solutions":["Set From on the TextMessage (any non-null value routes to ChatRequestUserMessage)","Use Role.User or Role.Assistant for anonymous text messages","Represent tool outputs as ToolCallResultMessage rather than TextMessage(Role.Tool, ...)"],"exampleFix":"// before\nvar msg = new TextMessage(Role.Tool, \"tool output\"); // From == null -> throws\n\n// after\nvar msg = new ToolCallResultMessage(toolCallId, \"tool output\", functionName, from: \"Tool\");","handlingStrategy":"validation","validationCode":"if (textMessage.From is null && textMessage.Role is not (Role.User or Role.Assistant or Role.System)) { /* set From or fix the role */ }","typeGuard":"static bool HasValidAnonymousRole(TextMessage m) => m.From is not null || m.Role is Role.User or Role.Assistant or Role.System;","tryCatchPattern":"catch (InvalidOperationException ex) when (ex.Message == \"Invalid Role\") { /* normalize role/from and retry once */ }","preventionTips":["Always set From on messages built programmatically","Use ToolCallResultMessage for tool outputs, never TextMessage(Role.Tool)","Validate message shape in a helper before sending"],"tags":["autogen","dotnet","azure-openai","role-mapping","validation"],"backgroundTag":null,"analyzedSha":"027ecf0a379bcc1d09956d46d12d44a3ad9cee14","analyzedAt":"2026-08-15T03:38:00.719Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}