microsoft/semantic-kernel · error · ValueError
Agent does not exist. Please create the agent before getting
Error message
Agent does not exist. Please create the agent before getting it.
What it means
Raised by the internal _get_agent when self.agent_model.agent_id is falsy. _get_agent calls bedrock_client.get_agent(agentId=...), which requires an ID. This method is called transitively by _wait_for_agent_status (status polling) and is the data-refresh path. Without an agent_id, there is no agent to fetch.
Source
Thrown at python/semantic_kernel/agents/bedrock/bedrock_agent_base.py:147
try:
await run_in_executor(
None,
partial(
self.bedrock_client.delete_agent,
agentId=self.agent_model.agent_id,
**kwargs,
),
)
self.agent_model.agent_id = None
except ClientError as e:
logger.error(f"Failed to delete agent {self.agent_model.agent_id}.")
raise e
async def _get_agent(self) -> None:
"""Get an agent."""
if not self.agent_model.agent_id:
raise ValueError("Agent does not exist. Please create the agent before getting it.")
try:
response = await run_in_executor(
None,
partial(
self.bedrock_client.get_agent,
agentId=self.agent_model.agent_id,
),
)
# Update the agent model
self.agent_model = BedrockAgentModel(**response["agent"])
except ClientError as e:
logger.error(f"Failed to get agent {self.agent_model.agent_id}.")
raise e
async def _wait_for_agent_status(
self,View on GitHub (pinned to c028a0c7dc)
Solutions
- Ensure the agent is created (has a valid agent_id) before any status-polling or prepare operation.
- Use create_and_prepare_agent which handles the full create -> wait -> prepare lifecycle.
- If referencing an existing agent, construct the model with the real agent_id.
Example fix
// before
agent = BedrockAgent({'agentName': 'x'})
await agent._get_agent() # no agent_id -> raises
// after
agent = await BedrockAgent.create_and_prepare_agent(name='x', instructions='...')
await agent._get_agent() # agent_id is set Defensive patterns
Strategy: validation
Validate before calling
def assert_agent_exists(agent) -> None:
if not agent.agent_model.agent_id:
raise ValueError("Agent has no agent_id; cannot refresh agent state.") Type guard
def agent_has_id(agent) -> bool:
return bool(getattr(getattr(agent, "agent_model", None), "agent_id", None)) Try / catch
try:
await agent._get_agent()
except ValueError as e:
if "create the agent before getting" in str(e):
agent = await BedrockAgent.create_and_prepare_agent(name=..., instructions=...)
await agent._get_agent()
else:
raise Prevention
- Ensure the agent is provisioned (has agent_id) before any status polling or prepare call.
- Use create_and_prepare_agent for the full lifecycle rather than manual construction.
- Validate agent_id presence before invoking internal data-refresh methods.
When it happens
Trigger: Triggered when _get_agent() is invoked on a BedrockAgent without an agent_id — typically indirectly via _wait_for_agent_status -> _get_agent during prepare/create flows, or if called directly on an unprovisioned agent.
Common situations: Calling prepare_agent_and_wait_until_prepared (which polls status via _get_agent) on an agent constructed without agent_id; manually invoking _get_agent; a create flow that failed mid-way leaving agent_id unset.
Related errors
- Agent does not exist. Please create the agent before prepari
- Agent does not exist. Please create the agent before deletin
- Agent does not exist. Please create the agent before creatin
- The Bedrock agent requires a message to be invoked.
- The streaming configuration must be null for non-streaming r
AI-assisted analysis of microsoft/semantic-kernel@c028a0c7dc (2026-08-13).
Data as JSON: /api/errors/28d678fafb92b2b9.
Report an issue: GitHub.