Skip to main content
OpenAI-compatible Server-Sent Events (SSE) streaming for real-time responses.

Quick Start

Configuration

Tool Result Modes

The server supports three streaming modes, configured via CLI or environment variable:

Environment Variables

Server Info Endpoint

GET /aura/info is an aura-native introspection endpoint. It returns the default agent and, per agent, its orchestration workers and configured MCP servers. This endpoint is not OpenAI-compatible; it lives under /aura/ to keep /v1/models clean. The CLI uses this at boot to display orchestration workers before the first prompt in HTTP mode.
The description on each agent object is the agent’s own summary. It is distinct from the description inside each workers entry, which describes an orchestration worker.
Each agent’s id matches the id field in /v1/models (alias if set, otherwise agent name). Each agent object can also carry a description: the agent’s human-readable summary from its [agent].description config (see the configuration reference). It is omitted from the response when that config field is unset. Omitting it when unset keeps older servers and clients compatible. This is the same value returned by /v1/models (see the web server reference); use /aura/info when a client also wants the worker or MCP-server metadata this endpoint provides. The workers array is omitted for non-orchestration agents. Each worker’s model is included only when it overrides the coordinator model. mcp_servers is a credential-free view of the agent’s configured MCP servers, keyed by name and tagged by transport (stdio, http_streamable, or sse). URLs are reduced to their origin (scheme://host:port) — path, query, fragment, and userinfo are all dropped, since any of them can carry a token. A stdio server shows only the executable basename as command; its arguments and environment are never included, and neither are headers or headers_from_request. A URL that cannot be reduced to an origin appears as the sentinel <invalid url>, and a command with no extractable file name as <unknown>. An empty object means no configured MCP servers, while a populated one lists them. Older servers omit the field entirely, and the CLI then uses its generic startup call-to-action.

Custom AURA Events (Optional)

Most custom AURA events are optional and require AURA_CUSTOM_EVENTS=true. HITL approval lifecycle events are the exception: the server emits them whenever an approval route needs clients to observe or act on approval state.

Custom Event Types

Event Flow

Event Formats

Custom events use the SSE event: field to distinguish from standard OpenAI chunks: Tool requested (immediate UI feedback when LLM decides to call a tool):
Tool start (when MCP execution actually begins):
Note: progress_token is included when available from the MCP client. Use it to correlate with aura.progress events. Tool complete (success):
Tool complete (failure):
Note:
  • Successful tool results include the result field (truncated per TOOL_RESULT_MAX_LENGTH, default 1000 chars)
  • Tool errors are automatically detected from Rig’s error format prefixes (ToolCallError:, JsonError:, Tool returned an error:)
  • When detected, success is set to false and the error field contains the full error message
Reasoning (requires both flags):
Progress (MCP notifications from long-running tools):
Note: Progress events are only emitted when:
  1. AURA_CUSTOM_EVENTS=true is set
  2. The MCP server sends notifications/progress messages during tool execution
Session info (emitted once at stream start):
Note: aura.session_info includes only CorrelationContext fields (session_id, trace_id) — no agent_id. model_context_limit comes from the context_window field in the [agent.llm] TOML config section (or [orchestration.worker.<name>.llm] for per-worker overrides). If context_window is not set, model_context_limit is omitted from the event. MCP status (emitted once when at least one MCP server is configured — at stream start in single-agent mode, or just after the shared manager connects in orchestration mode):
Note: status is one of connected, failed, or not_attempted. This lets a client distinguish a server that is configured but unavailable (failed, with a reason) from one that connected and legitimately exposes no tools (connected, tools_count: 0). reason is present only for failed servers. The event is omitted entirely when no servers are configured. aura.mcp_status includes only CorrelationContext fields (session_id, trace_id) — no agent_id. In orchestration mode all workers share a single McpManager, so one aura.mcp_status reports the whole run’s server status. The wire shape is identical to single-agent mode; it just arrives slightly later (after the manager connects, before planning) rather than at stream start. Requires AURA_CUSTOM_EVENTS=true in both modes. Worker phase (phase transitions in multi-agent mode):
Possible phase values: "planning", "executing", "analyzing". task_id and parent_agent_id are omitted when not set. Tool usage (usage snapshot after tool execution rounds):
Emitted from the on_stream_completion_response_finish hook when usage data is available. Associates the completed tool IDs with a token usage snapshot. No agent_id field (only CorrelationContext). Usage (final token usage at stream end):
Use prompt_tokens with model_context_limit from aura.session_info to calculate context window fill percentage: (prompt_tokens / model_context_limit) * 100. No agent_id field (only CorrelationContext). Scratchpad usage (per-agent report when an agent finishes with scratchpad activity):
Emitted once per agent that used scratchpad. It fires for both single-agent and orchestration worker contexts (in the latter, agent_id is the worker name). tokens_intercepted is the total tool output diverted to disk; tokens_extracted is what the agent pulled back into context via the scratchpad exploration tools. Approval requested (HITL approval request raised):
Approval pending (conversational HITL is waiting for an attended decision):
Approval completed (HITL approval reached a terminal outcome):
Approval events are emitted even when AURA_CUSTOM_EVENTS=false because they are protocol lifecycle events, not optional telemetry. The webhook route emits aura.approval_requested before dispatch and aura.approval_completed for all terminal webhook outcomes. The conversational route emits aura.approval_requested, then aura.approval_pending while the tool call is parked, then aura.approval_completed after the decision, timeout, or cancellation. outcome.kind is one of approved, denied, timed_out, cancelled, or errored; errored represents channel faults such as transport errors, non-2xx responses, or invalid JSON. aura.approval_pending is reserved for the conversational route and is not emitted by the webhook route.

Client Handling

Standard OpenAI clients will ignore these events (they only process data: lines without event: prefix). Custom clients can filter by event type:

Correlation Fields

Most custom events include correlation fields for tracing: Approval lifecycle events carry decision_id and HITL scope instead of the shared AgentContext / CorrelationContext fields. Use decision_id to correlate aura.approval_requested with aura.approval_completed, and inspect scope for the requesting surface (single, worker, or future coordinator).

Tool Event Correlation

Use these fields to correlate tool-related events: Example correlation:

Orchestration Events

When orchestration.enabled = true and AURA_CUSTOM_EVENTS=true, the server emits orchestration-specific events covering the Plan/Execute/Continue lifecycle. These events are emitted alongside the standard aura.* events above.

Orchestration Event Types

Orchestration Event Flow

Routing decisions happen twice: once on initial query (before any work) and again post-execute (after workers finish). Both paths can produce direct_answer, clarification_needed, or a new plan. The initial routing has no iteration_complete; the post-execute routing always emits one.

Orchestration Event Formats

Plan created (coordinator decomposed query into tasks):
The routing_mode field indicates how the coordinator routed the query:
  • "routed" — classified to a single worker
  • "orchestrated" — multi-task DAG with continuation
The optional planning_response field contains the coordinator’s raw planning text and is omitted when empty. Direct answer (coordinator answered without orchestration):
Clarification needed (coordinator needs more information):
Note: options is omitted when the coordinator does not suggest choices. Task started (worker begins execution):
Worker reasoning (worker thinking with attribution):
Note: requires both AURA_CUSTOM_EVENTS=true and AURA_EMIT_REASONING=true. Worker reasoning is also emitted as aura.reasoning with agent_id set to the worker name (e.g., "arithmetic") and parent_agent_id: "coordinator" for backward-compatible aggregation. Tool call started (coordinator or worker calls a tool):
Note: task_id is omitted if it could not be determined. arguments is omitted when not available. Tool call completed (the matching tool call finished):
Note: task_id is omitted if it could not be determined. result is truncated per TOOL_RESULT_MAX_LENGTH and omitted when empty. Tool coverage: these events fire for the coordinator (worker_id: "main") as well as workers. They cover MCP tools, the skill tools (load_skill, read_skill_file), and orchestration operations (read_artifact, submit_result, list_prior_runs). Scratchpad exploration tools are suppressed by default and emit only when AURA_EMIT_SCRATCHPAD_TOOL_EVENTS is set. Task completed (worker finished with result):
Iteration complete (replan decision after execution):
The reasoning and gaps fields are included only when non-empty (i.e., when replanning is triggered). Phase timing fields (all milliseconds, present on every iteration_complete): To separate time the LLM spent deciding what to call from time spent executing tools, compute execution_ms - tool_ms ≈ LLM-thinking time. This is exact for single-task routes; for parallel waves it is approximate, since tool_ms and task_compute_ms are summed compute rather than wall-clock — compare them against execution_ms to gauge overlap. The same four fields are written to the run manifest (phase_timings) and recorded as orchestration.{planning,execution,task_compute,tool}_ms attributes on the orchestration.iteration OTel span. Replan started (new planning cycle triggered):
Triggers: "post_execute_create_plan" (coordinator routed back to planning after evaluating worker results). Synthesizing (consolidating task results for coordinator decision):
Fires before the post-execute coordinator call. Bookends with iteration_complete, which fires after the coordinator’s routing decision. Note: Workers that use scratchpad emit aura.scratchpad_usage when they finish — see the Custom Event Types section above. This is a base aura.* event (not orchestration-specific) so the same event fires for single-agent deployments and workers alike.

Orchestration Correlation

SSE Event Reference

Event Types by Mode

Message Formats

First text chunk (includes role):
Subsequent text chunks:
Tool call (none mode) - includes actual arguments:
Tool call (open-web-ui mode) - empty arguments for UI compatibility:
Tool result (open-web-ui mode only) - sent as second delta with same index:
Final chunk:
Stream end:

finish_reason Values

Client Examples

JavaScript

Python

Multi-Turn Tool Execution

Unlike standard OpenAI API (where tool execution is client-side), this server executes tools server-side and continues streaming. After tool execution completes, text resumes with a \n\n separator for readability:
The separator is automatically injected when text chunks resume after a ToolResult event.

Connection Behavior

Graceful Shutdown

On SIGTERM or SIGINT, the server performs a two-phase shutdown to let in-flight requests finish: Configure the grace period:
K8s tip: Set terminationGracePeriodSeconds to at least SHUTDOWN_TIMEOUT_SECS + 15 (default: 45s). The total shutdown budget is grace period + 10s Actix buffer. During Phase 1, /health returns 503 — readiness probes will fail immediately, removing the pod from service endpoints.
The /health endpoint returns 503 during shutdown (same middleware gate as all routes). This is intentional — it signals load balancers and K8s readiness probes to stop routing traffic to this instance.

Response Headers