{"record":{"id":"3e6ec6b7e3d8a1fb","repo":"microsoft/semantic-kernel","slug":"only-user-messages-are-supported-for-invoking-a-be","errorCode":null,"errorMessage":"Only user messages are supported for invoking a Bedrock agent.","messagePattern":"Only user messages are supported for invoking a Bedrock agent\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/semantic_kernel/agents/bedrock/bedrock_agent_base.py","lineNumber":363,"sourceCode":"        except ClientError as e:\n            logger.error(f\"Failed to list associated knowledge bases for agent {self.agent_model.agent_id}.\")\n            raise e\n\n    # endregion Knowledge Base Management\n\n    async def _invoke_agent(\n        self,\n        thread_id: str,\n        message: str | ChatMessageContent,\n        agent_alias: str | None = None,\n        **kwargs,\n    ) -> dict[str, Any]:\n        \"\"\"Invoke an agent.\"\"\"\n        if not self.agent_model.agent_id:\n            raise ValueError(\"Agent does not exist. Please create the agent before invoking it.\")\n\n        if isinstance(message, ChatMessageContent) and message.role != AuthorRole.USER:\n            raise ValueError(\"Only user messages are supported for invoking a Bedrock agent.\")\n\n        agent_alias = agent_alias or self.WORKING_DRAFT_AGENT_ALIAS\n\n        try:\n            return await run_in_executor(\n                None,\n                partial(\n                    self.bedrock_runtime_client.invoke_agent,\n                    agentAliasId=agent_alias,\n                    agentId=self.agent_model.agent_id,\n                    sessionId=thread_id,\n                    inputText=message if isinstance(message, str) else message.content,\n                    **kwargs,\n                ),\n            )\n        except ClientError as e:\n            logger.error(f\"Failed to invoke agent {self.agent_model.agent_id}.\")\n            raise e","sourceCodeStart":345,"sourceCodeEnd":381,"githubUrl":"https://github.com/microsoft/semantic-kernel/blob/c028a0c7dc4f0814cdcbaba9d998f187a41197bf/python/semantic_kernel/agents/bedrock/bedrock_agent_base.py#L345-L381","documentation":"Raised by BedrockAgentBase._invoke_agent when the message argument is a ChatMessageContent whose role is not AuthorRole.USER. Bedrock's invoke_agent API only accepts a single user inputText, so assistant/system/tool messages are rejected before the call.","triggerScenarios":"Passing a ChatMessageContent with role SYSTEM, ASSISTANT, or TOOL into the Bedrock invoke path; feeding back an assistant response object as the next input; using a chat history item of non-user role as the invoke message.","commonSituations":"Reusing message objects from a prior turn without role normalization; passing a system prompt wrapped in ChatMessageContent instead of using agent instructions; loops that feed the last history message regardless of role.","solutions":["Pass a plain str, or a ChatMessageContent explicitly constructed with role=AuthorRole.USER.","Extract only the user-authored text when forwarding history: use message.content with role check.","Keep system-level instructions in the agent's instruction field, not as a message passed to invoke.","Normalize your message pipeline so only USER-role content reaches the Bedrock agent."],"exampleFix":"// before\nmsg = ChatMessageContent(role=AuthorRole.SYSTEM, content='be concise')\nawait agent._invoke_agent(thread_id, msg)  # raises\n// after\nawait agent._invoke_agent(thread_id, 'be concise')  # str is fine\n// or\nmsg = ChatMessageContent(role=AuthorRole.USER, content='hello')\nawait agent._invoke_agent(thread_id, msg)","handlingStrategy":"type-guard","validationCode":"from semantic_kernel.contents.utils.author_role import AuthorRole\nfrom semantic_kernel.contents.chat_message_content import ChatMessageContent\n\ndef to_bedrock_input(message):\n    if isinstance(message, ChatMessageContent):\n        if message.role != AuthorRole.USER:\n            raise ValueError('Only USER-role messages are accepted by Bedrock invoke')\n        return message.content\n    return message","typeGuard":"def is_user_message(message) -> bool:\n    return isinstance(message, str) or (\n        isinstance(message, ChatMessageContent) and message.role == AuthorRole.USER\n    )","tryCatchPattern":"try:\n    await agent.get_response(msg)\nexcept ValueError as e:\n    if 'Only user messages' in str(e):\n        msg = ChatMessageContent(role=AuthorRole.USER, content=msg.content if hasattr(msg,'content') else str(msg))\n        await agent.get_response(msg)\n    else: raise","preventionTips":["Pass plain strings or explicit USER-role content to Bedrock invoke","Keep system instructions in the agent config, not as messages"],"tags":["bedrock","message-role","invocation","validation"],"backgroundTag":null,"analyzedSha":"c028a0c7dc4f0814cdcbaba9d998f187a41197bf","analyzedAt":"2026-08-13T13:48:05.040Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}