Skip to main content

ObserverEvent

Enum ObserverEvent 

#[non_exhaustive]
pub enum ObserverEvent {
Show 21 variants AgentStart { model_provider: String, model: String, channel: Option<String>, agent_alias: Option<String>, turn_id: Option<String>, }, LlmRequest { model_provider: String, model: String, messages_count: usize, channel: Option<String>, agent_alias: Option<String>, parent_agent_alias: Option<String>, turn_id: Option<String>, }, LlmResponse { model_provider: String, model: String, duration: Duration, success: bool, error_message: Option<String>, input_tokens: Option<u64>, output_tokens: Option<u64>, messages: Option<LlmMessageSnapshot>, channel: Option<String>, agent_alias: Option<String>, parent_agent_alias: Option<String>, turn_id: Option<String>, }, AgentEnd { model_provider: String, model: String, duration: Duration, tokens_used: Option<TurnTokenUsage>, cost_usd: Option<f64>, channel: Option<String>, agent_alias: Option<String>, turn_id: Option<String>, }, ToolCallStart { tool: String, tool_call_id: Option<String>, arguments: Option<String>, channel: Option<String>, agent_alias: Option<String>, parent_agent_alias: Option<String>, turn_id: Option<String>, }, ToolCall { tool: String, tool_call_id: Option<String>, duration: Duration, success: bool, arguments: Option<String>, result: Option<String>, channel: Option<String>, agent_alias: Option<String>, parent_agent_alias: Option<String>, turn_id: Option<String>, }, MemoryRecall { query_summary: Option<String>, duration: Duration, num_entries: usize, backend: String, success: bool, channel: Option<String>, agent_alias: Option<String>, turn_id: Option<String>, }, MemoryStore { category: String, backend: String, duration: Duration, success: bool, channel: Option<String>, agent_alias: Option<String>, turn_id: Option<String>, }, MemoryAudit { action: String, backend: String, duration: Duration, success: bool, }, RagRetrieve { query_summary: Option<String>, duration: Duration, num_chunks: usize, num_boards: usize, channel: Option<String>, agent_alias: Option<String>, turn_id: Option<String>, }, TurnComplete, ChannelMessage { channel: String, direction: String, }, HeartbeatTick, CacheHit { cache_type: String, tokens_saved: u64, }, CacheMiss { cache_type: String, }, Error { component: String, message: String, }, DeploymentStarted { deploy_id: String, }, DeploymentCompleted { deploy_id: String, commit_sha: String, }, DeploymentFailed { deploy_id: String, reason: String, }, RecoveryCompleted { deploy_id: String, }, HistoryTrimmed { dropped_messages: usize, kept_turns: usize, reason: String, channel: Option<String>, agent_alias: Option<String>, turn_id: Option<String>, },
}
Expand description

Discrete events emitted by the agent runtime for observability.

Each variant represents a lifecycle event that observers can record, aggregate, or forward to external monitoring systems. Events carry just enough context for tracing and diagnostics without exposing sensitive prompt or response content.

Marked #[non_exhaustive] so out-of-tree observer implementations degrade gracefully when new variants are added in future minor releases — they must include a wildcard arm in their match expressions and will simply ignore unknown event kinds. Exception: under the observability-otel feature, ObserverEvent::LlmResponse carries credential-scrubbed prompt/completion content in messages for GenAI semantic-convention export. See LlmMessageSnapshot.

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

AgentStart

The agent orchestration loop has started a new session.

Fields

§model_provider: String
§model: String
§channel: Option<String>
§agent_alias: Option<String>
§turn_id: Option<String>
§

LlmRequest

A request is about to be sent to an LLM model_provider.

This is emitted immediately before a model_provider call so observers can print user-facing progress without leaking prompt contents.

Fields

§model_provider: String
§model: String
§messages_count: usize
§channel: Option<String>
§agent_alias: Option<String>
§parent_agent_alias: Option<String>

