From 91919ff70c4193e587f70c21f8cbcc7994333b2a Mon Sep 17 00:00:00 2001 From: Fahad Farrukh Date: Fri, 12 Jun 2026 23:53:19 -0400 Subject: [PATCH] fix(payments): T01 Strands Step 5c uses a fresh agent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Step 5a calls budget_agent against a paid endpoint. If ProcessPayment fails mid-call (e.g. when delegated signing isn't fully granted), the Strands runtime activates the agent's interrupt state. Step 5b spins up tiny_agent (fresh) so it works, but Step 5c then reuses budget_agent with a string prompt, which the activated interrupt state rejects: TypeError: prompt_type= | must resume from interrupt with list of interruptResponse's Strands documents this as expected behavior — once an agent is in interrupt state it must be resumed with a list of interruptResponse objects, never a string (see strandsagents.com user guide on hooks). Build a fresh introspection_agent for Step 5c that uses the same budget_plugin, so the plugin's get_payment_session, get_payment_instrument, and list_payment_instruments tools are still available. The new agent has a clean interrupt state and accepts string prompts. The LangGraph variant builds a new react agent per session and isn't affected. --- .../strands_payment_agent.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/01-features/08-agents-that-transact/00-getting-started/01-agents-payments-and-limits/strands_payment_agent.py b/01-features/08-agents-that-transact/00-getting-started/01-agents-payments-and-limits/strands_payment_agent.py index 6bba3b894..b0b1bb602 100644 --- a/01-features/08-agents-that-transact/00-getting-started/01-agents-payments-and-limits/strands_payment_agent.py +++ b/01-features/08-agents-that-transact/00-getting-started/01-agents-payments-and-limits/strands_payment_agent.py @@ -226,11 +226,20 @@ # ── Step 5c: Plugin built-in tools ──────────────────────────────────────────── print("\n── Step 5c: Built-in Payment Tools ──") -# The plugin registers get_payment_session, get_payment_instrument, list_payment_instruments -result = budget_agent("How much budget do I have left in my current session?") +# The plugin registers get_payment_session, get_payment_instrument, list_payment_instruments. +# A fresh agent is used here so a string prompt is always valid — reusing budget_agent +# fails with TypeError if Step 5a/5b left it in interrupt state (e.g. ProcessPayment failed). +introspection_agent = Agent( + model=BedrockModel(model_id=MODEL_ID, streaming=True), + tools=[http_request], + plugins=[budget_plugin], + system_prompt=SYSTEM_PROMPT, +) + +result = introspection_agent("How much budget do I have left in my current session?") print(result.message) -result = budget_agent("What payment instruments (wallets) do I have available?") +result = introspection_agent("What payment instruments (wallets) do I have available?") print(result.message) # ── Step 5d: Uncapped session ─────────────────────────────────────────────────