{"id":3179,"date":"2026-07-30T14:31:00","date_gmt":"2026-07-30T14:31:00","guid":{"rendered":"https:\/\/futurenews24.com\/index.php\/2026\/07\/30\/the-end-to-end-agentic-ai-pipeline\/"},"modified":"2026-08-02T08:59:13","modified_gmt":"2026-08-02T08:59:13","slug":"the-end-to-end-agentic-ai-pipeline","status":"publish","type":"post","link":"https:\/\/futurenews24.com\/index.php\/2026\/07\/30\/the-end-to-end-agentic-ai-pipeline\/","title":{"rendered":"The Finish-to-Finish Agentic AI Pipeline"},"content":{"rendered":"<p><br \/>\n<\/p>\n<div id=\"\">\n<p>On this article, you&#8217;ll study the seven architectural parts that separate a production-grade agentic AI system from a demo script, and the way each suits into the agent\u2019s core suggestions loop.<\/p>\n<p>Subjects we&#8217;ll cowl embody:<\/p>\n<p>What every of the seven parts \u2014 notion, reminiscence, reasoning and planning, instrument execution, orchestration, guardrails, and observability \u2014 is particularly liable for.<br \/>\nThe place every part tends to interrupt in actual techniques, and why that part have to be stored separate from the others.<br \/>\nTargeted, runnable Python code illustrating the duty of every part in isolation.<\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-The-End-to-End-Agentic-AI-Pipeline-scaled.png\" alt=\"The End-to-End Agentic AI Pipeline\" width=\"800\" height=\"706\"\/><\/p>\n<h2>Introduction<\/h2>\n<p>Most \u201cconstruct an AI agent\u201d tutorials present a 40-line script that calls an LLM in a loop and calls it carried out. That script works superb for a demo. It doesn&#8217;t survive a second concurrent consumer, a flaky third-party API, or a process that seems to want twelve steps as an alternative of two.<\/p>\n<p>The hole between the demo and the manufacturing system isn\u2019t intelligent prompting. It\u2019s structure. Manufacturing agentic techniques are constructed from a constant set of interconnected parts: notion, reasoning, planning, reminiscence, instrument execution, orchestration, and guardrails. That very same part breakdown exhibits up throughout almost each severe structure writeup, survey paper, and manufacturing postmortem revealed within the final 12 months, no matter which framework or vendor is doing the writing.<\/p>\n<p>The loop beneath all of it&#8217;s constant: Objective \u2192 Notion \u2192 Reasoning \u2192 Planning \u2192 Motion \u2192 Commentary \u2192 Reminiscence Replace \u2192 again to Reasoning, repeating till the objective is met, a cease situation fires, or the agent decides it wants a human. This text walks by means of every bit of that loop as its personal part \u2014 what it\u2019s liable for, the place it tends to interrupt, and a targeted code excerpt that makes the duty concrete. Nothing right here is wired into one operating pipeline. Every bit is proven in isolation, which can be how it is best to cause about your individual system when deciding what it wants.<\/p>\n<h2>The Seven Elements, at a Look<\/h2>\n<p>Architectural surveys converge on the identical core set: Notion, Reminiscence, Reasoning\/Planning, Device Execution, and Orchestration kind a closed suggestions loop \u2014 the cycle that truly runs, step after step. Guardrails and Observability wrap round that complete loop as cross-cutting issues fairly than steps contained in the sequence. You don\u2019t \u201cdo\u201d guardrails at step 4; guardrails sit between each proposed motion and the world, watching each step.<\/p>\n<p>That distinction shapes the remainder of this text. The primary 5 sections stroll by means of the loop within the order knowledge really flows by means of it. The final two sections cowl the wrapper layers that make the loop survivable as soon as actual cash, actual clients, and actual unwanted effects are concerned.<\/p>\n<h2>Turning Uncooked Enter Into One thing the Agent Can Purpose About<\/h2>\n<p>Notion\u2019s job is to remodel uncooked inputs \u2014 textual content, voice, API payloads, sensor knowledge, and file uploads \u2014 right into a structured illustration that the reasoning engine can really work with. That is the part most tutorials skip totally, as a result of in a demo, \u201cthe consumer simply varieties textual content\u201d and there\u2019s nothing to normalize. Actual techniques take enter from webhooks, structured API calls, file uploads, and a number of channels concurrently, and each a kind of must land in the identical form earlier than something downstream can belief it.<\/p>\n<div id=\"urvanov-syntax-highlighter-6a6cbf60dd911446209669\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" touchscreen minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\n# notion.py&#13;<br \/>\n# Conditions: none past Python&#8217;s normal library&#13;<br \/>\n# Run: python notion.py&#13;<br \/>\n&#13;<br \/>\nfrom dataclasses import dataclass, subject&#13;<br \/>\nfrom typing import Any&#13;<br \/>\nfrom enum import Enum&#13;<br \/>\nimport json&#13;<br \/>\nfrom datetime import datetime, timezone&#13;<br \/>\n&#13;<br \/>\nclass InputSource(Enum):&#13;<br \/>\n    USER_TEXT = &#8220;user_text&#8221;&#13;<br \/>\n    WEBHOOK = &#8220;webhook&#8221;&#13;<br \/>\n    FILE_UPLOAD = &#8220;file_upload&#8221;&#13;<br \/>\n&#13;<br \/>\n@dataclass&#13;<br \/>\nclass AgentInput:&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    The normalized inner form each downstream part consumes,&#13;<br \/>\n    no matter the place the uncooked enter really got here from. That is the&#13;<br \/>\n    complete level of a notion layer: all the pieces previous this level&#13;<br \/>\n    solely ever sees this one construction.&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    supply: InputSource&#13;<br \/>\n    content material: str&#13;<br \/>\n    metadata: dict[str, Any] = subject(default_factory=dict)&#13;<br \/>\n    received_at: str = subject(default_factory=lambda: datetime.now(timezone.utc).isoformat())&#13;<br \/>\n&#13;<br \/>\ndef perceive_user_text(raw_text: str) -&gt; AgentInput:&#13;<br \/>\n    &#8220;&#8221;&#8221;Uncooked chat enter &#8212; the best case, but it surely nonetheless wants normalization.&#8221;&#8221;&#8221;&#13;<br \/>\n    return AgentInput(&#13;<br \/>\n        supply=InputSource.USER_TEXT,&#13;<br \/>\n        content material=raw_text.strip(),&#13;<br \/>\n        metadata={&#8220;channel&#8221;: &#8220;chat&#8221;},&#13;<br \/>\n    )&#13;<br \/>\n&#13;<br \/>\ndef perceive_webhook(raw_payload: str) -&gt; AgentInput:&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    A webhook delivers structured JSON, not plain textual content. Notion extracts&#13;<br \/>\n    the half the agent ought to cause about and discards transport-level&#13;<br \/>\n    noise like headers and signatures.&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    payload = json.masses(raw_payload)&#13;<br \/>\n    event_type = payload.get(&#8220;event_type&#8221;, &#8220;unknown&#8221;)&#13;<br \/>\n    description = payload.get(&#8220;description&#8221;, &#8220;&#8221;)&#13;<br \/>\n    return AgentInput(&#13;<br \/>\n        supply=InputSource.WEBHOOK,&#13;<br \/>\n        content material=f&#8221;Occasion &#8216;{event_type}&#8217; acquired: {description}&#8221;,&#13;<br \/>\n        metadata={&#8220;event_type&#8221;: event_type, &#8220;raw_payload&#8221;: payload},&#13;<br \/>\n    )&#13;<br \/>\n&#13;<br \/>\ndef perceive_file_upload(filename: str, file_size_bytes: int, mime_type: str) -&gt; AgentInput:&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    A file add occasion has no natural-language content material in any respect &#8212; notion&#13;<br \/>\n    has to assemble one thing the reasoning engine can really use.&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    return AgentInput(&#13;<br \/>\n        supply=InputSource.FILE_UPLOAD,&#13;<br \/>\n        content material=f&#8221;Consumer uploaded file &#8216;{filename}&#8217; ({mime_type}, {file_size_bytes} bytes)&#8221;,&#13;<br \/>\n        metadata={&#8220;filename&#8221;: filename, &#8220;mime_type&#8221;: mime_type, &#8220;size_bytes&#8221;: file_size_bytes},&#13;<br \/>\n    )&#13;<br \/>\n&#13;<br \/>\n&#13;<br \/>\nif __name__ == &#8220;__main__&#8221;:&#13;<br \/>\n    text_input = perceive_user_text(&#8221;  What is the standing of my refund?  &#8220;)&#13;<br \/>\n    webhook_input = perceive_webhook(json.dumps({&#13;<br \/>\n        &#8220;event_type&#8221;: &#8220;payment_failed&#8221;,&#13;<br \/>\n        &#8220;description&#8221;: &#8220;Card declined for order #4821&#8221;,&#13;<br \/>\n    }))&#13;<br \/>\n    file_input = perceive_file_upload(&#8220;invoice_q3.pdf&#8221;, 184320, &#8220;utility\/pdf&#8221;)&#13;<br \/>\n&#13;<br \/>\n    for inp in [text_input, webhook_input, file_input]:&#13;<br \/>\n        print(f&#8221;[{inp.source.value}] content material=&#8221;{inp.content material}&#8221;&#8221;)&#13;<br \/>\n        print(f&#8221;  metadata keys: {record(inp.metadata.keys())}n&#8221;)<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"urvanov-syntax-highlighter-nums-content\" style=\"font-size: 12px !important; line-height: 15px !important;\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<p>32<\/p>\n<p>33<\/p>\n<p>34<\/p>\n<p>35<\/p>\n<p>36<\/p>\n<p>37<\/p>\n<p>38<\/p>\n<p>39<\/p>\n<p>40<\/p>\n<p>41<\/p>\n<p>42<\/p>\n<p>43<\/p>\n<p>44<\/p>\n<p>45<\/p>\n<p>46<\/p>\n<p>47<\/p>\n<p>48<\/p>\n<p>49<\/p>\n<p>50<\/p>\n<p>51<\/p>\n<p>52<\/p>\n<p>53<\/p>\n<p>54<\/p>\n<p>55<\/p>\n<p>56<\/p>\n<p>57<\/p>\n<p>58<\/p>\n<p>59<\/p>\n<p>60<\/p>\n<p>61<\/p>\n<p>62<\/p>\n<p>63<\/p>\n<p>64<\/p>\n<p>65<\/p>\n<p>66<\/p>\n<p>67<\/p>\n<p>68<\/p>\n<p>69<\/p>\n<p>70<\/p>\n<p>71<\/p>\n<p>72<\/p>\n<p>73<\/p>\n<p>74<\/p>\n<\/div>\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-p\"># notion.py<\/span><\/p>\n<p><span class=\"crayon-p\"># Conditions: none past Python&#8217;s normal library<\/span><\/p>\n<p><span class=\"crayon-p\"># Run: python notion.py<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">dataclasses <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-v\">dataclass<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">subject<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">typing <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">Any<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-t\">enum<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-t\">Enum<\/span><\/p>\n<p><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">json<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">datetime <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-v\">datetime<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">timezone<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-t\">class<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">InputSource<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-t\">Enum<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">USER_TEXT<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;user_text&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">WEBHOOK<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;webhook&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">FILE_UPLOAD<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;file_upload&#8221;<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-sy\">@<\/span><span class=\"crayon-e\">dataclass<\/span><\/p>\n<p><span class=\"crayon-t\">class<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">AgentInput<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0The normalized inner form each downstream part consumes,<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0no matter the place the uncooked enter really got here from. That is the<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0complete level of a notion layer: all the pieces previous this level<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0solely ever sees this one construction.<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0&#8220;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">supply<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">InputSource<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">content material<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">metadata<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">dict<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">Any<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">subject<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">default_factory<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">dict<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">received_at<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">subject<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">default_factory<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">lambda<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">datetime<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">now<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">timezone<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">utc<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">isoformat<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">perceive_user_text<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">raw_text<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">AgentInput<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;Uncooked chat enter &#8212; the best case, but it surely nonetheless wants normalization.&#8221;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">AgentInput<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">supply<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">InputSource<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">USER_TEXT<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">content material<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">raw_text<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">strip<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">metadata<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;channel&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;chat&#8221;<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">perceive_webhook<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">raw_payload<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">AgentInput<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0A webhook delivers structured JSON, not plain textual content. Notion extracts<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0the half the agent ought to cause about and discards transport-level<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0noise like headers and signatures.<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0&#8220;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">payload<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">json<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">masses<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">raw_payload<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">event_type<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">payload<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">get<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;event_type&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;unknown&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">description<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">payload<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">get<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;description&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">AgentInput<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">supply<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">InputSource<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">WEBHOOK<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">content material<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Occasion &#8216;{event_type}&#8217; acquired: {description}&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">metadata<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;event_type&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">event_type<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;raw_payload&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">payload<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">perceive_file_upload<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">filename<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">file_size_bytes<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">int<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">mime_type<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">AgentInput<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0A file add occasion has no natural-language content material in any respect &#8212; notion<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0has to assemble one thing the reasoning engine can really use.<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0&#8220;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">AgentInput<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">supply<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">InputSource<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">FILE_UPLOAD<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">content material<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Consumer uploaded file &#8216;{filename}&#8217; ({mime_type}, {file_size_bytes} bytes)&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">metadata<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;filename&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">filename<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;mime_type&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">mime_type<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;size_bytes&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">file_size_bytes<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">__name__<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">==<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;__main__&#8221;<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">text_input<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">perceive_user_text<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8221;\u00a0\u00a0What is the standing of my refund?\u00a0\u00a0&#8220;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">webhook_input<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">perceive_webhook<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">json<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">dumps<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;event_type&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;payment_failed&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;description&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;Card declined for order #4821&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">file_input<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">perceive_file_upload<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;invoice_q3.pdf&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">184320<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;utility\/pdf&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">inp <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">text_input<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">webhook_input<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">file_input<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;[{inp.source.value}] content material=&#8221;{inp.content material}&#8221;&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8221;\u00a0\u00a0metadata keys: {record(inp.metadata.keys())}n&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div><\/div><\/div>\n<p>How you can run: python notion.py, no dependencies required.<\/p>\n<p>Three fully completely different uncooked shapes \u2014 plain textual content, a webhook JSON payload, and a file-upload occasion \u2014 all collapse into the identical AgentInput construction. The reasoning part downstream by no means must know or care which channel one thing arrived by means of. That\u2019s the whole worth of treating notion as its personal part fairly than inlining advert hoc parsing wherever enter occurs to enter the system.<\/p>\n<h2>Working Context vs. What Really Persists<\/h2>\n<p>That is the part with essentially the most nuance, and the one demo code will get fallacious most frequently by treating \u201creminiscence\u201d as simply \u201cthe dialog thus far.\u201d Manufacturing reminiscence structure separates working reminiscence \u2014 the fast context window for the present process \u2014 from long-term reminiscence, which itself splits into episodic reminiscence (what occurred), semantic reminiscence (details realized), and procedural reminiscence (abilities and how-to data). Brief-term reminiscence lives in-context and is actually free; long-term reminiscence sometimes lives in a vector retailer, listed for semantic retrieval fairly than actual match.<\/p>\n<p>The operational distinction issues: working reminiscence is quick and disposable \u2014 it evaporates the second the session ends. Episodic reminiscence offers the agent one thing working reminiscence structurally can&#8217;t present: hindsight throughout periods, the flexibility to recall \u201cwe dealt with one thing like this earlier than, and right here\u2019s what occurred.\u201d<\/p>\n<div id=\"urvanov-syntax-highlighter-6a6cbf60dd91e641212548\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" touchscreen minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\n# reminiscence.py&#13;<br \/>\n# Conditions: none past Python&#8217;s normal library&#13;<br \/>\n# Run: python reminiscence.py&#13;<br \/>\n&#13;<br \/>\nfrom dataclasses import dataclass, subject&#13;<br \/>\nfrom datetime import datetime, timezone&#13;<br \/>\n&#13;<br \/>\n@dataclass&#13;<br \/>\nclass WorkingMemory:&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    Working reminiscence: the fast context for the CURRENT process solely.&#13;<br \/>\n    Lives in-process, bounded by a flip restrict, and is gone the second&#13;<br \/>\n    the session ends. That is what most demo code calls &#8220;reminiscence&#8221; &#8211;&#13;<br \/>\n    but it surely&#8217;s just one piece of the actual image.&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    max_turns: int = 10&#13;<br \/>\n    turns: record[dict] = subject(default_factory=record)&#13;<br \/>\n&#13;<br \/>\n    def add_turn(self, position: str, content material: str) -&gt; None:&#13;<br \/>\n        self.turns.append({&#8220;position&#8221;: position, &#8220;content material&#8221;: content material})&#13;<br \/>\n        if len(self.turns) &gt; self.max_turns:&#13;<br \/>\n            self.turns.pop(0)   # Oldest flip drops off as soon as the restrict is hit&#13;<br \/>\n&#13;<br \/>\n    def as_context(self) -&gt; str:&#13;<br \/>\n        return &#8220;n&#8221;.be a part of(f&#8221;{t[&#8216;role&#8217;]}: {t[&#8216;content&#8217;]}&#8221; for t in self.turns)&#13;<br \/>\n&#13;<br \/>\n&#13;<br \/>\n@dataclass&#13;<br \/>\nclass EpisodicMemoryEntry:&#13;<br \/>\n    &#8220;&#8221;&#8221;A single saved episode &#8212; what occurred, when, and its embedding for later recall.&#8221;&#8221;&#8221;&#13;<br \/>\n    timestamp: str&#13;<br \/>\n    abstract: str&#13;<br \/>\n    embedding: record[float]   # In manufacturing this comes from an actual embedding mannequin&#13;<br \/>\n&#13;<br \/>\nclass EpisodicMemory:&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    Episodic reminiscence: persists ACROSS periods, saved externally&#13;<br \/>\n    (a vector retailer in manufacturing), and retrieved by semantic similarity&#13;<br \/>\n    fairly than recency. That is what offers an agent &#8220;hindsight&#8221; &#8212; a&#13;<br \/>\n    functionality working reminiscence structurally can&#8217;t have, because it&#8217;s gone&#13;<br \/>\n    the moment the session ends.&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    def __init__(self):&#13;<br \/>\n        self._store: record[EpisodicMemoryEntry] = []&#13;<br \/>\n&#13;<br \/>\n    def record_episode(self, abstract: str, embedding: record[float]) -&gt; None:&#13;<br \/>\n        self._store.append(EpisodicMemoryEntry(&#13;<br \/>\n            timestamp=datetime.now(timezone.utc).isoformat(),&#13;<br \/>\n            abstract=abstract,&#13;<br \/>\n            embedding=embedding,&#13;<br \/>\n        ))&#13;<br \/>\n&#13;<br \/>\n    def retrieve_similar(self, query_embedding: record[float], top_k: int = 2) -&gt; record[EpisodicMemoryEntry]:&#13;<br \/>\n        &#8220;&#8221;&#8221;Actual implementations do cosine similarity in opposition to a vector index.&#8221;&#8221;&#8221;&#13;<br \/>\n        def dot(a, b): return sum(x * y for x, y in zip(a, b))&#13;<br \/>\n        ranked = sorted(self._store, key=lambda e: dot(e.embedding, query_embedding), reverse=True)&#13;<br \/>\n        return ranked[:top_k]&#13;<br \/>\n&#13;<br \/>\n&#13;<br \/>\nif __name__ == &#8220;__main__&#8221;:&#13;<br \/>\n    wm = WorkingMemory(max_turns=3)&#13;<br \/>\n    wm.add_turn(&#8220;consumer&#8221;, &#8220;What&#8217;s my refund standing?&#8221;)&#13;<br \/>\n    wm.add_turn(&#8220;agent&#8221;, &#8220;Let me examine that for you.&#8221;)&#13;<br \/>\n    wm.add_turn(&#8220;consumer&#8221;, &#8220;It is order 4821&#8221;)&#13;<br \/>\n    wm.add_turn(&#8220;agent&#8221;, &#8220;Discovered it &#8212; refund is processing&#8221;)  # pushes the primary prove&#13;<br \/>\n&#13;<br \/>\n    print(&#8220;Working reminiscence (bounded to final 3 turns):&#8221;)&#13;<br \/>\n    print(wm.as_context())&#13;<br \/>\n&#13;<br \/>\n    em = EpisodicMemory()&#13;<br \/>\n    em.record_episode(&#8220;Consumer requested about refund for order 4821, resolved efficiently&#8221;, [0.9, 0.1, 0.0])&#13;<br \/>\n    em.record_episode(&#8220;Consumer requested about delivery delay for order 1190&#8221;, [0.1, 0.9, 0.0])&#13;<br \/>\n    em.record_episode(&#8220;Consumer requested about refund eligibility for order 7734&#8221;, [0.85, 0.15, 0.0])&#13;<br \/>\n&#13;<br \/>\n    comparable = em.retrieve_similar([0.88, 0.12, 0.0], top_k=2)&#13;<br \/>\n    print(&#8220;nEpisodic reminiscence &#8212; retrieved by similarity to a brand new refund question:&#8221;)&#13;<br \/>\n    for entry in comparable:&#13;<br \/>\n        print(f&#8221;  {entry.abstract}&#8221;)<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"urvanov-syntax-highlighter-nums-content\" style=\"font-size: 12px !important; line-height: 15px !important;\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<p>32<\/p>\n<p>33<\/p>\n<p>34<\/p>\n<p>35<\/p>\n<p>36<\/p>\n<p>37<\/p>\n<p>38<\/p>\n<p>39<\/p>\n<p>40<\/p>\n<p>41<\/p>\n<p>42<\/p>\n<p>43<\/p>\n<p>44<\/p>\n<p>45<\/p>\n<p>46<\/p>\n<p>47<\/p>\n<p>48<\/p>\n<p>49<\/p>\n<p>50<\/p>\n<p>51<\/p>\n<p>52<\/p>\n<p>53<\/p>\n<p>54<\/p>\n<p>55<\/p>\n<p>56<\/p>\n<p>57<\/p>\n<p>58<\/p>\n<p>59<\/p>\n<p>60<\/p>\n<p>61<\/p>\n<p>62<\/p>\n<p>63<\/p>\n<p>64<\/p>\n<p>65<\/p>\n<p>66<\/p>\n<p>67<\/p>\n<p>68<\/p>\n<p>69<\/p>\n<p>70<\/p>\n<p>71<\/p>\n<p>72<\/p>\n<p>73<\/p>\n<p>74<\/p>\n<p>75<\/p>\n<p>76<\/p>\n<p>77<\/p>\n<p>78<\/p>\n<\/div>\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-p\"># reminiscence.py<\/span><\/p>\n<p><span class=\"crayon-p\"># Conditions: none past Python&#8217;s normal library<\/span><\/p>\n<p><span class=\"crayon-p\"># Run: python reminiscence.py<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">dataclasses <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-v\">dataclass<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">subject<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">datetime <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-v\">datetime<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">timezone<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-sy\">@<\/span><span class=\"crayon-e\">dataclass<\/span><\/p>\n<p><span class=\"crayon-t\">class<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">WorkingMemory<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0Working reminiscence: the fast context for the CURRENT process solely.<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0Lives in-process, bounded by a flip restrict, and is gone the second<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0the session ends. That is what most demo code calls &#8220;<\/span><span class=\"crayon-i\">reminiscence<\/span><span class=\"crayon-s\">&#8221; &#8212;<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0but it surely&#8217;s just one piece of the actual image.<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0&#8220;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">max_turns<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">int<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">10<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">turns<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">record<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">dict<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">subject<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">default_factory<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">record<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">add_turn<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">position<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">content material<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">None<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">turns<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">append<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;position&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">position<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;content material&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">content material<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">len<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">turns<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">max_turns<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">turns<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">pop<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-p\"># Oldest flip drops off as soon as the restrict is hit<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">as_context<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;n&#8221;<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">be a part of<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;{t[&#8216;role&#8217;]}: {t[&#8216;content&#8217;]}&#8221;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">t<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">turns<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-sy\">@<\/span><span class=\"crayon-e\">dataclass<\/span><\/p>\n<p><span class=\"crayon-t\">class<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">EpisodicMemoryEntry<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;A single saved episode &#8212; what occurred, when, and its embedding for later recall.&#8221;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">timestamp<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">abstract<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">embedding<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">record<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-t\">float<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-p\"># In manufacturing this comes from an actual embedding mannequin<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-t\">class<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">EpisodicMemory<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0Episodic reminiscence: persists ACROSS periods, saved externally<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0(a vector retailer in manufacturing), and retrieved by semantic similarity<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0fairly than recency. That is what offers an agent &#8220;<\/span><span class=\"crayon-i\">hindsight<\/span><span class=\"crayon-s\">&#8221; &#8212; a<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0functionality working reminiscence structurally can&#8217;t have, because it&#8217;s gone<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0the moment the session ends.<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0&#8220;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">__init__<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">_store<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">record<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">EpisodicMemoryEntry<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">record_episode<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">abstract<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">embedding<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">record<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-t\">float<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">None<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">_store<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">append<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-e\">EpisodicMemoryEntry<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">timestamp<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">datetime<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">now<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">timezone<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">utc<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">isoformat<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">abstract<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">abstract<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">embedding<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">embedding<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">retrieve_similar<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">query_embedding<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">record<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-t\">float<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">top_k<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">int<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">2<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">record<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">EpisodicMemoryEntry<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;Actual implementations do cosine similarity in opposition to a vector index.&#8221;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">dot<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">a<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">b<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">sum<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-e \">x *<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">y<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">x<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">y<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">zip<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">a<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">b<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">ranked<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">sorted<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">_store<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">key<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-i\">lambda<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">e<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">dot<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">e<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">embedding<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">query_embedding<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">reverse<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-t\">True<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">ranked<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-v\">top_k<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">__name__<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">==<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;__main__&#8221;<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">wm<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">WorkingMemory<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">max_turns<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">3<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">wm<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">add_turn<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;consumer&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;What&#8217;s my refund standing?&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">wm<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">add_turn<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;agent&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;Let me examine that for you.&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">wm<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">add_turn<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;consumer&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;It is order 4821&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">wm<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">add_turn<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;agent&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;Discovered it &#8212; refund is processing&#8221;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-p\"># pushes the primary prove<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;Working reminiscence (bounded to final 3 turns):&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">wm<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">as_context<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">em<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">EpisodicMemory<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">em<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">record_episode<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;Consumer requested about refund for order 4821, resolved efficiently&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-cn\">0.9<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0.1<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0.0<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">em<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">record_episode<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;Consumer requested about delivery delay for order 1190&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-cn\">0.1<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0.9<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0.0<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">em<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">record_episode<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;Consumer requested about refund eligibility for order 7734&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-cn\">0.85<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0.15<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0.0<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">comparable<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">em<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">retrieve_similar<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-cn\">0.88<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0.12<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0.0<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">top_k<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">2<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;nEpisodic reminiscence &#8212; retrieved by similarity to a brand new refund question:&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">entry <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">comparable<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8221;\u00a0\u00a0{entry.abstract}&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div><\/div><\/div>\n<p>How you can run: python reminiscence.py, no dependencies required.<\/p>\n<p>Working reminiscence drops its oldest flip as soon as the restrict is hit, and the primary trade about checking the standing is passed by the top of the session. Episodic reminiscence does the other: it surfaces the 2 refund-related episodes out of three saved entries, ranked by which means, not by once they occurred. That\u2019s the structural line between the 2 \u2014 one is a sliding window, the opposite is a searchable archive.<\/p>\n<h2>Reasoning and Planning (Deciding What to Do Subsequent)<\/h2>\n<p>Reasoning and planning take the present objective, the perceived enter, and no matter reminiscence was retrieved, and produce a plan \u2014 generally a single subsequent motion, generally a multi-step decomposition. That is the agent\u2019s cognitive core, consulting reminiscence and data assets to synthesize motion plans that get handed off to the execution module.<\/p>\n<p>The vital design level, straightforward to overlook: planning\u2019s duty ends at producing the plan. It doesn&#8217;t name a instrument, contact an API, or have any unwanted effects. That separation is deliberate, and it\u2019s what makes the subsequent part \u2014 instrument execution \u2014 independently testable and independently guardable.<\/p>\n<div id=\"urvanov-syntax-highlighter-6a6cbf60dd934463721711\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" touchscreen minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\n# planning.py&#13;<br \/>\n# Conditions: none past Python&#8217;s normal library&#13;<br \/>\n# Run: python planning.py&#13;<br \/>\n&#13;<br \/>\nfrom dataclasses import dataclass, subject&#13;<br \/>\nimport json&#13;<br \/>\n&#13;<br \/>\n@dataclass&#13;<br \/>\nclass PlanStep:&#13;<br \/>\n    step_number: int&#13;<br \/>\n    description: str&#13;<br \/>\n    tool_tag: str   # which class of instrument this step will want &#8212; execution decides HOW&#13;<br \/>\n&#13;<br \/>\n@dataclass&#13;<br \/>\nclass Plan:&#13;<br \/>\n    objective: str&#13;<br \/>\n    steps: record[PlanStep] = subject(default_factory=record)&#13;<br \/>\n&#13;<br \/>\ndef mock_llm_plan(objective: str) -&gt; str:&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    Mock LLM name standing in for an actual planning name. The purpose being&#13;<br \/>\n    demonstrated is structural: planning PRODUCES a plan object &#8212; it does&#13;<br \/>\n    not execute something. Execution is a separate part (subsequent part)&#13;<br \/>\n    that the plan will get handed off to.&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    if &#8220;refund&#8221; in objective.decrease():&#13;<br \/>\n        return json.dumps({&#13;<br \/>\n            &#8220;steps&#8221;: [&#13;<br \/>\n                {&#8220;step_number&#8221;: 1, &#8220;description&#8221;: &#8220;Look up the order by ID&#8221;, &#8220;tool_tag&#8221;: &#8220;database_lookup&#8221;},&#13;<br \/>\n                {&#8220;step_number&#8221;: 2, &#8220;description&#8221;: &#8220;Check refund eligibility against policy&#8221;, &#8220;tool_tag&#8221;: &#8220;policy_check&#8221;},&#13;<br \/>\n                {&#8220;step_number&#8221;: 3, &#8220;description&#8221;: &#8220;Issue the refund if eligible&#8221;, &#8220;tool_tag&#8221;: &#8220;payment_api&#8221;},&#13;<br \/>\n                {&#8220;step_number&#8221;: 4, &#8220;description&#8221;: &#8220;Notify the customer of the outcome&#8221;, &#8220;tool_tag&#8221;: &#8220;email&#8221;},&#13;<br \/>\n            ]&#13;<br \/>\n        })&#13;<br \/>\n    return json.dumps({&#8220;steps&#8221;: [&#13;<br \/>\n        {&#8220;step_number&#8221;: 1, &#8220;description&#8221;: &#8220;Search knowledge base for the answer&#8221;, &#8220;tool_tag&#8221;: &#8220;search&#8221;},&#13;<br \/>\n    ]})&#13;<br \/>\n&#13;<br \/>\ndef create_plan(objective: str) -&gt; Plan:&#13;<br \/>\n    &#8220;&#8221;&#8221;Take a objective, produce a structured plan. Nothing right here has a facet impact.&#8221;&#8221;&#8221;&#13;<br \/>\n    parsed = json.masses(mock_llm_plan(objective))&#13;<br \/>\n    return Plan(objective=objective, steps=[PlanStep(**s) for s in parsed[&#8220;steps&#8221;]])&#13;<br \/>\n&#13;<br \/>\n&#13;<br \/>\nif __name__ == &#8220;__main__&#8221;:&#13;<br \/>\n    for objective in [&#8220;Process a refund for order 4821&#8221;, &#8220;What are your business hours?&#8221;]:&#13;<br \/>\n        plan = create_plan(objective)&#13;<br \/>\n        print(f&#8221;Objective: {plan.objective}&#8221;)&#13;<br \/>\n        for step in plan.steps:&#13;<br \/>\n            print(f&#8221;  Step {step.step_number}: {step.description} [tool_tag={step.tool_tag}]&#8221;)&#13;<br \/>\n        print()<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"urvanov-syntax-highlighter-nums-content\" style=\"font-size: 12px !important; line-height: 15px !important;\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<p>32<\/p>\n<p>33<\/p>\n<p>34<\/p>\n<p>35<\/p>\n<p>36<\/p>\n<p>37<\/p>\n<p>38<\/p>\n<p>39<\/p>\n<p>40<\/p>\n<p>41<\/p>\n<p>42<\/p>\n<p>43<\/p>\n<p>44<\/p>\n<p>45<\/p>\n<p>46<\/p>\n<p>47<\/p>\n<p>48<\/p>\n<p>49<\/p>\n<p>50<\/p>\n<p>51<\/p>\n<\/div>\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-p\"># planning.py<\/span><\/p>\n<p><span class=\"crayon-p\"># Conditions: none past Python&#8217;s normal library<\/span><\/p>\n<p><span class=\"crayon-p\"># Run: python planning.py<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">dataclasses <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-v\">dataclass<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">subject<\/span><\/p>\n<p><span class=\"crayon-e\">import <\/span><span class=\"crayon-i\">json<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-sy\">@<\/span><span class=\"crayon-e\">dataclass<\/span><\/p>\n<p><span class=\"crayon-t\">class<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">PlanStep<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">step_number<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">int<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">description<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">tool_tag<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">str<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-p\"># which class of instrument this step will want &#8212; execution decides HOW<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-sy\">@<\/span><span class=\"crayon-e\">dataclass<\/span><\/p>\n<p><span class=\"crayon-t\">class<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">Plan<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">objective<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">steps<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">record<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">PlanStep<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">subject<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">default_factory<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">record<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">mock_llm_plan<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">objective<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0Mock LLM name standing in for an actual planning name. The purpose being<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0demonstrated is structural: planning PRODUCES a plan object &#8212; it does<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0not execute something. Execution is a separate part (subsequent part)<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0that the plan will get handed off to.<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0&#8220;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;refund&#8221;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">objective<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">decrease<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">json<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">dumps<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;steps&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;step_number&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;description&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;Look up the order by ID&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;tool_tag&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;database_lookup&#8221;<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;step_number&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">2<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;description&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;Check refund eligibility against policy&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;tool_tag&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;policy_check&#8221;<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;step_number&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">3<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;description&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;Issue the refund if eligible&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;tool_tag&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;payment_api&#8221;<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;step_number&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">4<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;description&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;Notify the customer of the outcome&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;tool_tag&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;email&#8221;<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">json<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">dumps<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;steps&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;step_number&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;description&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;Search knowledge base for the answer&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;tool_tag&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;search&#8221;<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">create_plan<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">objective<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">Plan<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;Take a objective, produce a structured plan. Nothing right here has a facet impact.&#8221;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">parsed<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">json<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">masses<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-e\">mock_llm_plan<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">objective<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">Plan<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">objective<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">objective<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">steps<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-e\">PlanStep<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-v\">s<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">s<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">parsed<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8220;steps&#8221;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">__name__<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">==<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;__main__&#8221;<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">objective <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8220;Process a refund for order 4821&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;What are your business hours?&#8221;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">plan<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">create_plan<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">objective<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Objective: {plan.objective}&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">step <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">plan<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">steps<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8221;\u00a0\u00a0Step {step.step_number}: {step.description} [tool_tag={step.tool_tag}]&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div><\/div><\/div>\n<p>How you can run: python planning.py, no dependencies required.<\/p>\n<p>The refund objective produces a four-step plan; the business-hours query produces one. Neither name executed a single instrument \u2014 each simply returned a Plan object describing what ought to occur subsequent. That object is the handoff artifact between reasoning and the remainder of the pipeline, which is precisely why orchestration (lined later) can select to pause, modify, or reject a plan earlier than something in it really runs.<\/p>\n<h2>Device Execution<\/h2>\n<p>Device execution connects brokers to exterior techniques \u2014 APIs, databases, and companies \u2014 dealing with the mechanics of invoking a functionality and feeding the end result again into the reasoning course of. It\u2019s additionally the place most manufacturing incidents really originate, as a result of it\u2019s the one part within the loop with actual, exterior unwanted effects.<\/p>\n<p>The constraint is value stating in plain numbers: at a 5% per-action failure fee, an agent taking 20 actions in a run will fail usually sufficient to be unusable with out guardrails. That single statistic is why instrument execution can\u2019t simply be \u201cname the API and hope\u201d \u2014 it wants validation, a timeout, and idempotency as baseline necessities, not nice-to-haves.<\/p>\n<div id=\"urvanov-syntax-highlighter-6a6cbf60dd93f114437447\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" touchscreen minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\n# tool_execution.py&#13;<br \/>\n# Conditions: none past Python&#8217;s normal library&#13;<br \/>\n# Run: python tool_execution.py&#13;<br \/>\n&#13;<br \/>\nimport time&#13;<br \/>\nimport hashlib&#13;<br \/>\nfrom dataclasses import dataclass&#13;<br \/>\nfrom typing import Callable, Any, Elective&#13;<br \/>\n&#13;<br \/>\n@dataclass&#13;<br \/>\nclass ToolResult:&#13;<br \/>\n    success: bool&#13;<br \/>\n    output: Any = None&#13;<br \/>\n    error: Elective[str] = None&#13;<br \/>\n    idempotency_key: Elective[str] = None&#13;<br \/>\n    from_cache: bool = False&#13;<br \/>\n&#13;<br \/>\nclass ToolExecutor:&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    The non-negotiable fundamentals for instrument execution: validate inputs earlier than&#13;<br \/>\n    calling something, implement a timeout so a sluggish name cannot hold the&#13;<br \/>\n    complete run, and make side-effecting calls idempotent so a retry&#13;<br \/>\n    would not double-charge a buyer or double-send an e-mail.&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    def __init__(self, timeout_seconds: float = 5.0):&#13;<br \/>\n        self.timeout_seconds = timeout_seconds&#13;<br \/>\n        self._idempotency_cache: dict[str, ToolResult] = {}&#13;<br \/>\n&#13;<br \/>\n    def _make_idempotency_key(self, tool_name: str, args: dict) -&gt; str:&#13;<br \/>\n        uncooked = f&#8221;{tool_name}:{sorted(args.objects())}&#8221;&#13;<br \/>\n        return hashlib.sha256(uncooked.encode()).hexdigest()[:16]&#13;<br \/>\n&#13;<br \/>\n    def execute(self, tool_name: str, tool_fn: Callable, args: dict,&#13;<br \/>\n                required_args: record[str], idempotent: bool = False) -&gt; ToolResult:&#13;<br \/>\n        # 1. Validate earlier than touching something exterior&#13;<br \/>\n        lacking = [a for a in required_args if a not in args]&#13;<br \/>\n        if lacking:&#13;<br \/>\n            return ToolResult(success=False, error=f&#8221;Lacking required args: {lacking}&#8221;)&#13;<br \/>\n&#13;<br \/>\n        # 2. Idempotency &#8212; a retried name with similar args returns the cached end result&#13;<br \/>\n        idem_key = self._make_idempotency_key(tool_name, args) if idempotent else None&#13;<br \/>\n        if idem_key and idem_key in self._idempotency_cache:&#13;<br \/>\n            cached = self._idempotency_cache[idem_key]&#13;<br \/>\n            return ToolResult(success=cached.success, output=cached.output,&#13;<br \/>\n                              idempotency_key=idem_key, from_cache=True)&#13;<br \/>\n&#13;<br \/>\n        # 3. Execute in opposition to a timeout funds&#13;<br \/>\n        begin = time.monotonic()&#13;<br \/>\n        attempt:&#13;<br \/>\n            output = tool_fn(**args)&#13;<br \/>\n        besides Exception as e:&#13;<br \/>\n            return ToolResult(success=False, error=str(e), idempotency_key=idem_key)&#13;<br \/>\n&#13;<br \/>\n        if (time.monotonic() &#8211; begin) &gt; self.timeout_seconds:&#13;<br \/>\n            return ToolResult(success=False, error=f&#8221;Device exceeded {self.timeout_seconds}s timeout&#8221;,&#13;<br \/>\n                              idempotency_key=idem_key)&#13;<br \/>\n&#13;<br \/>\n        end result = ToolResult(success=True, output=output, idempotency_key=idem_key)&#13;<br \/>\n        if idem_key:&#13;<br \/>\n            self._idempotency_cache[idem_key] = end result&#13;<br \/>\n        return end result&#13;<br \/>\n&#13;<br \/>\n&#13;<br \/>\ndef issue_refund(order_id: str, quantity: float) -&gt; str:&#13;<br \/>\n    return f&#8221;Refunded ${quantity} for order {order_id}&#8221;&#13;<br \/>\n&#13;<br \/>\n&#13;<br \/>\nif __name__ == &#8220;__main__&#8221;:&#13;<br \/>\n    executor = ToolExecutor(timeout_seconds=1.0)&#13;<br \/>\n&#13;<br \/>\n    # Lacking arg &#8212; caught earlier than execution&#13;<br \/>\n    r1 = executor.execute(&#8220;issue_refund&#8221;, issue_refund, {&#8220;order_id&#8221;: &#8220;4821&#8221;}, [&#8220;order_id&#8221;, &#8220;amount&#8221;])&#13;<br \/>\n    print(f&#8221;Lacking arg check:  success={r1.success}, error=&#8221;{r1.error}&#8221;&#8221;)&#13;<br \/>\n&#13;<br \/>\n    # First name executes, retry with similar args hits the idempotency cache&#13;<br \/>\n    args = {&#8220;order_id&#8221;: &#8220;4821&#8221;, &#8220;quantity&#8221;: 49.99}&#13;<br \/>\n    r2a = executor.execute(&#8220;issue_refund&#8221;, issue_refund, args, [&#8220;order_id&#8221;, &#8220;amount&#8221;], idempotent=True)&#13;<br \/>\n    r2b = executor.execute(&#8220;issue_refund&#8221;, issue_refund, args, [&#8220;order_id&#8221;, &#8220;amount&#8221;], idempotent=True)&#13;<br \/>\n    print(f&#8221;nFirst name:        from_cache={r2a.from_cache}, output=&#8221;{r2a.output}&#8221;&#8221;)&#13;<br \/>\n    print(f&#8221;Retry, identical args:  from_cache={r2b.from_cache}, output=&#8221;{r2b.output}&#8221;&#8221;)<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"urvanov-syntax-highlighter-nums-content\" style=\"font-size: 12px !important; line-height: 15px !important;\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<p>32<\/p>\n<p>33<\/p>\n<p>34<\/p>\n<p>35<\/p>\n<p>36<\/p>\n<p>37<\/p>\n<p>38<\/p>\n<p>39<\/p>\n<p>40<\/p>\n<p>41<\/p>\n<p>42<\/p>\n<p>43<\/p>\n<p>44<\/p>\n<p>45<\/p>\n<p>46<\/p>\n<p>47<\/p>\n<p>48<\/p>\n<p>49<\/p>\n<p>50<\/p>\n<p>51<\/p>\n<p>52<\/p>\n<p>53<\/p>\n<p>54<\/p>\n<p>55<\/p>\n<p>56<\/p>\n<p>57<\/p>\n<p>58<\/p>\n<p>59<\/p>\n<p>60<\/p>\n<p>61<\/p>\n<p>62<\/p>\n<p>63<\/p>\n<p>64<\/p>\n<p>65<\/p>\n<p>66<\/p>\n<p>67<\/p>\n<p>68<\/p>\n<p>69<\/p>\n<p>70<\/p>\n<p>71<\/p>\n<p>72<\/p>\n<p>73<\/p>\n<p>74<\/p>\n<p>75<\/p>\n<p>76<\/p>\n<p>77<\/p>\n<p>78<\/p>\n<p>79<\/p>\n<p>80<\/p>\n<\/div>\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-p\"># tool_execution.py<\/span><\/p>\n<p><span class=\"crayon-p\"># Conditions: none past Python&#8217;s normal library<\/span><\/p>\n<p><span class=\"crayon-p\"># Run: python tool_execution.py<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">time<\/span><\/p>\n<p><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">hashlib<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">dataclasses <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">dataclass<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">typing <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-v\">Callable<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">Any<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">Elective<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-sy\">@<\/span><span class=\"crayon-e\">dataclass<\/span><\/p>\n<p><span class=\"crayon-t\">class<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">ToolResult<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">success<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">bool<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">output<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">Any<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">None<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">error<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">Elective<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">None<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">idempotency_key<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">Elective<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">None<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">from_cache<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">bool<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">False<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-t\">class<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">ToolExecutor<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0The non-negotiable fundamentals for instrument execution: validate inputs earlier than<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0calling something, implement a timeout so a sluggish name cannot hold the<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0complete run, and make side-effecting calls idempotent so a retry<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0would not double-charge a buyer or double-send an e-mail.<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0&#8220;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">__init__<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">timeout_seconds<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">float<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">5.0<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">timeout_seconds<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">timeout_seconds<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">_idempotency_cache<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">dict<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">ToolResult<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-sy\">}<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">_make_idempotency_key<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">tool_name<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">args<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">dict<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">uncooked<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;{tool_name}:{sorted(args.objects())}&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">hashlib<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">sha256<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">uncooked<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">encode<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">hexdigest<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">16<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">execute<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">tool_name<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">tool_fn<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">Callable<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">args<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">dict<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">required_args<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">record<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">idempotent<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">bool<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">False<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">ToolResult<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># 1. Validate earlier than touching something exterior<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">lacking<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-i\">a<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">a<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">required_args <\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">a<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">not<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">args<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">lacking<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">ToolResult<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">success<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-t\">False<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">error<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Lacking required args: {lacking}&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># 2. Idempotency &#8212; a retried name with similar args returns the cached end result<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">idem_key<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">_make_idempotency_key<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">tool_name<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">args<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">idempotent <\/span><span class=\"crayon-st\">else<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">None<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">idem_key <\/span><span class=\"crayon-st\">and<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">idem_key <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">_idempotency_cache<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">cached<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">_idempotency_cache<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">idem_key<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">ToolResult<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">success<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">cached<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">success<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">output<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">cached<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">output<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">idempotency_key<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">idem_key<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">from_cache<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-t\">True<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># 3. Execute in opposition to a timeout funds<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">begin<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">time<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">monotonic<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">attempt<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">output<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">tool_fn<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-v\">args<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">besides <\/span><span class=\"crayon-e\">Exception <\/span><span class=\"crayon-st\">as<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">e<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">ToolResult<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">success<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-t\">False<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">error<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-e\">str<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">e<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">idempotency_key<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">idem_key<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">time<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">monotonic<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">begin<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">timeout_seconds<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">ToolResult<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">success<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-t\">False<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">error<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Device exceeded {self.timeout_seconds}s timeout&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">idempotency_key<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">idem_key<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">end result<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">ToolResult<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">success<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-t\">True<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">output<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">output<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">idempotency_key<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">idem_key<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">idem_key<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">_idempotency_cache<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">idem_key<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">end result<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">end result<\/span><\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">issue_refund<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">order_id<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">quantity<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">float<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Refunded ${quantity} for order {order_id}&#8221;<\/span><\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">__name__<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">==<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;__main__&#8221;<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">executor<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">ToolExecutor<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">timeout_seconds<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">1.0<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># Lacking arg &#8212; caught earlier than execution<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">r1<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">executor<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">execute<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;issue_refund&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">issue_refund<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;order_id&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;4821&#8221;<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8220;order_id&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;amount&#8221;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Lacking arg check:\u00a0\u00a0success={r1.success}, error=&#8221;{r1.error}&#8221;&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># First name executes, retry with similar args hits the idempotency cache<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">args<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;order_id&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;4821&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;quantity&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">49.99<\/span><span class=\"crayon-sy\">}<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">r2a<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">executor<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">execute<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;issue_refund&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">issue_refund<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">args<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8220;order_id&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;amount&#8221;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">idempotent<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-t\">True<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">r2b<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">executor<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">execute<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;issue_refund&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">issue_refund<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">args<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8220;order_id&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;amount&#8221;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">idempotent<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-t\">True<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;nFirst name:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0from_cache={r2a.from_cache}, output=&#8221;{r2a.output}&#8221;&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Retry, identical args:\u00a0\u00a0from_cache={r2b.from_cache}, output=&#8221;{r2b.output}&#8221;&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div><\/div><\/div>\n<p>How you can run: python tool_execution.py, no dependencies required.<\/p>\n<p>The retry with similar arguments returns the cached end result as an alternative of calling issue_refund a second time. The client will get refunded as soon as, not twice, even when the orchestrator above it retries the step after a transient community blip. That\u2019s the whole goal of constructing idempotency into the execution layer fairly than hoping the orchestrator by no means retries.<\/p>\n<h2>Orchestration<\/h2>\n<p>Orchestration holds the loop collectively throughout a number of steps and, in multi-agent techniques, throughout a number of brokers \u2014 deciding when to proceed, when a step\u2019s final result ought to change the trail, and when the run is definitely completed. That is the layer that has matured quickest lately, with LangGraph, CrewAI, and AutoGen now dealing with production-grade coordination fairly than each group hand-rolling their very own loop from scratch.<\/p>\n<div id=\"urvanov-syntax-highlighter-6a6cbf60dd946296533615\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" touchscreen minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\n# orchestrator.py&#13;<br \/>\n# Conditions: none past Python&#8217;s normal library&#13;<br \/>\n# Run: python orchestrator.py&#13;<br \/>\n&#13;<br \/>\nfrom dataclasses import dataclass, subject&#13;<br \/>\n&#13;<br \/>\n@dataclass&#13;<br \/>\nclass PlanStep:&#13;<br \/>\n    step_number: int&#13;<br \/>\n    description: str&#13;<br \/>\n    tool_tag: str&#13;<br \/>\n&#13;<br \/>\n@dataclass&#13;<br \/>\nclass Plan:&#13;<br \/>\n    objective: str&#13;<br \/>\n    steps: record[PlanStep] = subject(default_factory=record)&#13;<br \/>\n&#13;<br \/>\n@dataclass&#13;<br \/>\nclass StepOutcome:&#13;<br \/>\n    step_number: int&#13;<br \/>\n    success: bool&#13;<br \/>\n    output: str&#13;<br \/>\n&#13;<br \/>\n# Stand-ins for the planning and tool-execution parts above &#8211;&#13;<br \/>\n# orchestration&#8217;s job is to CALL these in sequence, not do their work itself.&#13;<br \/>\ndef mock_create_plan(objective: str) -&gt; Plan:&#13;<br \/>\n    return Plan(objective=objective, steps=[&#13;<br \/>\n        PlanStep(1, &#8220;Look up order&#8221;, &#8220;database_lookup&#8221;),&#13;<br \/>\n        PlanStep(2, &#8220;Check eligibility&#8221;, &#8220;policy_check&#8221;),&#13;<br \/>\n        PlanStep(3, &#8220;Issue refund&#8221;, &#8220;payment_api&#8221;),&#13;<br \/>\n    ])&#13;<br \/>\n&#13;<br \/>\ndef mock_execute_tool(step: PlanStep) -&gt; StepOutcome:&#13;<br \/>\n    if step.tool_tag == &#8220;policy_check&#8221;:  # simulate a failure to check cease logic&#13;<br \/>\n        return StepOutcome(step.step_number, success=False, output=&#8221;Coverage examine failed: order too previous&#8221;)&#13;<br \/>\n    return StepOutcome(step.step_number, success=True, output=f&#8221;Accomplished: {step.description}&#8221;)&#13;<br \/>\n&#13;<br \/>\nclass Orchestrator:&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    Holds the sequence collectively throughout a number of steps, decides whether or not to&#13;<br \/>\n    proceed or cease, and caps the run with an specific step restrict. It does&#13;<br \/>\n    not plan and it doesn&#8217;t execute instruments &#8212; it calls the parts that do.&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    def __init__(self, max_steps: int = 10):&#13;<br \/>\n        self.max_steps = max_steps&#13;<br \/>\n&#13;<br \/>\n    def run(self, objective: str) -&gt; record[StepOutcome]:&#13;<br \/>\n        plan = mock_create_plan(objective)&#13;<br \/>\n        outcomes: record[StepOutcome] = []&#13;<br \/>\n&#13;<br \/>\n        for step in plan.steps:&#13;<br \/>\n            if len(outcomes) &gt;= self.max_steps:&#13;<br \/>\n                print(f&#8221;  Step restrict ({self.max_steps}) reached &#8212; stopping.&#8221;)&#13;<br \/>\n                break&#13;<br \/>\n&#13;<br \/>\n            print(f&#8221;  Executing step {step.step_number}: {step.description}&#8221;)&#13;<br \/>\n            final result = mock_execute_tool(step)&#13;<br \/>\n            outcomes.append(final result)&#13;<br \/>\n&#13;<br \/>\n            if not final result.success:&#13;<br \/>\n                print(f&#8221;  Step {step.step_number} failed: {final result.output}&#8221;)&#13;<br \/>\n                print(f&#8221;  Stopping run &#8212; a failed step blocks the remainder of this plan.&#8221;)&#13;<br \/>\n                break&#13;<br \/>\n&#13;<br \/>\n        return outcomes&#13;<br \/>\n&#13;<br \/>\n&#13;<br \/>\nif __name__ == &#8220;__main__&#8221;:&#13;<br \/>\n    outcomes = Orchestrator(max_steps=10).run(&#8220;Course of a refund for order 4821&#8243;)&#13;<br \/>\n    print(f&#8221;nTotal steps tried: {len(outcomes)}&#8221;)&#13;<br \/>\n    print(f&#8221;Closing final result: success={outcomes[-1].success}, output=&#8221;{outcomes[-1].output}&#8221;&#8221;)<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"urvanov-syntax-highlighter-nums-content\" style=\"font-size: 12px !important; line-height: 15px !important;\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<p>32<\/p>\n<p>33<\/p>\n<p>34<\/p>\n<p>35<\/p>\n<p>36<\/p>\n<p>37<\/p>\n<p>38<\/p>\n<p>39<\/p>\n<p>40<\/p>\n<p>41<\/p>\n<p>42<\/p>\n<p>43<\/p>\n<p>44<\/p>\n<p>45<\/p>\n<p>46<\/p>\n<p>47<\/p>\n<p>48<\/p>\n<p>49<\/p>\n<p>50<\/p>\n<p>51<\/p>\n<p>52<\/p>\n<p>53<\/p>\n<p>54<\/p>\n<p>55<\/p>\n<p>56<\/p>\n<p>57<\/p>\n<p>58<\/p>\n<p>59<\/p>\n<p>60<\/p>\n<p>61<\/p>\n<p>62<\/p>\n<p>63<\/p>\n<p>64<\/p>\n<p>65<\/p>\n<p>66<\/p>\n<p>67<\/p>\n<p>68<\/p>\n<p>69<\/p>\n<p>70<\/p>\n<p>71<\/p>\n<\/div>\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-p\"># orchestrator.py<\/span><\/p>\n<p><span class=\"crayon-p\"># Conditions: none past Python&#8217;s normal library<\/span><\/p>\n<p><span class=\"crayon-p\"># Run: python orchestrator.py<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">dataclasses <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-v\">dataclass<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">subject<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-sy\">@<\/span><span class=\"crayon-e\">dataclass<\/span><\/p>\n<p><span class=\"crayon-t\">class<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">PlanStep<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">step_number<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">int<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">description<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">tool_tag<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">str<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-sy\">@<\/span><span class=\"crayon-e\">dataclass<\/span><\/p>\n<p><span class=\"crayon-t\">class<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">Plan<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">objective<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">steps<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">record<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">PlanStep<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">subject<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">default_factory<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">record<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-sy\">@<\/span><span class=\"crayon-e\">dataclass<\/span><\/p>\n<p><span class=\"crayon-t\">class<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">StepOutcome<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">step_number<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">int<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">success<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">bool<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">output<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">str<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># Stand-ins for the planning and tool-execution parts above &#8212;<\/span><\/p>\n<p><span class=\"crayon-p\"># orchestration&#8217;s job is to CALL these in sequence, not do their work itself.<\/span><\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">mock_create_plan<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">objective<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">Plan<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">Plan<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">objective<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">objective<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">steps<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-sy\">[<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">PlanStep<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;Look up order&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;database_lookup&#8221;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">PlanStep<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">2<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;Check eligibility&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;policy_check&#8221;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">PlanStep<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">3<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;Issue refund&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;payment_api&#8221;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">mock_execute_tool<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">step<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">PlanStep<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">StepOutcome<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">step<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">tool_tag<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">==<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;policy_check&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-p\"># simulate a failure to check cease logic<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">StepOutcome<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">step<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">step_number<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">success<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-t\">False<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">output<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;Coverage examine failed: order too previous&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">StepOutcome<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">step<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">step_number<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">success<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-t\">True<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">output<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Accomplished: {step.description}&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-t\">class<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">Orchestrator<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0Holds the sequence collectively throughout a number of steps, decides whether or not to<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0proceed or cease, and caps the run with an specific step restrict. It does<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0not plan and it doesn&#8217;t execute instruments &#8212; it calls the parts that do.<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0&#8220;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">__init__<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">max_steps<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">int<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">10<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">max_steps<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">max_steps<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">run<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">objective<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">record<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">StepOutcome<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">plan<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">mock_create_plan<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">objective<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">outcomes<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">record<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">StepOutcome<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">step <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">plan<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">steps<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">len<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">outcomes<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">&gt;=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">max_steps<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8221;\u00a0\u00a0Step restrict ({self.max_steps}) reached &#8212; stopping.&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">break<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8221;\u00a0\u00a0Executing step {step.step_number}: {step.description}&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">final result<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">mock_execute_tool<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">step<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">outcomes<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">append<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">final result<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">not<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">final result<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">success<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8221;\u00a0\u00a0Step {step.step_number} failed: {final result.output}&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8221;\u00a0\u00a0Stopping run &#8212; a failed step blocks the remainder of this plan.&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">break<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">outcomes<\/span><\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">__name__<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">==<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;__main__&#8221;<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">outcomes<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">Orchestrator<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">max_steps<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">10<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">run<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;Course of a refund for order 4821&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;nTotal steps tried: {len(outcomes)}&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Closing final result: success={outcomes[-1].success}, output=&#8221;{outcomes[-1].output}&#8221;&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div><\/div><\/div>\n<p>How you can run: python orchestrator.py, no dependencies required.<\/p>\n<p>Output:<\/p>\n<div id=\"urvanov-syntax-highlighter-6a6cbf60dd954372769231\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" touchscreen minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\nExecuting step 1: Lookup order&#13;<br \/>\nExecuting step 2: Examine eligibility&#13;<br \/>\nStep 2 failed: Coverage examine failed: order too previous&#13;<br \/>\nStopping run &#8212; a failed step blocks the remainder of this plan&#13;<br \/>\n&#13;<br \/>\nWhole steps tried: 2&#13;<br \/>\nClosing final result: success=False, output=&#8221;Coverage examine failed: order too previous&#8221;<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-e\">Executing <\/span><span class=\"crayon-i\">step<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">Look <\/span><span class=\"crayon-e\">up <\/span><span class=\"crayon-e\">order<\/span><\/p>\n<p><span class=\"crayon-e\">Executing <\/span><span class=\"crayon-i\">step<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">2<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">Examine <\/span><span class=\"crayon-e\">eligibility<\/span><\/p>\n<p><span class=\"crayon-i\">Step<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">2<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">failed<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">Coverage <\/span><span class=\"crayon-e\">examine <\/span><span class=\"crayon-v\">failed<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">order <\/span><span class=\"crayon-e\">too <\/span><span class=\"crayon-e\">previous<\/span><\/p>\n<p><span class=\"crayon-e\">Stopping <\/span><span class=\"crayon-v\">run<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">&#8212;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">a<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">failed <\/span><span class=\"crayon-e\">step <\/span><span class=\"crayon-e\">blocks <\/span><span class=\"crayon-e\">the <\/span><span class=\"crayon-e\">relaxation <\/span><span class=\"crayon-e\">of <\/span><span class=\"crayon-r\">this<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">plan<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">Whole <\/span><span class=\"crayon-e\">steps <\/span><span class=\"crayon-v\">tried<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">2<\/span><\/p>\n<p><span class=\"crayon-m\">Closing<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">final result<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">success<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-t\">False<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">output<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8216;Coverage examine failed: order too previous&#8217;<\/span><\/p>\n<\/div><\/div><\/div>\n<p>Step 3 \u2014 the precise refund \u2014 by no means ran. That\u2019s not an accident of the mock; it\u2019s the orchestrator doing its particular job. The planner produced a three-step plan with no data of whether or not step 2 would succeed. The instrument executor ran step 2 and reported failure. Deciding to cease there, fairly than blindly persevering with to difficulty a refund on an order that simply failed eligibility, belongs to neither of these parts \u2014 it belongs to orchestration.<\/p>\n<h2>Guardrails<\/h2>\n<p>Guardrails implement the principles of the highway: enable\/deny lists for instruments and domains, privateness and data-residency controls, value ceilings, fee limits, and escalation paths for dangerous or irreversible actions. This isn\u2019t a characteristic bolted on after launch; it\u2019s the distinction between an agent that\u2019s spectacular in a demo and one which\u2019s secure to level at actual buyer accounts and actual cost techniques.<\/p>\n<p>Present manufacturing steering converges on the identical core sample: policy-as-code, obligatory approval gates for irreversible actions, and defenses in opposition to immediate injection the place untrusted retrieved content material could possibly be mistaken for an instruction.<\/p>\n<div id=\"urvanov-syntax-highlighter-6a6cbf60dd95a579078310\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" touchscreen minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\n# guardrails.py&#13;<br \/>\n# Conditions: none past Python&#8217;s normal library&#13;<br \/>\n# Run: python guardrails.py&#13;<br \/>\n&#13;<br \/>\nfrom dataclasses import dataclass&#13;<br \/>\nfrom enum import Enum&#13;<br \/>\n&#13;<br \/>\nclass GuardrailVerdict(Enum):&#13;<br \/>\n    ALLOW = &#8220;enable&#8221;&#13;<br \/>\n    DENY = &#8220;deny&#8221;&#13;<br \/>\n    REQUIRE_APPROVAL = &#8220;require_approval&#8221;&#13;<br \/>\n&#13;<br \/>\n@dataclass&#13;<br \/>\nclass ProposedAction:&#13;<br \/>\n    tool_name: str&#13;<br \/>\n    args: dict&#13;<br \/>\n    estimated_cost: float&#13;<br \/>\n    irreversible: bool&#13;<br \/>\n&#13;<br \/>\n@dataclass&#13;<br \/>\nclass GuardrailResult:&#13;<br \/>\n    verdict: GuardrailVerdict&#13;<br \/>\n    cause: str&#13;<br \/>\n&#13;<br \/>\nclass GuardrailEngine:&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    Sits between planning&#8217;s proposed motion and the instrument executor.&#13;<br \/>\n    Enforces an allow-list of permitted instruments, a value ceiling per motion,&#13;<br \/>\n    and obligatory human approval for something irreversible &#8212; regardless&#13;<br \/>\n    of how assured the planner was that it was the fitting transfer.&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    def __init__(self, allowed_tools: set[str], cost_ceiling: float):&#13;<br \/>\n        self.allowed_tools = allowed_tools&#13;<br \/>\n        self.cost_ceiling = cost_ceiling&#13;<br \/>\n&#13;<br \/>\n    def examine(self, motion: ProposedAction) -&gt; GuardrailResult:&#13;<br \/>\n        if motion.tool_name not in self.allowed_tools:&#13;<br \/>\n            return GuardrailResult(GuardrailVerdict.DENY,&#13;<br \/>\n                                   f&#8221;Device &#8216;{motion.tool_name}&#8217; isn&#8217;t on the allow-list&#8221;)&#13;<br \/>\n        if motion.estimated_cost &gt; self.cost_ceiling:&#13;<br \/>\n            return GuardrailResult(GuardrailVerdict.DENY,&#13;<br \/>\n                                   f&#8221;Estimated value ${motion.estimated_cost} exceeds ceiling ${self.cost_ceiling}&#8221;)&#13;<br \/>\n        if motion.irreversible:&#13;<br \/>\n            return GuardrailResult(GuardrailVerdict.REQUIRE_APPROVAL,&#13;<br \/>\n                                   &#8220;Motion is irreversible &#8212; requires human approval earlier than execution&#8221;)&#13;<br \/>\n        return GuardrailResult(GuardrailVerdict.ALLOW, &#8220;Handed all guardrail checks&#8221;)&#13;<br \/>\n&#13;<br \/>\n&#13;<br \/>\nif __name__ == &#8220;__main__&#8221;:&#13;<br \/>\n    guardrails = GuardrailEngine(&#13;<br \/>\n        allowed_tools={&#8220;database_lookup&#8221;, &#8220;policy_check&#8221;, &#8220;payment_api&#8221;, &#8220;e-mail&#8221;},&#13;<br \/>\n        cost_ceiling=100.0,&#13;<br \/>\n    )&#13;<br \/>\n&#13;<br \/>\n    test_actions = [&#13;<br \/>\n        ProposedAction(&#8220;database_lookup&#8221;, {&#8220;order_id&#8221;: &#8220;4821&#8221;}, 0.0, False),&#13;<br \/>\n        ProposedAction(&#8220;delete_customer_account&#8221;, {&#8220;id&#8221;: &#8220;u_991&#8221;}, 0.0, True),&#13;<br \/>\n        ProposedAction(&#8220;payment_api&#8221;, {&#8220;order_id&#8221;: &#8220;4821&#8221;, &#8220;amount&#8221;: 5000.0}, 5000.0, True),&#13;<br \/>\n        ProposedAction(&#8220;payment_api&#8221;, {&#8220;order_id&#8221;: &#8220;4821&#8221;, &#8220;amount&#8221;: 49.99}, 49.99, True),&#13;<br \/>\n    ]&#13;<br \/>\n&#13;<br \/>\n    for motion in test_actions:&#13;<br \/>\n        end result = guardrails.examine(motion)&#13;<br \/>\n        print(f&#8221;{motion.tool_name} -&gt; {end result.verdict.worth}: {end result.cause}&#8221;)<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"urvanov-syntax-highlighter-nums-content\" style=\"font-size: 12px !important; line-height: 15px !important;\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<p>32<\/p>\n<p>33<\/p>\n<p>34<\/p>\n<p>35<\/p>\n<p>36<\/p>\n<p>37<\/p>\n<p>38<\/p>\n<p>39<\/p>\n<p>40<\/p>\n<p>41<\/p>\n<p>42<\/p>\n<p>43<\/p>\n<p>44<\/p>\n<p>45<\/p>\n<p>46<\/p>\n<p>47<\/p>\n<p>48<\/p>\n<p>49<\/p>\n<p>50<\/p>\n<p>51<\/p>\n<p>52<\/p>\n<p>53<\/p>\n<p>54<\/p>\n<p>55<\/p>\n<p>56<\/p>\n<p>57<\/p>\n<p>58<\/p>\n<p>59<\/p>\n<p>60<\/p>\n<p>61<\/p>\n<p>62<\/p>\n<p>63<\/p>\n<p>64<\/p>\n<\/div>\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-p\"># guardrails.py<\/span><\/p>\n<p><span class=\"crayon-p\"># Conditions: none past Python&#8217;s normal library<\/span><\/p>\n<p><span class=\"crayon-p\"># Run: python guardrails.py<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">dataclasses <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">dataclass<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-t\">enum<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-t\">Enum<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-t\">class<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">GuardrailVerdict<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-t\">Enum<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">ALLOW<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;enable&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">DENY<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;deny&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">REQUIRE_APPROVAL<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;require_approval&#8221;<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-sy\">@<\/span><span class=\"crayon-e\">dataclass<\/span><\/p>\n<p><span class=\"crayon-t\">class<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">ProposedAction<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">tool_name<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">args<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">dict<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">estimated_cost<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">float<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">irreversible<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">bool<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-sy\">@<\/span><span class=\"crayon-e\">dataclass<\/span><\/p>\n<p><span class=\"crayon-t\">class<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">GuardrailResult<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">verdict<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">GuardrailVerdict<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">cause<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-t\">class<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">GuardrailEngine<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0Sits between planning&#8217;s proposed motion and the instrument executor.<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0Enforces an allow-list of permitted instruments, a value ceiling per motion,<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0and obligatory human approval for something irreversible &#8212; regardless<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0of how assured the planner was that it was the fitting transfer.<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0&#8220;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">__init__<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">allowed_tools<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">set<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">cost_ceiling<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">float<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">allowed_tools<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">allowed_tools<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">cost_ceiling<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">cost_ceiling<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">examine<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">motion<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">ProposedAction<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">GuardrailResult<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">motion<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">tool_name <\/span><span class=\"crayon-st\">not<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">allowed_tools<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">GuardrailResult<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">GuardrailVerdict<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">DENY<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Device &#8216;{motion.tool_name}&#8217; isn&#8217;t on the allow-list&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">motion<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">estimated_cost<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">cost_ceiling<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">GuardrailResult<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">GuardrailVerdict<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">DENY<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Estimated value ${motion.estimated_cost} exceeds ceiling ${self.cost_ceiling}&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">motion<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">irreversible<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">GuardrailResult<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">GuardrailVerdict<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">REQUIRE_APPROVAL<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-s\">&#8220;Motion is irreversible &#8212; requires human approval earlier than execution&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">GuardrailResult<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">GuardrailVerdict<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">ALLOW<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;Handed all guardrail checks&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">__name__<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">==<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;__main__&#8221;<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">guardrails<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">GuardrailEngine<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">allowed_tools<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;database_lookup&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;policy_check&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;payment_api&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;e-mail&#8221;<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">cost_ceiling<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">100.0<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">test_actions<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">ProposedAction<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;database_lookup&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;order_id&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;4821&#8221;<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0.0<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">False<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">ProposedAction<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;delete_customer_account&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;id&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;u_991&#8221;<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0.0<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">True<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">ProposedAction<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;payment_api&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;order_id&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;4821&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;amount&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">5000.0<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">5000.0<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">True<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">ProposedAction<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;payment_api&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;order_id&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;4821&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;amount&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">49.99<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">49.99<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">True<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">motion <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">test_actions<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">end result<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">guardrails<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">examine<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">motion<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;{motion.tool_name} -&gt; {end result.verdict.worth}: {end result.cause}&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div><\/div><\/div>\n<p>How you can run: python guardrails.py, no dependencies required.<\/p>\n<p>Output:<\/p>\n<div id=\"urvanov-syntax-highlighter-6a6cbf60dd963132022664\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" touchscreen minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\ndatabase_lookup -&gt; enable: Handed all guardrail checks&#13;<br \/>\ndelete_customer_account -&gt; deny: Device &#8216;delete_customer_account&#8217; isn&#8217;t on the allow-list&#13;<br \/>\npayment_api -&gt; deny: Estimated value $5000.0 exceeds ceiling $100.0&#13;<br \/>\npayment_api -&gt; require_approval: Motion is irreversible &#8212; requires human approval earlier than execution<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-v\">database_lookup<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">enable<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">Handed <\/span><span class=\"crayon-e\">all <\/span><span class=\"crayon-e\">guardrail <\/span><span class=\"crayon-e\">checks<\/span><\/p>\n<p><span class=\"crayon-v\">delete_customer_account<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">deny<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">Device<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;delete_customer_account&#8217;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">is<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">not<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">on <\/span><span class=\"crayon-e\">the <\/span><span class=\"crayon-v\">enable<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-e\">record<\/span><\/p>\n<p><span class=\"crayon-v\">payment_api<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">deny<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">Estimated <\/span><span class=\"crayon-i\">value<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">$<\/span><span class=\"crayon-cn\">5000.0<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">exceeds <\/span><span class=\"crayon-i\">ceiling<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">$<\/span><span class=\"crayon-cn\">100.0<\/span><\/p>\n<p><span class=\"crayon-v\">payment_api<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">require_approval<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">Motion <\/span><span class=\"crayon-st\">is<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">irreversible<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">&#8212;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">requires <\/span><span class=\"crayon-e\">human <\/span><span class=\"crayon-e\">approval <\/span><span class=\"crayon-e\">earlier than <\/span><span class=\"crayon-v\">execution<\/span><\/p>\n<\/div><\/div><\/div>\n<p>The final case is the one value sitting with: a $49.99 refund, nicely inside the $100 value ceiling, nonetheless will get flagged for human approval as a result of it\u2019s irreversible \u2014 full cease. Being inside funds doesn\u2019t override that. That is precisely the type of rule that\u2019s trivial to jot down down and straightforward to skip if guardrails aren\u2019t handled as their very own part with their very own checks, separate from regardless of the planner determined was a good suggestion.<\/p>\n<h2>Observability<\/h2>\n<p>Observability means trace-level logging of each step \u2014 not simply the ultimate output, however instrument selections and intermediate reasoning \u2014 as a result of with out traces you can&#8217;t debug or enhance agent habits. That is the part that turns \u201cthe agent did one thing fallacious\u201d into \u201cthe agent known as policy_check at step 4, it returned success=False, and the orchestrator appropriately stopped the run there.\u201d That\u2019s the distinction between a system you possibly can really iterate on and one you possibly can solely restart and hope.<\/p>\n<div id=\"urvanov-syntax-highlighter-6a6cbf60dd968853397116\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" touchscreen minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\n# observability.py&#13;<br \/>\n# Conditions: none past Python&#8217;s normal library&#13;<br \/>\n# Run: python observability.py&#13;<br \/>\n&#13;<br \/>\nfrom dataclasses import dataclass, subject&#13;<br \/>\nfrom datetime import datetime, timezone&#13;<br \/>\nfrom typing import Any&#13;<br \/>\nimport json&#13;<br \/>\n&#13;<br \/>\n@dataclass&#13;<br \/>\nclass TraceEntry:&#13;<br \/>\n    step_number: int&#13;<br \/>\n    part: str&#13;<br \/>\n    occasion: str&#13;<br \/>\n    element: dict[str, Any]&#13;<br \/>\n    timestamp: str = subject(default_factory=lambda: datetime.now(timezone.utc).isoformat())&#13;<br \/>\n&#13;<br \/>\nclass TraceLogger:&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    Wraps every step of a run with a structured, timestamped log entry.&#13;<br \/>\n    Intentionally separate from the orchestrator: the orchestrator decides&#13;<br \/>\n    what occurs, the hint logger simply watches and data it &#8212; which is&#13;<br \/>\n    what helps you to level on the actual step, part, and enter that&#13;<br \/>\n    brought about a deviation, with out re-running something.&#13;<br \/>\n    &#8220;&#8221;&#8221;&#13;<br \/>\n    def __init__(self, run_id: str):&#13;<br \/>\n        self.run_id = run_id&#13;<br \/>\n        self.entries: record[TraceEntry] = []&#13;<br \/>\n        self._step_counter = 0&#13;<br \/>\n&#13;<br \/>\n    def log(self, part: str, occasion: str, **element) -&gt; None:&#13;<br \/>\n        self._step_counter += 1&#13;<br \/>\n        self.entries.append(TraceEntry(self._step_counter, part, occasion, element))&#13;<br \/>\n&#13;<br \/>\n    def export_json(self) -&gt; str:&#13;<br \/>\n        return json.dumps({&#13;<br \/>\n            &#8220;run_id&#8221;: self.run_id,&#13;<br \/>\n            &#8220;hint&#8221;: [&#13;<br \/>\n                {&#8220;step&#8221;: e.step_number, &#8220;component&#8221;: e.component, &#8220;event&#8221;: e.event,&#13;<br \/>\n                 &#8220;detail&#8221;: e.detail, &#8220;timestamp&#8221;: e.timestamp}&#13;<br \/>\n                for e in self.entries&#13;<br \/>\n            ],&#13;<br \/>\n        }, indent=2)&#13;<br \/>\n&#13;<br \/>\n    def find_failure_point(self) -&gt; TraceEntry | None:&#13;<br \/>\n        &#8220;&#8221;&#8221;The only most helpful question on a hint: the place did it first go fallacious.&#8221;&#8221;&#8221;&#13;<br \/>\n        for entry in self.entries:&#13;<br \/>\n            if entry.element.get(&#8220;success&#8221;) is False:&#13;<br \/>\n                return entry&#13;<br \/>\n        return None&#13;<br \/>\n&#13;<br \/>\n&#13;<br \/>\nif __name__ == &#8220;__main__&#8221;:&#13;<br \/>\n    tracer = TraceLogger(run_id=&#8221;run_2026_06_20_001&#8243;)&#13;<br \/>\n    tracer.log(&#8220;notion&#8221;, &#8220;input_normalized&#8221;, supply=&#8221;user_text&#8221;, content material=&#8221;Refund order 4821&#8243;)&#13;<br \/>\n    tracer.log(&#8220;planning&#8221;, &#8220;plan_created&#8221;, step_count=3, objective=&#8221;Course of a refund for order 4821&#8243;)&#13;<br \/>\n    tracer.log(&#8220;tool_execution&#8221;, &#8220;tool_called&#8221;, instrument=&#8221;database_lookup&#8221;, success=True, output=&#8221;Order discovered&#8221;)&#13;<br \/>\n    tracer.log(&#8220;tool_execution&#8221;, &#8220;tool_called&#8221;, instrument=&#8221;policy_check&#8221;, success=False,&#13;<br \/>\n               output=&#8221;Order too previous&#8221;, error=&#8221;Coverage examine failed: order too previous&#8221;)&#13;<br \/>\n    tracer.log(&#8220;orchestrator&#8221;, &#8220;run_stopped&#8221;, cause=&#8221;step_failed&#8221;, step_number=4)&#13;<br \/>\n&#13;<br \/>\n    failure = tracer.find_failure_point()&#13;<br \/>\n    print(f&#8221;Failure level: part=&#8221;{failure.part}&#8221;, step={failure.step_number}&#8221;)&#13;<br \/>\n    print(f&#8221;  element: {failure.element}&#8221;)<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"urvanov-syntax-highlighter-nums-content\" style=\"font-size: 12px !important; line-height: 15px !important;\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<p>32<\/p>\n<p>33<\/p>\n<p>34<\/p>\n<p>35<\/p>\n<p>36<\/p>\n<p>37<\/p>\n<p>38<\/p>\n<p>39<\/p>\n<p>40<\/p>\n<p>41<\/p>\n<p>42<\/p>\n<p>43<\/p>\n<p>44<\/p>\n<p>45<\/p>\n<p>46<\/p>\n<p>47<\/p>\n<p>48<\/p>\n<p>49<\/p>\n<p>50<\/p>\n<p>51<\/p>\n<p>52<\/p>\n<p>53<\/p>\n<p>54<\/p>\n<p>55<\/p>\n<p>56<\/p>\n<p>57<\/p>\n<p>58<\/p>\n<p>59<\/p>\n<p>60<\/p>\n<p>61<\/p>\n<p>62<\/p>\n<p>63<\/p>\n<p>64<\/p>\n<\/div>\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-p\"># observability.py<\/span><\/p>\n<p><span class=\"crayon-p\"># Conditions: none past Python&#8217;s normal library<\/span><\/p>\n<p><span class=\"crayon-p\"># Run: python observability.py<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">dataclasses <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-v\">dataclass<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">subject<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">datetime <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-v\">datetime<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">timezone<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">typing <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">Any<\/span><\/p>\n<p><span class=\"crayon-e\">import <\/span><span class=\"crayon-i\">json<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-sy\">@<\/span><span class=\"crayon-e\">dataclass<\/span><\/p>\n<p><span class=\"crayon-t\">class<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">TraceEntry<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">step_number<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">int<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">part<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">occasion<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">str<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">element<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">dict<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">Any<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">timestamp<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">subject<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">default_factory<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">lambda<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">datetime<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">now<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">timezone<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">utc<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">isoformat<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-t\">class<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">TraceLogger<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0Wraps every step of a run with a structured, timestamped log entry.<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0Intentionally separate from the orchestrator: the orchestrator decides<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0what occurs, the hint logger simply watches and data it &#8212; which is<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0what helps you to level on the actual step, part, and enter that<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0brought about a deviation, with out re-running something.<\/span><\/p>\n<p><span class=\"crayon-s\">\u00a0\u00a0\u00a0\u00a0&#8220;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">__init__<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">run_id<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">run_id<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">run_id<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">entries<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">record<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">TraceEntry<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">_step_counter<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">log<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">part<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">occasion<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-v\">element<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">None<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">_step_counter<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">+=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">1<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">entries<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">append<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-e\">TraceEntry<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">_step_counter<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">part<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">occasion<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">element<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">export_json<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">json<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">dumps<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">{<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;run_id&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">run_id<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;hint&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8220;step&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">e<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">step_number<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;component&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">e<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">component<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;event&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">e<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">event<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-s\">&#8220;detail&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">e<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">detail<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;timestamp&#8221;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">e<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">timestamp<\/span><span class=\"crayon-sy\">}<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">e<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-i\">entries<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">indent<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">2<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">find_failure_point<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">TraceEntry<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">|<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">None<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><span class=\"crayon-s\">&#8220;The only most helpful question on a hint: the place did it first go fallacious.&#8221;<\/span><span class=\"crayon-s\">&#8220;&#8221;<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">for<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">entry <\/span><span class=\"crayon-st\">in<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">entries<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">entry<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">element<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">get<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;success&#8221;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-st\">is<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-t\">False<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">entry<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">None<\/span><\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">__name__<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">==<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;__main__&#8221;<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">tracer<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">TraceLogger<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">run_id<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;run_2026_06_20_001&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">tracer<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">log<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;notion&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;input_normalized&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">supply<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;user_text&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">content material<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;Refund order 4821&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">tracer<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">log<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;planning&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;plan_created&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">step_count<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">3<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">objective<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;Course of a refund for order 4821&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">tracer<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">log<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;tool_execution&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;tool_called&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">instrument<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;database_lookup&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">success<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-t\">True<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">output<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;Order discovered&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">tracer<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">log<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;tool_execution&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;tool_called&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">instrument<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;policy_check&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">success<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-t\">False<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-v\">output<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;Order too previous&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">error<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;Coverage examine failed: order too previous&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">tracer<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">log<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;orchestrator&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;run_stopped&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">cause<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8220;step_failed&#8221;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">step_number<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">4<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">failure<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">tracer<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">find_failure_point<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8220;Failure level: part=&#8221;{failure.part}&#8221;, step={failure.step_number}&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-i\">f<\/span><span class=\"crayon-s\">&#8221;\u00a0\u00a0element: {failure.element}&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div><\/div><\/div>\n<p>How you can run: python observability.py, no dependencies required.<\/p>\n<p>find_failure_point() walks the hint and lands straight on the policy_check name at step 4 \u2014 the precise instrument, the precise arguments, the precise cause it failed. No re-running the agent, no guessing which of 5 steps went sideways. That\u2019s the sensible payoff of treating observability as a structural part that wraps the loop, fairly than scattering print() statements by means of the orchestrator and hoping they\u2019re sufficient when one thing breaks at 2 AM.<\/p>\n<h2>Wrapping Up<\/h2>\n<p>None of those parts is elective as soon as a system leaves the demo stage, regardless that most tutorials solely ever present two or three of them. Notion and reminiscence feed the reasoning core. Reasoning and planning hand off a plan object to instrument execution. Orchestration holds the entire sequence collectively throughout steps and decides when to cease. Guardrails and observability wrap the whole loop fairly than sitting inside it \u2014 one constrains what the loop is allowed to do, the opposite data what it really did.<\/p>\n<p>The rationale manufacturing agentic techniques find yourself trying extra like software program structure than immediate engineering is that, beneath the LLM calls, they genuinely are software program structure. The mannequin is one part amongst seven that handles reasoning and planning \u2014 it\u2019s not the whole system. Understanding every part\u2019s particular, separate duty is what makes it potential to debug a failure, safe a dangerous motion, and scale a pipeline previous the second consumer, as an alternative of simply hoping the 40-line script retains working.<\/p>\n<\/p><\/div>\n<p><br \/>\n<br \/><a href=\"https:\/\/machinelearningmastery.com\/the-end-to-end-agentic-ai-pipeline\/\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>On this article, you&#8217;ll study the seven architectural parts that separate a production-grade agentic AI system from a demo script, and the way each suits into the agent\u2019s core suggestions loop. Subjects we&#8217;ll cowl embody: What every of the seven parts \u2014 notion, reminiscence, reasoning and planning, instrument execution, orchestration, guardrails, and observability \u2014 is [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3181,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-The-End-to-End-Agentic-AI-Pipeline-1024x561.png","fifu_image_alt":"","jnews-multi-image_gallery":[],"jnews_single_post":[],"jnews_primary_category":[],"jnews_override_bookmark_settings":[],"jnews_social_meta":[],"jnews_override_counter":[],"footnotes":""},"categories":[7],"tags":[15,1972,1139],"class_list":["post-3179","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-data-science-mlops","tag-agentic","tag-endtoend","tag-pipeline"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>The Finish-to-Finish Agentic AI Pipeline - Future News 24<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/futurenews24.com\/index.php\/2026\/07\/30\/the-end-to-end-agentic-ai-pipeline\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"The Finish-to-Finish Agentic AI Pipeline - Future News 24\" \/>\n<meta property=\"og:description\" content=\"On this article, you&#8217;ll study the seven architectural parts that separate a production-grade agentic AI system from a demo script, and the way each suits into the agent\u2019s core suggestions loop. Subjects we&#8217;ll cowl embody: What every of the seven parts \u2014 notion, reminiscence, reasoning and planning, instrument execution, orchestration, guardrails, and observability \u2014 is [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/futurenews24.com\/index.php\/2026\/07\/30\/the-end-to-end-agentic-ai-pipeline\/\" \/>\n<meta property=\"og:site_name\" content=\"Future News 24\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-30T14:31:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-02T08:59:13+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-The-End-to-End-Agentic-AI-Pipeline-1024x561.png\" \/><meta property=\"og:image\" content=\"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-The-End-to-End-Agentic-AI-Pipeline-1024x561.png\" \/>\n<meta name=\"author\" content=\"Future News 24\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-The-End-to-End-Agentic-AI-Pipeline-1024x561.png\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Future News 24\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"35 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/30\\\/the-end-to-end-agentic-ai-pipeline\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/30\\\/the-end-to-end-agentic-ai-pipeline\\\/\"},\"author\":{\"name\":\"Future News 24\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#\\\/schema\\\/person\\\/cecad1bde21cfc357cf70128144d6c83\"},\"headline\":\"The Finish-to-Finish Agentic AI Pipeline\",\"datePublished\":\"2026-07-30T14:31:00+00:00\",\"dateModified\":\"2026-08-02T08:59:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/30\\\/the-end-to-end-agentic-ai-pipeline\\\/\"},\"wordCount\":7034,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/30\\\/the-end-to-end-agentic-ai-pipeline\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/machinelearningmastery.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/MLM-Shittu-The-End-to-End-Agentic-AI-Pipeline-1024x561.png\",\"keywords\":[\"Agentic\",\"EndtoEnd\",\"pipeline\"],\"articleSection\":[\"Data Science &amp; MLOps\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/30\\\/the-end-to-end-agentic-ai-pipeline\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/30\\\/the-end-to-end-agentic-ai-pipeline\\\/\",\"url\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/30\\\/the-end-to-end-agentic-ai-pipeline\\\/\",\"name\":\"The Finish-to-Finish Agentic AI Pipeline - Future News 24\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/30\\\/the-end-to-end-agentic-ai-pipeline\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/30\\\/the-end-to-end-agentic-ai-pipeline\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/machinelearningmastery.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/MLM-Shittu-The-End-to-End-Agentic-AI-Pipeline-1024x561.png\",\"datePublished\":\"2026-07-30T14:31:00+00:00\",\"dateModified\":\"2026-08-02T08:59:13+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/30\\\/the-end-to-end-agentic-ai-pipeline\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/30\\\/the-end-to-end-agentic-ai-pipeline\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/30\\\/the-end-to-end-agentic-ai-pipeline\\\/#primaryimage\",\"url\":\"https:\\\/\\\/machinelearningmastery.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/MLM-Shittu-The-End-to-End-Agentic-AI-Pipeline-1024x561.png\",\"contentUrl\":\"https:\\\/\\\/machinelearningmastery.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/MLM-Shittu-The-End-to-End-Agentic-AI-Pipeline-1024x561.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/07\\\/30\\\/the-end-to-end-agentic-ai-pipeline\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/futurenews24.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"The Finish-to-Finish Agentic AI Pipeline\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#website\",\"url\":\"https:\\\/\\\/futurenews24.com\\\/\",\"name\":\"Future News 24\",\"description\":\"The Smart Hub for AI and Next-Gen Innovation\",\"publisher\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/futurenews24.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#organization\",\"name\":\"Future News 24\",\"url\":\"https:\\\/\\\/futurenews24.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/futurenews24.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/fn24-favicon.png\",\"contentUrl\":\"https:\\\/\\\/futurenews24.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/fn24-favicon.png\",\"width\":250,\"height\":250,\"caption\":\"Future News 24\"},\"image\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#\\\/schema\\\/person\\\/cecad1bde21cfc357cf70128144d6c83\",\"name\":\"Future News 24\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d57f07142d73cb5503ab2446ea7bc9ef3d0a5ba378d64a6157692311e42bf097?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d57f07142d73cb5503ab2446ea7bc9ef3d0a5ba378d64a6157692311e42bf097?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d57f07142d73cb5503ab2446ea7bc9ef3d0a5ba378d64a6157692311e42bf097?s=96&d=mm&r=g\",\"caption\":\"Future News 24\"},\"sameAs\":[\"https:\\\/\\\/futurenews24.com\"],\"url\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/author\\\/mridulpahuja20\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"The Finish-to-Finish Agentic AI Pipeline - Future News 24","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/futurenews24.com\/index.php\/2026\/07\/30\/the-end-to-end-agentic-ai-pipeline\/","og_locale":"en_US","og_type":"article","og_title":"The Finish-to-Finish Agentic AI Pipeline - Future News 24","og_description":"On this article, you&#8217;ll study the seven architectural parts that separate a production-grade agentic AI system from a demo script, and the way each suits into the agent\u2019s core suggestions loop. Subjects we&#8217;ll cowl embody: What every of the seven parts \u2014 notion, reminiscence, reasoning and planning, instrument execution, orchestration, guardrails, and observability \u2014 is [&hellip;]","og_url":"https:\/\/futurenews24.com\/index.php\/2026\/07\/30\/the-end-to-end-agentic-ai-pipeline\/","og_site_name":"Future News 24","article_published_time":"2026-07-30T14:31:00+00:00","article_modified_time":"2026-08-02T08:59:13+00:00","og_image":[{"url":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-The-End-to-End-Agentic-AI-Pipeline-1024x561.png","type":"","width":"","height":""},{"url":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-The-End-to-End-Agentic-AI-Pipeline-1024x561.png","type":"","width":"","height":""}],"author":"Future News 24","twitter_card":"summary_large_image","twitter_image":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-The-End-to-End-Agentic-AI-Pipeline-1024x561.png","twitter_misc":{"Written by":"Future News 24","Est. reading time":"35 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/futurenews24.com\/index.php\/2026\/07\/30\/the-end-to-end-agentic-ai-pipeline\/#article","isPartOf":{"@id":"https:\/\/futurenews24.com\/index.php\/2026\/07\/30\/the-end-to-end-agentic-ai-pipeline\/"},"author":{"name":"Future News 24","@id":"https:\/\/futurenews24.com\/#\/schema\/person\/cecad1bde21cfc357cf70128144d6c83"},"headline":"The Finish-to-Finish Agentic AI Pipeline","datePublished":"2026-07-30T14:31:00+00:00","dateModified":"2026-08-02T08:59:13+00:00","mainEntityOfPage":{"@id":"https:\/\/futurenews24.com\/index.php\/2026\/07\/30\/the-end-to-end-agentic-ai-pipeline\/"},"wordCount":7034,"commentCount":0,"publisher":{"@id":"https:\/\/futurenews24.com\/#organization"},"image":{"@id":"https:\/\/futurenews24.com\/index.php\/2026\/07\/30\/the-end-to-end-agentic-ai-pipeline\/#primaryimage"},"thumbnailUrl":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-The-End-to-End-Agentic-AI-Pipeline-1024x561.png","keywords":["Agentic","EndtoEnd","pipeline"],"articleSection":["Data Science &amp; MLOps"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/futurenews24.com\/index.php\/2026\/07\/30\/the-end-to-end-agentic-ai-pipeline\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/futurenews24.com\/index.php\/2026\/07\/30\/the-end-to-end-agentic-ai-pipeline\/","url":"https:\/\/futurenews24.com\/index.php\/2026\/07\/30\/the-end-to-end-agentic-ai-pipeline\/","name":"The Finish-to-Finish Agentic AI Pipeline - Future News 24","isPartOf":{"@id":"https:\/\/futurenews24.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/futurenews24.com\/index.php\/2026\/07\/30\/the-end-to-end-agentic-ai-pipeline\/#primaryimage"},"image":{"@id":"https:\/\/futurenews24.com\/index.php\/2026\/07\/30\/the-end-to-end-agentic-ai-pipeline\/#primaryimage"},"thumbnailUrl":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-The-End-to-End-Agentic-AI-Pipeline-1024x561.png","datePublished":"2026-07-30T14:31:00+00:00","dateModified":"2026-08-02T08:59:13+00:00","breadcrumb":{"@id":"https:\/\/futurenews24.com\/index.php\/2026\/07\/30\/the-end-to-end-agentic-ai-pipeline\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/futurenews24.com\/index.php\/2026\/07\/30\/the-end-to-end-agentic-ai-pipeline\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/futurenews24.com\/index.php\/2026\/07\/30\/the-end-to-end-agentic-ai-pipeline\/#primaryimage","url":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-The-End-to-End-Agentic-AI-Pipeline-1024x561.png","contentUrl":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/06\/MLM-Shittu-The-End-to-End-Agentic-AI-Pipeline-1024x561.png"},{"@type":"BreadcrumbList","@id":"https:\/\/futurenews24.com\/index.php\/2026\/07\/30\/the-end-to-end-agentic-ai-pipeline\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/futurenews24.com\/"},{"@type":"ListItem","position":2,"name":"The Finish-to-Finish Agentic AI Pipeline"}]},{"@type":"WebSite","@id":"https:\/\/futurenews24.com\/#website","url":"https:\/\/futurenews24.com\/","name":"Future News 24","description":"The Smart Hub for AI and Next-Gen Innovation","publisher":{"@id":"https:\/\/futurenews24.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/futurenews24.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/futurenews24.com\/#organization","name":"Future News 24","url":"https:\/\/futurenews24.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/futurenews24.com\/#\/schema\/logo\/image\/","url":"https:\/\/futurenews24.com\/wp-content\/uploads\/2026\/06\/fn24-favicon.png","contentUrl":"https:\/\/futurenews24.com\/wp-content\/uploads\/2026\/06\/fn24-favicon.png","width":250,"height":250,"caption":"Future News 24"},"image":{"@id":"https:\/\/futurenews24.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/futurenews24.com\/#\/schema\/person\/cecad1bde21cfc357cf70128144d6c83","name":"Future News 24","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/d57f07142d73cb5503ab2446ea7bc9ef3d0a5ba378d64a6157692311e42bf097?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/d57f07142d73cb5503ab2446ea7bc9ef3d0a5ba378d64a6157692311e42bf097?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d57f07142d73cb5503ab2446ea7bc9ef3d0a5ba378d64a6157692311e42bf097?s=96&d=mm&r=g","caption":"Future News 24"},"sameAs":["https:\/\/futurenews24.com"],"url":"https:\/\/futurenews24.com\/index.php\/author\/mridulpahuja20\/"}]}},"_links":{"self":[{"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/posts\/3179","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/comments?post=3179"}],"version-history":[{"count":1,"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/posts\/3179\/revisions"}],"predecessor-version":[{"id":3180,"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/posts\/3179\/revisions\/3180"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/media\/3181"}],"wp:attachment":[{"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/media?parent=3179"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/categories?post=3179"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/tags?post=3179"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}