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.
Each agent’s id matches the id field in /v1/models (alias if set, otherwise agent name). 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