Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Interventions and plugins (Interrupts, human in...

Interventions and plugins (Interrupts, human in the loop, and skills) | Learn Strands Agents with Kiro 04

A deck for Python developers who have built a Strands Agents agent with tools and hooks, on how to put people and rules in the loop. It shows how to ask a person before a risky tool call with HumanInTheLoop and its classifier, how to put Cedar policies in front, and how to stop a call with an interrupt and resume it, also across a client and a server with a session manager. It then shows how plugins bundle hooks and tools, how skills load their instructions only when needed, how intervention handlers return Proceed, Deny, or Guide, and how steering gives feedback in plain words. Every example is real code with its real output, run on Amazon Bedrock in the Tokyo Region with global cross-Region inference, with architecture diagrams and flow charts. The facts come from the official Strands Agents documentation only, and the examples use a help-desk agent with made-up customers and orders, made for this series. As of November 2026 (Strands Agents 1.64, Level 300). This is deck 04 (Go deeper) of the Learn Strands Agents with Kiro series.

Avatar for Riku INADA

Riku INADA PRO

November 11, 2026

More Decks by Riku INADA

Other Decks in Technology

Transcript

  1. Learn Strands Agents with Kiro 04 Go deeper Interventions and

    plugins Interrupts, human in the loop, and skills 04 Level 300 / November 2026 November 2026 Riku Inada Amazon Web Services Japan © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. Kiro + Strands Agents 1
  2. Introduction About me Riku Inada Amazon Web Services Japan G.K.

    Solutions Architect Works mainly with manufacturing customers Recent work Promoting the AI-Driven Development Life Cycle (AI-DLC) Writing and speaking about Kiro and AWS Amplify © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. X @inada_riku Speaker Deck speakerdeck.com/inariku Zenn zenn.dev/inariku GitHub github.com/inariku 2
  3. Introduction Where this deck fits You are here: 04 Interventions

    and plugins. Next: 05 Sessions and memory Get started 01–02 Go deeper 03–07 Verify 09 Ship and extend 08–10 Read first Get started with 01 Strands Agents 03 Hooks and 02 Tools and MCP 04 plugins Observability lifecycle controls Interventions and Read next 09 and evals Deploy and secure 08 for production 10 Strands harness 05 Sessions and memory output 06 Structured and streaming 07 Multi-agent © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 3
  4. Introduction Add approvals and decisions to the help desk The

    help desk: the help-desk agent of a made-up online electronics shop, for delivery and refund inquiries 1 Ask a person before the agent acts 2 Stop with an interrupt and resume 3 Extend the agent with plugins and skills © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 4 Decide with interventions and steering 4
  5. 04 Interventions and plugins Part 1 y/n/t Ask a person

    before the agent acts © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 5
  6. 1 Ask a person before the agent acts Ask on

    every call, and people approve unread Asked on every call Asked about every call, people get decision fatigue and approve without reading hitl_min.py output line 2 Tool #1: track_order With classifier=True (next slide), it stops only at risky calls. track_order, which checks the delivery, ran with no prompt © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 6
  7. 1 Ask a person before the agent acts The smallest

    form: ask only on risky calls hitl_min.py from strands import Agent from strands.vended_interventions.hitl import ( HumanInTheLoop) from d04.base import PROMPT, model from d04.shop import process_refund, track_order Pass HumanInTheLoop to agent = Agent( model=model, tools=[track_order, process_refund], system_prompt=PROMPT, interventions=[HumanInTheLoop( classifier=True, ask="stdio", enable_trust=True)], ) agent("Track ORD-5521, then refund ¥9,800.") terminal. enable_trust=True © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. interventions classifier=True uses the built-in LLM classifier. ask="stdio" asks in the accepts the answer t The output of this run is on the next slide 7
  8. 1 Ask a person before the agent acts The approval

    prompt in the terminal hitl_min.py output (answered y in the terminal) Tool #1: track_order Tool #2: process_refund Approve "process_refund" — Financial transaction; refund issuance needs approval? Input: {"order_id": "ORD-5521", "yen": 9800} (y/n/t): y Order ORD-5521 was delivered on November 2. Your ¥9,800 refund is approved, arriving in 3 to 5 days. Before process_refund, it showed the reason from the classifier and the Input, and asked (y/n/t). After the answer y, the refund ran © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 8
  9. 1 Ask a person before the agent acts The answers,

    and the default classifier Answer What happens y, yes Approves this one call t, trust With enable_trust=True, also approves later calls of the same tool, for as long as the Agent lives Anything else Denies. The Agent learns that it was denied, and tells the user or tries another way The default classifier is an LLM judge. It runs on the model of the Agent, or on the auxiliary model if you set one. With no classifier, it asks on every call (except tools in allowed_tools) © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 9
  10. 1 Ask a person before the agent acts Negate a

    tool with ! to keep it from the classifier Checked from the left; the first match decides In allowed_tools: A tool trusted Listed in The classifier Classifier: risky, !process_refund with t allowed_tools says safe or it failed Always asks Runs, no prompt Runs, no prompt Runs, no prompt Asks hitl_hard.py output lines 3-5, answered t with allowed_tools=["!process_refund"] Approve "process_refund"? Input: {"order_id": "ORD-5521", "yen": 9800} (y/n/t): t I couldn't process that refund request. A negated tool always asks and cannot be trusted, so t counted as a denial. No classifier reason © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 10
  11. 1 Ask a person before the agent acts Put Cedar

    in front of HumanInTheLoop CedarAuthorization checks each call against Cedar policies. List them as interventions=[cedar, HumanInTheLoop(...)]. When Cedar denies, the ones after it are skipped: the refund for bob was denied with no prompt (code and output: A2, A3) © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 11
  12. 04 Interventions and plugins interrupt desk-approval Part 2 Stop with

    an interrupt and resume © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. interruptResponse end_turn 12
  13. 2 Stop with an interrupt and resume Stop, answer, and

    resume App Agent (Hook) agent("Refund ¥9,800 for ORD-5521.") stop_reason="interrupt", interrupts event.interrupt(...) Asks a person for y/n agent([{"interruptResponse": ...}]) stop_reason="end_turn" interrupt() gets the answer While result.stop_reason is interrupt, make an interruptResponse for each item of result.interrupts. agent(responses) resumes where it stopped © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 13
  14. 2 Stop with an interrupt and resume Get approval for

    each tool call in a hook interrupt_hook.py lines 7-15 (imports: A7) def approve(event: BeforeToolCallEvent): use = event.tool_use if use["name"] != "process_refund": return answer = event.interrupt( "desk-approval", reason=use["input"]) if answer != "y": event.cancel_tool = "The approver said no" In BeforeToolCallEvent, event.interrupt(name, reason=...) returns the answer of the person when the run resumes When it is not y, put the reason in event.cancel_tool. The caller loop is in A4 Output lines 1-2 (answered y and resumed) interrupt desk-approval {'order_id': 'ORD-5521', 'yen': 9800} end_turn © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 14
  15. 2 Stop with an interrupt and resume Interrupt from inside

    a tool interrupt_tool.py lines 6-15 (imports: A7) @tool(context=True) def process_refund(tool_context: ToolContext, order_id: str, yen: int): """Refund an order.""" answer = tool_context.interrupt( "refund-approval", reason={"order": order_id}) if answer != "y": return "The approver said no" return f"Refunded ¥{yen:,} for {order_id}" In a tool with @tool(context=True), stop with tool_context.interrupt(name, reason=...). The name only has to be unique within the tool Resume as on slide 13. This run answered n, and the agent said the refund was denied A direct call with agent.tool cannot raise an interrupt (output line 6) Output lines 1 and 6 (line 6: agent.tool.process_refund() called directly) interrupt refund-approval {'order': 'ORD-5521'} RuntimeError: cannot raise interrupt in direct tool call © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 15
  16. 2 Stop with an interrupt and resume Split into a

    client and a server server() makes an Agent on every call. Where it stopped stays in the FileSessionManager, so when client() passes the answer, the refund runs from there (code: A5, A6) © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 16
  17. 04 Interventions and plugins Part 3 Extend the agent with

    plugins and skills © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. plugins ContextInjector AgentSkills SKILL.md 17
  18. 3 Extend the agent with plugins and skills Pass a

    plugin in plugins plugin_attach.py lines 7-13 (imports: A7) clock = ContextInjector( lambda context: f"<now>{datetime.now():%H:%M}</now>") agent = Agent( model=model, plugins=[clock], callback_handler=None, system_prompt=PROMPT + "\nThe time now is in <now>.") print(agent("What time is it now?")) print(agent.messages[0]["content"]) Output The current time is 14:55. Today's date is November 10, 2026. [{'text': 'What time is it now?'}] © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. The Agent runs plugins as part of its loop. ContextInjector adds the time to the input of each new user turn (trigger defaults to userTurn). The history keeps no copy (last line). The date in the answer comes from PROMPT 18
  19. 3 Extend the agent with plugins and skills The shape

    of a Plugin class plugin_class.py lines 8-21 (imports: A7) class DeskLog(Plugin): name = "desk-log" def init_agent(self, agent): print("init_agent:", agent.tool_names) Lines 24-28 agent = Agent(model=model, system_prompt=PROMPT, tools=[track_order], plugins=[DeskLog()], callback_handler=None) @hook def log(self, event: BeforeToolCallEvent): print("[LOG]", event.tool_use["name"]) Output lines 3-4 [LOG] track_order [LOG] hours @tool def hours(self) -> str: """Return the shop hours.""" return "9:00-18:00" @hook runs on the event of its argument type, © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. and @tool became a tool 19
  20. 3 Extend the agent with plugins and skills What attaching

    touches, and in what order plugin_class.py output lines 1-2 init_agent: ['track_order'] Agent: ['track_order', 'hours'] © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. At init_agent, the tools of the plugin are not there yet. They come in last 20
  21. 3 Extend the agent with plugins and skills One prompt

    that holds every instruction Every instruction in one prompt uses up system prompt tokens, mixes the instructions, and is hard to maintain Skills in Strands Agents (AgentSkills) put only names and descriptions in the system prompt, and read the body when needed For the two skills of this deck (refund-policy and gift-wrap), only a name, a description, and a location went into the system prompt © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 21
  22. 3 Extend the agent with plugins and skills A skill

    loads in three phases 1 Discovery 2 Activation 3 Execution Names and descriptions go The skills tool returns the Follows the instructions; into the system prompt as XML instructions and a list of files your tools read resources Output lines 2, 4, 6 Tool #1: track_order Tool #2: skills Tool #3: skills © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. skills_flow.py output lines 9, 12, 13 (the last two are XML) activated: ['refund-policy'] <name>refund-policy</name> <description>Refund rules. Use for refunds</description> 22
  23. 3 Extend the agent with plugins and skills Ways to

    pass skills skills_sources.py lines 4-15 (imports: A7) one = AgentSkills(skills="./skills/refund-policy") parent = AgentSkills(skills="./skills/") mixed = AgentSkills(skills=[ "./skills/refund-policy", Skill(name="greeting", description="Rules for greetings", instructions="Greet them by name"), ]) for p in [one, parent, mixed]: agent = Agent(model=model, plugins=[p]) names = p.get_available_skills(agent) print([s.name for s in names]) © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. Output ['refund-policy'] ['gift-wrap', 'refund-policy'] ['greeting', 'refund-policy'] We passed one folder, a parent folder whose children (refund-policy, gift-wrap) load together, and a Skill. An HTTPS URL works too. A skill from a path loads when it is attached to an Agent, so we pass the agent to get_available_skills() 23
  24. 3 Extend the agent with plugins and skills Give it

    a tool to read files skills_read.py lines 7-12 (imports: A7) root = Path("skills").resolve() # a relative path failed agent = Agent( model=model, system_prompt=PROMPT, tools=[track_order, read], plugins=[AgentSkills(skills=str(root))]) agent("Can I refund ORD-5521? I opened the earbuds.") AgentSkills has no tool Output lines 2, 4, 6, 7, 8 Tool #1: skills Tool #2: track_order Tool #3: read Your order was delivered 8 days ago, within the 30-day window. Opened earbuds are refundable only if they're broken, though. The docs example © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. to read files. The vended read takes absolute paths, so we pass one Slide 23 reads no files, so relative paths work there uses file_editor, now deprecated 24
  25. 3 Extend the agent with plugins and skills The frontmatter

    of SKILL.md skills/refund-policy/SKILL.md --name: refund-policy description: Refund rules. Use for refunds allowed-tools: read --# Refund rules 1. Check the delivery date first 2. No refunds 30+ days after delivery 3. For details, read references/conditions.md Field Required What it holds name Yes a-z, 0-9, and hyphens; 1-64 characters description Yes Shown in the system prompt No Tool names split by spaces (not enforced now) No license, compatibility, metadata allowed-tools Others © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 25
  26. 04 Interventions and plugins before_tool_call Part 4 Decide with interventions

    and steering © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. Proceed() Guide(feedback=...) Deny(reason=...) 26
  27. 4 Decide with interventions and steering Write a handler and

    pass it intervene_basic.py lines 8-16 (imports: A7) class RefundLimit(InterventionHandler): name = "refund-limit" A method you do not override returns Proceed() def before_tool_call(self, event): use = event.tool_use if use["name"] == "process_refund" \ and use["input"]["yen"] > 5000: return Deny(reason="Needs a manager") return Proceed() Output Tool #1: process_refund Sorry, I cannot process this refund. It requires manager approval first. © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. RefundLimit() went into interventions=[...] of the Agent. The refund of ¥9,800 stopped 27
  28. 4 Decide with interventions and steering The five actions a

    handler can return Action How to write it What it does Proceed Proceed() Goes on as it is Deny Deny(reason=...) Stops, and skips the remaining handlers Guide Guide(feedback=...) Cancels, and the model tries again with feedback Confirm Confirm(prompt=...) Waits for a person to approve (before_tool_call only) Transform Transform(apply=fn) Changes the content, then goes on © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 28
  29. 4 Decide with interventions and steering Handlers run in the

    order you list them; Deny ends it With a Deny a Deny b skipped With two Guides c Guide d Guide Both feedback texts go to the model as one Tool does not run intervene_order.py output --- ['a', 'b'] Evaluated: a Deny Tool result: error DENIED: Stop --- ['c', 'd'] Evaluated: c Guide Evaluated: d Guide Tool result: error GUIDANCE: [c] Check the ID [d] Answer in 1 sentence With Guide, every handler ran, and their feedback joined into one © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 29
  30. 4 Decide with interventions and steering Why return a type

    instead of stopping in a hook When a hook sets a cancel field Plugin A event.cancel (event.cancel_tool on slide 14), the framework cannot tell a hard denial from a hint to retry When several plugins write the same event, the last one to write silently wins Interventions return Deny or Guide, so a Deny skips the rest and Guide feedback joins (the Plugin B © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. output on slide 29) 30
  31. 4 Decide with interventions and steering Three modes to collect

    the answer The ask value How the answer comes Good for Left out (default) Stops with an interrupt; resume with the answer Services that make the Agent again on each request "stdio" Type y or n in the terminal Command-line apps A function It gets the question and returns the answer A web page, a Slack bot Choose with ask of HumanInTheLoop. The default works like the interrupts of part 2. For a service like that, keep the state with a session manager © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 31
  32. 4 Decide with interventions and steering A long prompt that

    holds every step 30+ steps With 30+ steps in one prompt, the agent ignores instructions or skips steps Steering in Strands Agents returns feedback from a handler only when the moment calls for it In Python, steering handlers are plugins: pass them in plugins=[handler], not in interventions © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 32
  33. 4 Decide with interventions and steering Write the rules in

    plain words steering_tone.py lines 12-17 (imports: A7) handler = LLMSteeringHandler(system_prompt=""" Check that an email to a customer is polite and calm. If it blames or sounds harsh, have it rewritten.""") agent = Agent(model=model, system_prompt=PROMPT, tools=[send_email], plugins=[handler], callback_handler=None) Pass an LLMSteeringHandler with a system_prompt to plugins The request: “Use a firm, strong tone” (lines 18-19) Output (each email cut at 50 characters, each tool result at 19) send_email #1: Your return window has officially expired. No furt -> error Tool call cancelled send_email #2: Thank you for reaching out about your order. Unfor -> success Sent to C-1001 The first email was cancelled and the second was sent, in all 5 runs of this code © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 33
  34. 4 Decide with interventions and steering A provider gives the

    handler what it needs A provider watches hook events and writes the steering context; the handler reads it to decide (default: LedgerProvider). For a tool call, steering has its own actions, not the five on slide 28 © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 34
  35. Summary Summary 1 To ask only on risky calls, use

    HumanInTheLoop(classifier=True). Prefix a must-ask tool with !, and put Cedar first for a hard line 2 Stop with an interrupt in a hook or a tool, and resume with an interruptResponse. For a client and a server, add a session manager 3 A plugin bundles hooks and tools. Skills put only names and descriptions in first, and read the body when needed 4 Interventions return Deny or Guide as types. Steering returns feedback only when the moment calls for it © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 35
  36. Summary Read next 05 Sessions and memory Agent state, saving

    and resuming a conversation, long-term memory, and context management © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 36
  37. Appendix A1 The model and PROMPT used on every slide

    d04/base.py # deck 04, shared: the model (Bedrock in Tokyo) and the prompt from agent import model # noqa: F401 PROMPT = """You work at the help desk of a made-up online electronics shop. Answer in at most two sentences, with no markdown symbols. Keep each sentence to 8 words or fewer, one sentence per line. Today is 2026-11-10.""" agent.py lines 19-22 (the model of deck 01) model = BedrockModel( model_id="global.anthropic.claude-sonnet-5", region_name="ap-northeast-1", # Tokyo ) © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. The shop has two tools. track_order checks the delivery (d04/shop.py). process_refund refunds (tools.py of deck 01) 37
  38. Appendix A2 The Cedar policies and CedarAuthorization d04/cedar_first.py lines 8-21

    (imports: A7) POLICIES = """ permit(principal, action == Action::"track_order", resource); permit(principal == User::"alice", action == Action::"process_refund", resource); """ def who(state): return {"type": "User", "id": state["user_id"]} Anyone may call track_order. Only alice may call process_refund principal_resolver makes the User from user_id in invocation_state cedar = CedarAuthorization(policies=POLICIES, principal_resolver=who) © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 38
  39. Appendix A3 Call it with Cedar in front d04/cedar_first.py lines

    22-30 for user in ["alice", "bob"]: print(f"--- {user}") agent = Agent( model=model, system_prompt=PROMPT, tools=[track_order, process_refund], interventions=[cedar, HumanInTheLoop( classifier=True, ask="stdio")]) agent("Refund ¥9,800 for ORD-5521.", invocation_state={"user_id": user}) alice was asked on lines 4-5 and answered y. bob was denied with no prompt We added cedarpy (strands-agents[cedar]) to run it Output lines 6 and 11 (alice, then bob) Refund processed successfully for ORD-5521. Sorry, I can't process that refund right now. © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 39
  40. Appendix A4 The caller that stops and resumes on an

    interrupt d04/interrupt_hook.py lines 18-20 def yes(i): return {"interruptResponse": { "interruptId": i.id, "response": "y"}} Lines 26-33 agent.add_hook(approve) result = agent("Refund ¥9,800 for ORD-5521.") while result.stop_reason == "interrupt": for i in result.interrupts: print(result.stop_reason, i.name, i.reason) result = agent([yes(i) for i in result.interrupts]) print(result.stop_reason) print(result) © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. Make an interruptResponse for each item of result.interrupts, and pass them to agent(...). The output is on slide 14 40
  41. Appendix A5 Client and server: server() d04/session_split.py lines 8-16 (imports:

    A7) def server(prompt): # makes an Agent on every call agent = Agent( model=model, system_prompt=PROMPT, tools=[track_order, process_refund], session_manager=FileSessionManager( session_id="desk-1", storage_dir="/tmp/desk"), callback_handler=None) agent.add_hook(approve) return agent(prompt) It makes an Agent on every call, reads where it stopped from the FileSessionManager of the same session_id, and goes on. approve is the same hook as on slide 14 (d04/approval.py) © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 41
  42. Appendix A6 Client and server: client() d04/session_split.py lines 19-28 def

    client(text): result = server(text) while result.stop_reason == "interrupt": responses = [] for it in result.interrupts: print("Ask:", it.reason) responses.append({"interruptResponse": { "interruptId": it.id, "response": "y"}}) result = server(responses) print(result) Output lines 1-2 Ask: {'order_id': 'ORD-5488', 'yen': 4500} Refund of 4,500 yen processed successfully. © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. client() passes the answer to server(responses) (called on line 31) 42
  43. Appendix A7 The imports of the code in this deck

    Module Names strands Agent, AgentSkills, Skill, tool strands.hooks BeforeToolCallEvent strands.interventions Deny, Guide, InterventionHandler, Proceed strands.plugins Plugin, hook strands.session FileSessionManager strands.types.tools ToolContext strands.vended_interventions.cedar CedarAuthorization strands.vended_interventions.hitl HumanInTheLoop strands.vended_plugins.context_injector ContextInjector strands.vended_plugins.steering LLMSteeringHandler strands.vended_tools read From the strands imports in d04/*.py, e.g. from strands.plugins import Plugin, hook © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 43
  44. Appendix A8 The code this deck ran File Slides File

    Slides hitl_min.py 6–8 plugin_class.py 19, 20 base.py 7, 37 skills_flow.py 22 shop.py 7, 37 skills_sources.py 23 hitl_hard.py 10 skills_read.py 24 cedar_first.py 11, 38, 39 SKILL.md 25 interrupt_hook.py 13, 14, 40 intervene_basic.py 27 interrupt_tool.py 15 intervene_order.py 29 approval.py 16, 41 steering_tone.py 33 session_split.py 16, 41, 42 agent.py 37 plugin_attach.py 18 tools.py 37 © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 44
  45. Appendix Sources Strands Agents documentation, “Approve before your agent acts”,

    read on 2026-11-11 (slides 6–11, 35) https://strandsagents.com/docs/user-guide/sdk/agents/approve-before-acting/ Strands Agents documentation, “Interrupts”, read on 2026-11-11 (slides 13–16, 35, 40–42) https://strandsagents.com/docs/user-guide/sdk/interrupts/ Strands Agents documentation, “Plugins”, read on 2026-11-11 (slides 4, 18, 35) https://strandsagents.com/docs/user-guide/sdk/plugins/ Strands Agents documentation, “Context Injector”, read on 2026-11-11 (slide 18) https://strandsagents.com/docs/user-guide/sdk/plugins/context-injector/ Strands Agents documentation, “Build a custom plugin”, read on 2026-11-11 (slides 19, 20) https://strandsagents.com/docs/user-guide/sdk/plugins/custom-plugins/ Strands Agents documentation, “Skills”, read on 2026-11-11 (slides 21–25, 35) https://strandsagents.com/docs/user-guide/sdk/plugins/skills/ Strands Agents documentation, “File editor”, read on 2026-11-11 (slide 24) https://strandsagents.com/docs/user-guide/sdk/tools/vended-tools/file-editor/ © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 45
  46. Appendix Sources (continued) Strands Agents documentation, “Read”, read on 2026-11-11

    (slide 24) https://strandsagents.com/docs/user-guide/sdk/tools/vended-tools/read/ Strands Agents documentation, “Interventions”, read on 2026-11-11 (slides 4, 27–30, 35) https://strandsagents.com/docs/user-guide/sdk/agents/interventions/ Strands Agents documentation, “Human in the loop”, read on 2026-11-11 (slides 9, 10, 31) https://strandsagents.com/docs/user-guide/sdk/agents/interventions/human-in-the-loop/ Strands Agents documentation, “Cedar Authorization”, read on 2026-11-11 (slides 11, 38, 39) https://strandsagents.com/docs/user-guide/sdk/agents/interventions/cedar-authorization/ Strands Agents documentation, “Steering”, read on 2026-11-11 (slides 32–35) https://strandsagents.com/docs/user-guide/sdk/agents/interventions/steering/ The code we ran and its output, from the help-desk agent (English copy, not published), strands-agents 1.64.0, Amazon Bedrock in Tokyo, 2026-11-11 (slides 6–8, 10, 11, 13–16, 18–20, 22–25, 27, 29, 33, 37–44) © 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved. 46