The delegating agent’s alias when this record was produced by a nested cross-agent execution (e.g. a live SOP step that named a different agent): agent_alias is the EFFECTIVE agent whose policy/tools executed; this preserves the parent correlation. None for ordinary single-agent turns.

§turn_id: Option<String>
§

LlmResponse

Result of a single LLM model_provider call.

Fields

§model_provider: String
§model: String
§duration: Duration
§success: bool
§error_message: Option<String>
§input_tokens: Option<u64>
§output_tokens: Option<u64>
§messages: Option<LlmMessageSnapshot>

Credential-scrubbed prompt/completion content for OTel GenAI export. None unless the observability-otel feature is active. When populated, whether the content is exported (and at which privacy level) is gated by the receiving OtelObserver’s instance content policy, not by the capture path. See LlmMessageSnapshot.

§channel: Option<String>
§agent_alias: Option<String>
§parent_agent_alias: Option<String>

The delegating agent’s alias when this record was produced by a nested cross-agent execution (e.g. a live SOP step that named a different agent): agent_alias is the EFFECTIVE agent whose policy/tools executed; this preserves the parent correlation. None for ordinary single-agent turns.

§turn_id: Option<String>
§

AgentEnd

The agent session has finished.

Carries aggregate usage data (tokens, cost) when the model_provider reports it.

Fields

§model_provider: String
§model: String
§duration: Duration
§tokens_used: Option<TurnTokenUsage>
§cost_usd: Option<f64>
§channel: Option<String>
§agent_alias: Option<String>
§turn_id: Option<String>
§

ToolCallStart

A tool call is about to be executed.

Fields

§tool: String
§tool_call_id: Option<String>

Provider-assigned tool call identifier, when the underlying tool call originated from a native structured tool call block (e.g. OpenAI tool_calls[].id, Anthropic tool_use.id). None for text-parsed (XML/markdown) tool calls.

Observers can correlate ToolCallStartToolCall → the emitting LLM response via this id.

§arguments: Option<String>

Full JSON arguments the agent passed to the tool. None when arguments are unavailable at the call site.

§channel: Option<String>
§agent_alias: Option<String>
§parent_agent_alias: Option<String>

The delegating agent’s alias when this record was produced by a nested cross-agent execution (e.g. a live SOP step that named a different agent): agent_alias is the EFFECTIVE agent whose policy/tools executed; this preserves the parent correlation. None for ordinary single-agent turns.

§turn_id: Option<String>
§

ToolCall

A tool call has completed with a success/failure outcome.

Fields

§tool: String
§tool_call_id: Option<String>

Provider-assigned tool call identifier, when present. See ObserverEvent::ToolCallStart::tool_call_id.

§duration: Duration
§success: bool
§arguments: Option<String>

Full JSON arguments the agent passed to the tool.

Carried here (in addition to ToolCallStart) so observers that build a single completed span per tool call — e.g. the OTel exporter — can attach arguments at span-end time without holding per-call state.

§result: Option<String>

Scrubbed tool output or error reason. Populated for both success and failure outcomes so backends can show the actual tool result in trace viewers. Credentials are scrubbed before this field is emitted.

§channel: Option<String>
§agent_alias: Option<String>
§parent_agent_alias: Option<String>

The delegating agent’s alias when this record was produced by a nested cross-agent execution (e.g. a live SOP step that named a different agent): agent_alias is the EFFECTIVE agent whose policy/tools executed; this preserves the parent correlation. None for ordinary single-agent turns.

§turn_id: Option<String>
§

MemoryRecall

A memory recall (search) operation has completed.

Emitted at the runtime boundary after a hybrid-search query against the brain DB. Carries an optional query_summary for diagnostics — scrubbed and truncated user text, not a privacy-clean token. The runtime applies scrub_credentials first and then truncates to ≤200 content chars (with a 3-char ... ellipsis appended when truncation occurred); short non-credential queries pass through unchanged.

Fields

