Events

The agent communicates state transitions via an event bus. Every meaningful action emits an sdk.Event to all registered subscribers.


Subscribing

ag.Subscribe(func(e sdk.Event) {
    switch e.Type {
    case sdk.EventTextDelta:
        fmt.Print(e.Content)
    case sdk.EventToolCall:
        fmt.Printf("[tool: %s]\n", e.ToolCall.Name)
    case sdk.EventAgentEnd:
        fmt.Println("\ndone")
    }
})

Multiple subscribers are allowed. Each runs in its own goroutine. The EventBus is non-blocking — Publish enqueues to a 4096-item buffered channel per subscriber and returns immediately, so slow subscribers drop events rather than stalling the agent loop.


Event Reference

Type constantPayloadFired when
EventAgentStartPrompt() called, agent loop begins
EventAgentEndAgent loop completes (all turns done)
EventTurnStartAn LLM request turn begins
EventTurnEndA turn’s tool calls finish
EventMessageStartLLM starts streaming a response
EventMessageEndLLM response stream complete
EventTextDeltae.Content stringIncremental response text chunk
EventThinkingDeltae.Content stringIncremental extended-thinking chunk
EventToolCalle.ToolCallTool invocation requested by LLM
EventToolDeltae.Content stringStreaming partial output from a running tool
EventToolOutpute.ToolOutputFinal tool result (success or error)

Event Flow Per Prompt

EventAgentStart
  EventTurnStart
    EventMessageStart
      EventTextDelta*
      EventThinkingDelta*
      EventToolCall*
    EventMessageEnd
    [per tool call]
      EventToolDelta*
      EventToolOutput
  EventTurnEnd
  [repeat if tool calls triggered another turn]
EventAgentEnd

Agent State Machine

The agent transitions through explicit states visible via EventAgentStart/EventAgentEnd and the ag.Idle() channel:

Idle → Thinking → Executing → Idle
           ↓
       Compacting → Idle
           ↓
         Aborting → Idle

ag.Idle() returns a channel that closes when the agent returns to Idle. Use it to block until a prompt completes:

ag.Prompt(ctx, "Refactor main.go")
<-ag.Idle()
// agent is idle, safe to call Prompt again