{"record":{"id":"4cd278555d47d743","repo":"microsoft/semantic-kernel","slug":"bedrock-agents-must-be-invoked-with-a-user-message","errorCode":null,"errorMessage":"Bedrock agents must be invoked with a user message","messagePattern":"Bedrock agents must be invoked with a user message","errorType":"validation","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"dotnet/src/Agents/Bedrock/BedrockAgent.cs","lineNumber":550,"sourceCode":"        string agentAlias = WorkingDraftAgentAlias;\n        bool enableTrace = false;\n        if (options is BedrockAgentInvokeOptions bedrockOption)\n        {\n            agentAlias = bedrockOption.AgentAliasId ?? WorkingDraftAgentAlias;\n            enableTrace = bedrockOption.EnableTrace;\n        }\n\n        var invokeRequest = createRequest();\n        invokeRequest.AgentAliasId = agentAlias;\n        invokeRequest.EnableTrace = enableTrace;\n        return invokeRequest;\n    }\n\n    private string ExtractUserMessage(ChatMessageContent chatMessageContent)\n    {\n        if (!chatMessageContent.Role.Equals(AuthorRole.User))\n        {\n            throw new InvalidOperationException(\"Bedrock agents must be invoked with a user message\");\n        }\n\n        return chatMessageContent.Content ?? \"\";\n    }\n\n    private SessionState ExtractSessionState(ICollection<ChatMessageContent> messages)\n    {\n        // If there is more than one message provided, add all but the last message to the session state\n        SessionState sessionState = new();\n        if (messages.Count > 1)\n        {\n            List<Amazon.BedrockAgentRuntime.Model.Message> messageHistory = [];\n            for (int i = 0; i < messages.Count - 1; i++)\n            {\n                var currentMessage = messages.ElementAt(i);\n                messageHistory.Add(this.ToBedrockMessage(currentMessage));\n            }\n","sourceCodeStart":532,"sourceCodeEnd":568,"githubUrl":"https://github.com/microsoft/semantic-kernel/blob/c028a0c7dc4f0814cdcbaba9d998f187a41197bf/dotnet/src/Agents/Bedrock/BedrockAgent.cs#L532-L568","documentation":"Thrown by BedrockAgent.ExtractUserMessage when the message's role is not AuthorRole.User. Bedrock agents expect the final/invoking message to be a user message; assistant or system messages in that slot are rejected. This validates the last message before sending it as the agent input.","triggerScenarios":"The message passed as the primary input to ExtractUserMessage has Role equal to Assistant, System, Tool, or anything other than User.","commonSituations":"Caller appended an assistant follow-up as the last message by mistake; message history ordering put a non-user message last; tool/result message placed in the user slot.","solutions":["Ensure the last message in the collection has Role == AuthorRole.User.","If the latest turn is an assistant reply, append a user turn (even a continuation prompt) before invoking."],"exampleFix":"// before\nvar messages = new List<ChatMessageContent>\n{\n    new(AuthorRole.User, \"hi\"),\n    new(AuthorRole.Assistant, \"hello!\"), // last is assistant -> throws 177\n};\nawait agent.InvokeAsync(messages);\n\n// after\nmessages.Add(new(AuthorRole.User, \"tell me more\"));\nawait agent.InvokeAsync(messages);","handlingStrategy":"type-guard","validationCode":"var last = messages.Last();\nif (!last.Role.Equals(AuthorRole.User))\n    throw new InvalidOperationException(\"The final message must be a user message for Bedrock agents.\");","typeGuard":"static bool LastIsUser(ICollection<ChatMessageContent> m) =>\n    m.Count > 0 && m.Last().Role.Equals(AuthorRole.User);","tryCatchPattern":"try { await agent.InvokeAsync(messages); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"user message\"))\n{ /* append a user message as the last entry and retry */ }","preventionTips":["Ensure the last message has AuthorRole.User before invoking.","Append a user continuation prompt if the latest turn is an assistant reply."],"tags":["validation","bedrock","agent","role","precondition"],"backgroundTag":null,"analyzedSha":"c028a0c7dc4f0814cdcbaba9d998f187a41197bf","analyzedAt":"2026-08-13T13:48:05.040Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}