![]() Also formatted the files in that folder in this same commit. PiperOrigin-RevId: 766885306 |
||
---|---|---|
.. | ||
__init__.py | ||
agent.py | ||
main.py | ||
README.md |
Agent with Long-Running Tools
This example demonstrates an agent using a long-running tool (ask_for_approval
).
Key Flow for Long-Running Tools
-
Initial Call: The agent calls the long-running tool (e.g.,
ask_for_approval
). -
Initial Tool Response: The tool immediately returns an initial response, typically indicating a "pending" status and a way to track the request (e.g., a
ticket-id
). This is sent back to the agent as atypes.FunctionResponse
(usually processed internally by the runner and then influencing the agent's next turn). -
Agent Acknowledges: The agent processes this initial response and usually informs the user about the pending status.
-
External Process/Update: The long-running task progresses externally (e.g., a human approves the request).
-
❗️Crucial Step: Provide Updated Tool Response❗️:
- Once the external process completes or updates, your application must construct a new
types.FunctionResponse
. - This response should use the same
id
andname
as the originalFunctionCall
to the long-running tool. - The
response
field within thistypes.FunctionResponse
should contain the updated data (e.g.,{'status': 'approved', ...}
). - Send this
types.FunctionResponse
back to the agent as a part within a new message usingrole="user"
.
# Example: After external approval updated_tool_output_data = { "status": "approved", "ticket-id": ticket_id, # from original call # ... other relevant updated data } updated_function_response_part = types.Part( function_response=types.FunctionResponse( id=long_running_function_call.id, # Original call ID name=long_running_function_call.name, # Original call name response=updated_tool_output_data, ) ) # Send this back to the agent await runner.run_async( # ... session_id, user_id ... new_message=types.Content( parts=[updated_function_response_part], role="user" ), )
- Once the external process completes or updates, your application must construct a new
-
Agent Acts on Update: The agent receives this message containing the
types.FunctionResponse
and, based on its instructions, proceeds with the next steps (e.g., calling another tool likereimburse
).
Why is this important? The agent relies on receiving this subsequent types.FunctionResponse
(provided in a message with role="user"
containing the specific Part
) to understand that the long-running task has concluded or its state has changed. Without it, the agent will remain unaware of the outcome of the pending task.