Agent tool call

Request, plan, approve, execute, reply

Workflow12 nodes · 13 connections

diagram.html#The link keeps the view, selection, route and playback.

About this diagram

Steps done by different owners, in order: a release process, an incident runbook, an agent’s tool call.

Ask for one like it

Draw our release process as a workflow, with a lane for rollbacks.

Read about workflow diagrams

The JSON

agent-tool-call/diagram.json226 lines
{  "kind": "workflow",  "title": "Agent tool call",  "subtitle": "Request, plan, approve, execute, reply",  "lanes": [    { "id": "ui", "label": "User interface" },    { "id": "agent", "label": "Agent runtime" },    {      "id": "policy",      "label": "Policy and recovery",      "tone": "exception"    },    { "id": "tools", "label": "Tool execution and evidence" }  ],  "phases": [    {      "id": "intake",      "label": "Intake",      "nodes": ["user", "chat", "store"]    },    {      "id": "plan",      "label": "Plan and route",      "nodes": ["planner", "router", "approval"]    },    {      "id": "execute",      "label": "Execute and report",      "nodes": ["tool", "external", "blocked", "retry", "final"]    }  ],  "groups": [    { "id": "loop", "label": "Planning loop" },    {      "id": "stop",      "label": "Human or policy stop",      "tone": "security"    }  ],  "nodes": [    {      "id": "user",      "type": "external",      "lane": "ui",      "card": { "title": "User", "subtitle": "Asks for work" }    },    {      "id": "chat",      "type": "client",      "lane": "ui",      "card": {        "title": "Chat surface",        "subtitle": "Thread and files"      }    },    {      "id": "final",      "type": "service",      "lane": "ui",      "card": {        "title": "Final reply",        "subtitle": "Answer and changes"      }    },    {      "id": "planner",      "type": "service",      "lane": "agent",      "group": "loop",      "card": {        "title": "Agent planner",        "subtitle": "Plan next step",        "tag": "context aware",        "brand": "anthropic"      }    },    {      "id": "router",      "type": "service",      "lane": "agent",      "group": "loop",      "card": {        "title": "Tool router",        "subtitle": "Choose capability"      }    },    {      "id": "approval",      "type": "security",      "lane": "policy",      "group": "stop",      "card": {        "title": "Approval gate",        "subtitle": "Scope and consent",        "tag": "blocks risky ops"      }    },    {      "id": "blocked",      "type": "security",      "lane": "policy",      "group": "stop",      "card": { "title": "Blocked", "subtitle": "Wait or reject" }    },    {      "id": "retry",      "type": "queue",      "lane": "policy",      "group": "stop",      "card": { "title": "Retry path", "subtitle": "Revise request" }    },    {      "id": "tool",      "type": "queue",      "lane": "tools",      "card": {        "title": "Tool call",        "subtitle": "Shell, browser, MCP",        "tag": "structured result"      }    },    {      "id": "external",      "type": "gateway",      "lane": "tools",      "card": { "title": "External API", "subtitle": "Network service" }    },    {      "id": "store",      "type": "database",      "lane": "tools",      "card": {        "title": "Context store",        "subtitle": "Repo and memory"      }    },    {      "id": "trace",      "type": "database",      "lane": "tools",      "card": { "title": "Trace log", "subtitle": "Events and output" }    }  ],  "edges": [    { "id": "e1", "from": "user", "to": "chat", "tone": "main" },    {      "id": "e2",      "from": "chat",      "to": "planner",      "label": "plan",      "tone": "main"    },    { "id": "e3", "from": "planner", "to": "router", "tone": "main" },    {      "id": "e4",      "from": "router",      "to": "approval",      "label": "needs approval?",      "tone": "security"    },    {      "id": "e5",      "from": "approval",      "to": "tool",      "label": "approved",      "tone": "main"    },    {      "id": "e6",      "from": "approval",      "to": "blocked",      "label": "denied",      "tone": "error"    },    { "id": "e7", "from": "blocked", "to": "retry", "kind": "async" },    {      "id": "e8",      "from": "retry",      "to": "planner",      "label": "revise",      "kind": "return"    },    { "id": "e9", "from": "tool", "to": "external", "tone": "main" },    {      "id": "e10",      "from": "external",      "to": "final",      "label": "result",      "kind": "return",      "tone": "main"    },    {      "id": "e11",      "from": "external",      "to": "trace",      "label": "record",      "kind": "async"    },    { "id": "e12", "from": "store", "to": "trace", "kind": "async" },    {      "id": "e13",      "from": "store",      "to": "planner",      "label": "context",      "kind": "async"    }  ],  "views": [    {      "id": "gate",      "label": "Approval gate",      "caption": "Risky work waits for scope and consent before any tool runs.",      "nodes": ["router", "approval", "tool", "blocked", "retry"]    }  ],  "notes": [    {      "title": "Runtime semantics",      "items": [        "Approval gates risky work before tool execution",        "A denial loops back to planning instead of failing silently",        "Evidence returns through the trace log and memory"      ]    }  ]}

More workflow examples

All examples