Agent Trajectory Observability Format (ATOF)
Agent Trajectory Observability Format (ATOF)
Use the atof section when you want the raw Agent Trajectory Observability
Format (ATOF) 0.1 event stream written as JSONL or streamed to raw-event
collectors.
ATOF JSONL export is useful for local debugging, offline inspection, and preserving the canonical event stream before it is translated into another format. Streaming endpoints are useful when a collector wants the same raw event shape in near real time.
plugins.toml Example
Add the following ATOF exporter configuration to plugins.toml:
This configuration registers the plugin-managed ATOF exporter and writes one
JSON object per lifecycle event to logs/events.jsonl. It also sends each raw
ATOF event to the configured endpoint.
Fields
The following table describes the top-level ATOF settings:
Streaming Endpoints
Each endpoint receives the same raw ATOF JSON object that the file exporter writes as one JSONL line. Endpoints are independent: a failed endpoint is skipped or retried without blocking file output or other endpoints.
The following table describes each streaming endpoint:
preserve sends canonical ATOF field names unchanged. replace_dots replaces
dots in JSON object keys with underscores recursively. If replacement produces
a collision, Relay keeps both values and deterministically appends _2, _3,
and later suffixes as needed. Validation rejects any other
endpoints[i].field_name_policy value.
http_postsends each event as one JSONL record in an HTTPPOSTrequest withContent-Type: application/x-ndjson. Any2xxresponse is treated as success.websocketopens one connection and sends each event as one JSON text message.ndjsonopens one long-lived HTTP upload and writes each event as one newline-delimited JSON record.
force_flush() flushes file output and drains queued endpoint events without
closing streaming connections. shutdown() is terminal: it flushes pending
work, closes streaming connections, and makes later events no-op.
Expected Output
Each emitted scope, tool, LLM, middleware, or mark event is written as one ATOF JSON object per line. For event field semantics, refer to Events.
ATOF is the raw-event export path. It preserves the canonical event shape; it does not add semantic extraction, replay policy, scope-owner resolution, or exporter projection rules.
Register the plugin before instrumented work starts and clear it during shutdown so file handles flush.
Plugin Configuration
Use plugin configuration when the application should let NeMo Relay own the ATOF exporter lifecycle. The following examples configure and activate the ATOF exporter through each supported language binding.
validate() checks only the supplied in-memory object. initialize() also
layers discovered plugins.toml configuration. For effective file-backed
validation, refer to Plugin Configuration Files
and run the gateway with the same configuration path that production uses.
Python
Node.js
Rust
Manual API
Use the manual AtofExporter API when a test or script needs a custom
subscriber name or explicit registration window.
Python
Node.js
Rust
Common Configuration and Runtime Issues
modeis notappendoroverwrite.endpoints[i].urlis empty,endpoints[i].transportis not supported, orendpoints[i].timeout_millisis0.- The output directory is not writable at runtime.
nemo-relay doctorcannot deliver its synthetic ATOF mark probe to a configured endpoint.- ATOF is enabled in a target that cannot access the native filesystem.