{
  "video": {
    "id": "jc3kbZkuHTo",
    "title": "The Human Is an Async API — Melanie Warrick, Temporal",
    "duration": 1156,
    "upload_date": null,
    "channel": "AI Engineer",
    "source": "AI Engineer",
    "event_format": ""
  },
  "analysis": {
    "video_id": "jc3kbZkuHTo",
    "title": "The Human Is an Async API — Melanie Warrick, Temporal",
    "one_liner": "Treat the human in an agent loop as an async API: rather than making a blocking call to the human, park the workflow with a durable wait condition and resume it with a signal. This is how Temporal does it, so a human's approval can take days and still survives a worker crash.",
    "summary": "Melanie Warrick argues that durability should be part of the agent 'harness'. She also argues that calling a human as a plain function creates a blocking call, and that call can get lost if the service goes down. Using Temporal's primitives (worker, workflow, activity, plus wait condition and signal), she shows a multi-agent ice cream delivery demo for the Temporal mascot Ziggy. In it, one order pauses for human approval while the rest of the system keeps running. In a second demo she kills the worker, approves the order while it is offline, then brings the worker back. The event history replays and the approved order completes. The demo mixes Google ADK and LangGraph agents to show that Temporal is framework-agnostic.",
    "key_points": [
      "Demo 1: a fleet agent, a customer agent and a dispatch agent, each running its own loop, coordinate ice cream deliveries. The fleet agent researches drivers using Google Maps, and the customer agent researches orders using Google Search. The dispatch agent makes decisions from their input. When a customer changes an order, only driver A pauses until a human approves; everything else keeps running.",
      "Temporal is software plus an optional service. It is free and open source on GitHub, has SDKs for Python, TypeScript and Rust, and you pay only if Temporal manages your state; otherwise you self-host. It standardizes failure handling and state management for distributed and agent systems.",
      "There are three core primitives. The worker runs the code. The workflow tracks the steps (an ADK agent or other agent loop runs inside a workflow). The activity is anything that talks to the outside world, such as model calls and tool calls. Workflows are deterministic and activities are non-deterministic.",
      "Human in the loop uses two primitives: a wait condition and a signal. In Python, workflow.wait_condition pauses that one workflow without holding a thread, while coroutines on other workflows keep running. workflow.signal injects input into a running workflow. A parked workflow is taken out of memory, it survives crashes, it supports timeouts, and Temporal can scale to millions of parked workflows.",
      "ADK integration: wrap the model in Temporal's TemporalModel class, wrap tools with its activity-tool wrapper, and pass the Google ADK plugin to the worker. LangGraph integration: model invokes and tool calls become activities and graph steps become workflows, with a LangChain plugin on the worker. LangGraph's interrupt is combined with a wait condition that watches for the interrupt signal.",
      "Demo 2: the customer and fleet agents run on ADK and the dispatch agent runs on LangGraph, with a child workflow per order per framework. A high-value order makes the dispatch agent ask for a human. She killed the worker, approved the order while it was offline (the approval was queued in Temporal's own data store), and restarted it. The event log replayed ('not redone') to the last state, and the order was assigned and delivered.",
      "Humans won't respond in 200 milliseconds; they take minutes, days or weeks. Only that one event should be paused, not the whole system.",
      "On when to put a human in the loop: it's case by case, but the main factor is whether the cost of being wrong is high, especially for security. Weigh that against alert fatigue, where people start saying 'yes, yes, yes' to every prompt, given that models are still probabilistic."
    ],
    "takeaways": [
      "Don't implement 'ask the human' as a synchronous function call. Model it as a durable wait condition plus a signal, so the call isn't blocking and isn't lost if the service crashes.",
      "Put timeouts on human waits so that a workflow only waits as long as you intend.",
      "Structure agent code so the loop or steps run as deterministic workflows and every model or tool call is an activity. This lets state be replayed after a failure.",
      "Pause only the specific order, task or child workflow that needs a human, so the rest of the system keeps running.",
      "Decide on human-in-the-loop by the cost of being wrong (especially for security), and weigh it against alert fatigue rather than adding approvals everywhere."
    ],
    "topics": [
      "agents",
      "human-in-the-loop",
      "durable-execution",
      "multi-agent",
      "workflow-orchestration",
      "state-management",
      "fault-tolerance"
    ],
    "tools": [
      "Temporal",
      "Google ADK (Agent Development Kit)",
      "LangChain",
      "LangGraph",
      "Google Maps",
      "Google Search",
      "GitHub",
      "Python",
      "TypeScript",
      "Rust",
      "asyncio"
    ],
    "quotes": [
      {
        "text": "the human, granted, you know, we're not tools, but we are a tool to the agent.",
        "at": "07:30",
        "url": "https://www.youtube.com/watch?v=jc3kbZkuHTo&t=450s"
      },
      {
        "text": "workflows are deterministic, activities are non-deterministic.",
        "at": "12:38",
        "url": "https://www.youtube.com/watch?v=jc3kbZkuHTo&t=758s"
      },
      {
        "text": "we know that humans are not going to respond in 200 milliseconds.",
        "at": "14:42",
        "url": "https://www.youtube.com/watch?v=jc3kbZkuHTo&t=882s"
      },
      {
        "text": "your event log is getting replayed. It's not redone.",
        "at": "16:03",
        "url": "https://www.youtube.com/watch?v=jc3kbZkuHTo&t=963s"
      }
    ],
    "words": 3960
  },
  "summary_url": "/#jc3kbZkuHTo",
  "transcript": {
    "html": "/transcripts/jc3kbZkuHTo.html",
    "txt": "/transcripts/jc3kbZkuHTo.txt",
    "vtt": "/transcripts/jc3kbZkuHTo.vtt"
  }
}