§query_summary: Option<String>

Scrubbed and truncated query summary. None when the caller has no meaningful query to record (e.g., session-scoped fetches).

§duration: Duration
§num_entries: usize

Number of MemoryEntry rows returned by the recall call.

§backend: String

Bounded backend identifier (e.g. "sqlite", "qdrant", "none").

§success: bool
§channel: Option<String>
§agent_alias: Option<String>
§turn_id: Option<String>
§

MemoryStore

A memory store (write) operation has completed.

Emitted after persisting a memory entry. Carries only bounded fields — the raw memory key is intentionally omitted because keys can encode high-cardinality identifiers (UUIDs, phone numbers, message timestamps) that would blow up Prometheus label series.

Fields

§category: String

Memory category ("core", "daily", "conversation", etc.) — bounded set, safe to use as a Prometheus label.

§backend: String

Bounded backend identifier (e.g. "sqlite", "qdrant").

§duration: Duration
§success: bool
§channel: Option<String>
§agent_alias: Option<String>
§turn_id: Option<String>
§

MemoryAudit

A memory audit/operator action was recorded on the audit trail.

Carries only bounded labels. The action is an audit verb such as "store", "recall", or "purge"; raw memory keys and content are intentionally excluded from this event.

Fields

§action: String

Bounded audit action name, safe to use as a metric label.

§backend: String

Bounded backend identifier (e.g. "sqlite", "qdrant").

§duration: Duration
§success: bool
§

RagRetrieve

A RAG retrieval pass has completed.

Emitted after vector + keyword retrieval against the hardware datasheet index. Reports cardinalities only; carries an optional scrubbed-and-truncated query summary on the same terms as Self::MemoryRecall. Has no success field because the underlying rag.retrieve call is synchronous and infallible.

Fields

§query_summary: Option<String>
§duration: Duration
§num_chunks: usize
§num_boards: usize
§channel: Option<String>
§agent_alias: Option<String>
§turn_id: Option<String>
§

TurnComplete

The agent produced a final answer for the current user message.

§

ChannelMessage

A message was sent or received through a channel.

Fields

§channel: String

Channel name (e.g., "telegram", "discord").

§direction: String

"inbound" or "outbound".

§

HeartbeatTick

Periodic heartbeat tick from the runtime keep-alive loop.

§

CacheHit

Response cache hit — an LLM call was avoided.

Fields

§cache_type: String

"hot" (in-memory) or "warm" (SQLite).

§tokens_saved: u64

Estimated tokens saved by this cache hit.

§

CacheMiss

Response cache miss — the prompt was not found in cache.

Fields

§cache_type: String

"response" cache layer that was checked.

§

Error

An error occurred in a named component.

Fields

§component: String

Subsystem where the error originated (e.g., "model_provider", "gateway").

§message: String

Human-readable error description. Must not contain secrets or tokens.

§

DeploymentStarted

A deployment has started.

Fields

§deploy_id: String

Identifier for the deployment (e.g., commit SHA or release tag).

§

DeploymentCompleted

A deployment has completed successfully.

Fields

§deploy_id: String
§commit_sha: String

Commit SHA that was deployed.

§

DeploymentFailed

A deployment has failed.

Fields

§deploy_id: String
§reason: String

Human-readable failure reason.

§

RecoveryCompleted

Recovery from a failed deployment has completed.

Fields

§deploy_id: String
§

HistoryTrimmed

The agent trimmed oldest whole turns from history to fit either the context token budget or the configured message limit. Carries the cut accounting so dashboards and clients can surface a visible “context was trimmed” signal instead of the agent silently losing earlier turns.

Fields

§dropped_messages: usize
§kept_turns: usize
§reason: String
§channel: Option<String>
§agent_alias: Option<String>
§turn_id: Option<String>

Trait Implementations§

Source§

impl Clone for ObserverEvent

Source§

fn clone(&self) -> ObserverEvent

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · §

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ObserverEvent

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.