# `AgentWorkshop.Telemetry`
[🔗](https://github.com/joshrotenberg/agent_workshop/blob/main/lib/agent_workshop/telemetry.ex#L1)

Telemetry events for Workshop operations.

All events use the `[:agent_workshop, ...]` prefix. Attach handlers
for logging, metrics, cost tracking, or triggering workflows.

## Events

    [:agent_workshop, :ask, :start]
      measurements: %{system_time: integer}
      metadata: %{agent: atom, prompt: String.t()}

    [:agent_workshop, :ask, :stop]
      measurements: %{duration: integer, cost: float}
      metadata: %{agent: atom, prompt: String.t()}

    [:agent_workshop, :ask, :error]
      measurements: %{duration: integer}
      metadata: %{agent: atom, prompt: String.t(), error: term}

    [:agent_workshop, :cast, :start]
      measurements: %{system_time: integer}
      metadata: %{agent: atom, prompt: String.t()}

    [:agent_workshop, :cast, :complete]
      measurements: %{duration: integer, cost: float}
      metadata: %{agent: atom}

    [:agent_workshop, :agent, :created]
      measurements: %{system_time: integer}
      metadata: %{agent: atom, role: String.t() | nil, backend: module}

    [:agent_workshop, :agent, :dismissed]
      measurements: %{system_time: integer}
      metadata: %{agent: atom}

## Example handler

    :telemetry.attach("cost-logger", [:agent_workshop, :ask, :stop], fn
      _event, %{cost: cost}, %{agent: agent}, _config ->
        IO.puts("Agent #{agent} cost $#{cost}")
    end, nil)

# `error`

```elixir
@spec error(atom(), integer(), term(), map()) :: :ok
```

Emit a telemetry error event.

# `event`

```elixir
@spec event(atom(), map(), map()) :: :ok
```

Emit a one-shot telemetry event (no start/stop pair).

# `start`

```elixir
@spec start(atom(), map()) :: integer()
```

Emit a telemetry start event. Returns the start time for computing duration.

# `stop`

```elixir
@spec stop(atom(), integer(), map(), map()) :: :ok
```

Emit a telemetry stop event with duration.

---

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