Agent Trajectory Interchange Format (ATIF)
Agent Trajectory Interchange Format (ATIF)
Agent Trajectory Interchange Format (ATIF)
Use the atif section when you want one Agent Trajectory Interchange Format
(ATIF) trajectory artifact per top-level agent run.
The plugin-managed ATIF dispatcher watches for direct child scopes with category
agent, creates a scope-local exporter for each one, and writes the trajectory
when that agent scope ends. Nested agent scopes remain in the parent
trajectory.
plugins.toml ExampleThis configuration writes a trajectory file such as
logs/trajectory-<scope-uuid>.json for each top-level agent scope.
For sandboxed runtimes such as NemoClaw / Omnistation / OpenShell, where local
trace files are not durable across sessions, configure storage to ship
completed trajectories directly to object storage. When storage is non-empty
the local file write is replaced by uploads to every configured backend;
output_directory is ignored.
Each storage entry is tagged with a type discriminator so additional
backends can be added without breaking existing configs. Today, S3-compatible
object storage is supported.
Add additional [[components.config.atif.storage]] tables to fan out the same
trajectory to every destination — for example, an in-cluster MinIO target and a
remote AWS target:
By default, credentials, region, and endpoint URL are read from the standard AWS environment variables. Any non-secret connection field can also be set directly in the config so a single file can describe a complete destination, which is what unblocks running multiple S3-compatible endpoints side by side (for example, an in-cluster MinIO target and a remote AWS target):
Explicit fields take precedence; anything left unset falls back to the matching
AWS_* environment variable.
Secret values stay out of checked-in config files. Each secret field carries a
_var suffix and holds the name of an environment variable that contains the
secret value. The name is validated at plugin initialization time:
Each trajectory is uploaded under {key_prefix}{rendered_filename}. The
filename_template is rendered the same way it would be for local files, so a
local→remote transition keeps object names stable. A trailing / is added to
key_prefix when one is missing.
If an upload fails for a given destination, that destination is recorded as unhealthy and skipped on later trajectories. The other destinations continue to receive writes. All recorded sink failures are joined into the dispatcher’s last-error result on plugin teardown.
The exporter translates NeMo Relay lifecycle events into ATIF v1.7 trajectory
data. LLM start and end events become model steps, tool events become tool
calls and observations, and scope nesting contributes lineage metadata.
Nested agent scopes are embedded in the parent file as subagent_trajectories
and referenced from parent observation results with
subagent_trajectory_ref.trajectory_id. The reference points to the embedded
child trajectory by ID so consumers can validate the parent and child as one
single-file ATIF v1.7 artifact.
The plugin writes each trajectory when the top-level agent scope closes. If the plugin is cleared while an agent is still open, teardown flushes the partial trajectory.
To correlate ATIF with OpenTelemetry or OpenInference traces from the same run,
join on NeMo Relay UUIDs. The plugin-managed ATIF session_id is the top-level
agent scope UUID. Each step’s extra.ancestry.function_id is the event UUID,
and extra.ancestry.parent_id is the parent event UUID. Trace spans expose the
same values as nemo_relay.uuid and nemo_relay.parent_uuid attributes.
Use plugin configuration when the application should let NeMo Relay own the ATIF dispatcher lifecycle.
Use the manual AtifExporter API when you need explicit collection boundaries
or one exporter object per run.
filename_template does not contain {session_id}.extra metadata are not JSON-compatible.agent scope, so no trajectory file
is created.storage[i].type is unknown or storage[i].bucket is empty for some entry.storage is non-empty in a build that was compiled without the
atif-storage feature, or on a target (such as WebAssembly) where remote
storage is not supported.