# `ADK.Runner.Async`
[🔗](https://github.com/zeroasterisk/adk-elixir/blob/main/lib/adk/runner/async.ex#L1)

Runs an agent asynchronously under `ADK.RunnerSupervisor` (Task.Supervisor),
sending events back to the caller as `{:adk_event, event}` messages.

All async runs are supervised — if a runner crashes, it won't bring down
the caller, and the supervisor tracks active tasks.

## Example

    {:ok, pid} = ADK.Runner.Async.run(runner, "user1", "sess1", "Hello!")
    receive do
      {:adk_event, event} -> IO.inspect(event)
    end
    receive do
      {:adk_done, events} -> IO.puts("Got #{length(events)} events")
    end

# `run`

```elixir
@spec run(ADK.Runner.t(), String.t(), String.t(), map() | String.t(), keyword()) ::
  {:ok, pid()}
```

Run an agent asynchronously under `ADK.RunnerSupervisor`.

Events are sent to `opts[:reply_to]` (default: `self()`):
- `{:adk_event, event}` for each event
- `{:adk_done, events}` when complete
- `{:adk_error, reason}` on failure

# `run_task`

```elixir
@spec run_task(ADK.Runner.t(), String.t(), String.t(), map() | String.t(), keyword()) ::
  Task.t()
```

Like `run/5` but returns a `Task` struct for awaiting the result.

Uses `Task.Supervisor.async_nolink/2` so the caller isn't linked to the task.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
