| Internet-Draft | AAIF | June 2026 |
| van Bussel | Expires 27 December 2026 | [Page] |
The Autonomous Agent Interchange Format (AAIF) is an open, vendor-neutral specification for the portable definition of artificial intelligence agents. An AAIF document encapsulates an agent's identity, goal, system instructions, large language model (LLM) provider preferences and fallback routing, multi-agent orchestration topology (sequential pipeline, parallel swarm, dynamic routing, and mid-run handoff), tool catalogue (supporting function, MCP, HTTP, and OpenAPI protocols with structured authentication), memory configuration, runtime policy, OpenTelemetry telemetry settings, LLM-as-judge evaluation criteria, and compliance controls including data residency and human-in-the-loop approval.¶
An agent defined in AAIF can be validated offline, committed to version control, and imported into any conforming runtime regardless of the original authoring environment. This document describes the AAIF data model, field semantics, conformance levels, capability negotiation protocol, and the companion Agent State checkpoint schema that enables cross-platform live migration of running agents.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 27 December 2026.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document.¶
The multi-agent LLM platform ecosystem, as of mid-2026, comprises more than a dozen actively developed frameworks: LangGraph, CrewAI, AutoGen, Open WebUI, Cline, Semantic Kernel, BeeAI, Haystack, DSPy, Agno, and the native agent APIs of OpenAI, Anthropic, and Google. Each framework has defined its own concept of an agent and its own storage format. An agent authored for LangGraph cannot be imported into CrewAI. A definition written for Open WebUI is unreadable by AutoGen. Every platform has solved the same problem in an incompatible way, and the developer is the primary victim of that incompatibility.¶
This fragmentation has direct operational consequences. Agent definitions encode business logic: the instructions that shape an AI's persona, the constraints that prevent harmful actions, the tools the agent may call and the authentication credentials it uses, and the compliance rules it must follow. When that logic is locked inside a proprietary format, it cannot be audited independently, cannot be migrated without manual recreation, and cannot be shared across team boundaries that use different tooling. An agent definition is becoming a new kind of compliance artefact, with the same importance as a data processing agreement or terms-of-service document. It deserves the same portability.¶
Analogous fragmentation problems have been solved before. Database connectors fragmented until ODBC. Email clients fragmented until SMTP and MIME. Calendar applications fragmented until iCalendar [RFC5545]. Container deployments fragmented until the Open Container Initiative image format. In every case, the industry converged on a shared definition format because the cost of incompatibility became high enough that a neutral standard was the rational choice for all parties. The multi-agent LLM market is approaching that inflection point.¶
This document specifies the Autonomous Agent Interchange Format (AAIF), a portable, vendor-neutral definition format for AI agents. AAIF standardises the declaration of an agent — its identity, capabilities, and constraints — not its execution loop, so that a definition created in one runtime can be imported and executed in any other conforming runtime.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
AAIF is in scope for: agent name, goal, and system instructions; LLM provider preferences and multi-provider fallback routing; tool catalogue with protocol and authentication declarations; memory backend configuration; multi-agent orchestration topology; runtime policy (timeout, retry, concurrency); telemetry endpoints; evaluation criteria and golden test cases; compliance controls (data residency, PII handling, human-in-the-loop approval, audit logging); and agent provenance including cryptographic signature.¶
AAIF is out of scope for: the agent execution loop itself; billing and metering; provider-specific internal optimisations; and streaming response wire formats between an agent and an end user (as opposed to agent-to-agent state handoff, which is in scope for the Agent State schema described in Section 8).¶
AAIF is built on seven design principles:¶
An AAIF agent definition is a JSON object validated against the AAIF agent schema (JSON Schema draft 2020-12 [JSON-SCHEMA]). The minimum conformant document requires only three fields:¶
{
"sc_standard": "SC-006",
"agent": {
"name": "Example Agent",
"goal": "Assist users with their enquiries."
}
}
¶
The full object model is organised as a tree with a root that carries document-level metadata, an agent block containing the operational declaration, and a provenance block:¶
AgentDefinition (root)
sc_standard "SC-006" (required)
sc_version string (semver, default "3.4.0")
agent_id string (UUID, stable across import/export)
status draft | active | deprecated
tags[] string[]
agent
name / version / description / goal / instructions / skills[]
required_capabilities[] (capability negotiation, Section 7)
model
provider / preferred / provider_id / base_url
fallbacks[] (ordered multi-provider fallback chain)
routing_strategy cost | latency | quality | round_robin
min_context_tokens (routing guard)
params / params.extended / response_format
orchestration
role orchestrator | worker | evaluator | router | synthesizer
subagents[] / handoff[] / pipeline[]
parallel_execution / max_iterations / consensus
context[] (RAG sources: text / file / url / dataset)
tools[] (Section 5.3)
memory[] (Section 5.4)
constraints[] (hard guardrails, enforced by runtime)
io (input/output schemas, streaming, mode)
events (triggers and lifecycle hooks)
runtime (timeout, retries, concurrency, queue)
telemetry (OTEL tracing, metrics, OTLP endpoint)
evaluation (LLM-as-judge, metrics, test cases)
compliance (safety_level, data_residency, PII, audit)
provenance
authored_by / source_platform / created_at / updated_at
license / sc_refs[] / signature
¶
The sc_standard field MUST be the string "SC-006". This serves as the document type discriminator.¶
The agent_id field is a UUID assigned once at agent creation. It MUST NOT change on import, export, or version bump. Consumers SHOULD use it as the canonical deduplication key.¶
The status field reflects the agent definition's lifecycle: "draft" (under development), "active" (production-ready), or "deprecated" (retained for back-compat only). Consumers MAY refuse to execute "deprecated" agents.¶
The agent.model block expresses routing intent rather than a hard binding to a specific model. A conforming Consumer MUST implement the following routing algorithm:¶
The model.provider field enumerates 16 standard providers: openai, anthropic, google, vertex_ai, mistral, cohere, groq, ollama, azure_openai, bedrock, huggingface, together, fireworks, deepseek, xai, openrouter. For providers not in the enumeration (gateway proxies, self-hosted deployments, or new entrants), authors set model.provider to "custom" and supply model.provider_id (a stable string identifier, e.g. "copilot" or "litellm") and optionally model.base_url (an OpenAI-compatible API base URL). This keeps the standard open-ended without enum churn for each new gateway.¶
The model.params.extended field is an open object that carries provider-specific parameters not covered by standard fields (e.g. extended thinking budget for Anthropic models). The Consumer forwards these verbatim to the provider API and MUST NOT validate their contents.¶
AAIF defines five agent roles and four topology patterns that cover the majority of multi-agent LLM architectures observed in production.¶
The five roles are:¶
The four topology patterns are:¶
These patterns compose freely. A pipeline step can itself be a swarm; a swarm worker can trigger a handoff. The orchestration.max_iterations field provides a loop guard (default 10) that the Consumer MUST enforce.¶
Each entry in agent.tools[] declares a tool in one of four protocols:¶
Every tool entry MAY carry a structured auth block. The auth.type field names the authentication mechanism (bearer, api_key, oauth2, aws_sigv4, basic, mtls, or none). Secrets MUST NOT appear inline in the AAIF document. The auth.env_var field names an environment variable whose value the Consumer resolves at runtime. The auth.vault_ref field (introduced in v2.1) provides a structured reference to a secret in an external vault — AWS Secrets Manager, HashiCorp Vault, Azure Key Vault, GCP Secret Manager, or 1Password — identified by provider, path, key, and optional version. When both env_var and vault_ref are declared, vault_ref takes precedence.¶
Additional per-tool fields control cache_ttl_seconds (cache successful responses), timeout_seconds (per-call timeout), and rate_limit (requests_per_minute and tokens_per_minute).¶
AAIF distinguishes four memory scopes reflecting fundamentally different retention and privacy requirements:¶
Each memory entry declares a backend from the standard vocabulary: in_memory, redis, postgres, sqlite, pinecone, weaviate, qdrant, chroma, or custom. Vector backends additionally declare an embedding_model, a retrieval_strategy (similarity, keyword, hybrid, or recency), and top_k (number of items to retrieve per query, default 5). A ttl_seconds field controls expiry; zero means never expire.¶
The agent.runtime block declares production safety controls. A Consumer MUST abort execution after runtime.timeout_seconds and return a structured error. A Consumer MUST NOT exceed runtime.concurrency simultaneous instances. The retry policy is controlled by max_retries and retry_backoff (fixed, linear, or exponential; default exponential).¶
The runtime.async_execution flag enables a Consumer to return a job ID immediately and execute in the background. The runtime.queue field names a work queue for async execution.¶
The agent.telemetry block declares OpenTelemetry [OTEL] configuration. A Consumer with telemetry.tracing set to true SHOULD emit the following spans per agent run:¶
The telemetry.otlp_endpoint field specifies the OTLP collector endpoint. If omitted, the Consumer falls back to its platform default. W3C Trace Context [W3C-TRACE] propagation uses the header named in telemetry.trace_context_header (default "traceparent").¶
The agent.evaluation block enables CI/CD quality gating. The judge_model field names the LLM used to evaluate agent outputs (recommended to be at least as capable as the agent model). The metrics[] array declares name and threshold pairs; standard metric names are: faithfulness, relevance, coherence, toxicity, hallucination_rate, task_completion, latency_ms, cost_usd_per_run, and tool_call_accuracy. The test_cases[] array provides golden test inputs with expected outputs and rubric criteria. A Consumer running CI evaluation SHOULD gate promotion to "status: active" on all threshold conditions being met.¶
The agent.compliance block encodes legal and operational requirements that travel with the agent definition and cannot be silently dropped on import.¶
Several AAIF fields gate routing or execution: orchestration.subagents[].when, orchestration.handoff[].condition, events.triggers[].filter, and compliance.human_in_the_loop.trigger. Each accepts a Condition value in one of two forms.¶
The structured form (RECOMMENDED) is an object naming an expression language and an expression string:¶
{
"lang": "jsonpath",
"expr": "$.task.type",
"nl": "task type is code_review"
}
¶
Supported languages are:¶
The optional nl field is a human-readable description for logs and UIs. It is advisory; the structured expr is authoritative.¶
The string form is also accepted for authoring convenience and backward compatibility. A bare string is a hint only — different runtimes interpret it differently (or via an LLM) — and MUST NOT be relied upon for portable, reproducible routing. Consumers SHOULD emit a portability warning when routing on a string condition.¶
A Consumer that supports a declared lang MUST evaluate the structured form deterministically and MUST NOT fall back to LLM interpretation of nl. A Consumer that does not support a declared lang MUST treat the condition as unsatisfied and apply the same behaviour as an unsatisfied required_capability per the agent's safety_level.¶
AAIF defines seven cumulative conformance levels. Conformance is self-certified against the public test suite (tests/conformance/ in the reference repository). There is no central certifying authority; credibility comes from the claim being machine-checkable against publicly available test fixtures.¶
| Level | Requirements |
|---|---|
| Core | Validates against agent schema; agent.name and agent.goal present. |
| Tooled | Core + at least one tool with parameters_schema. |
| Portable | Tooled + constraints[] non-empty + resolvable tools[].endpoint. |
| Multi-agent | Portable + orchestration.role declared + at least one subagent reference or handoff rule. |
| Observable | Portable + telemetry.tracing true + at least one evaluation metric with threshold. |
| Enterprise | Observable + compliance.safety_level declared + compliance.audit_log true + provenance.signature present. |
| Stateful | Enterprise + required_capabilities[] includes state.checkpoint + Agent State checkpoints supported. |
Conformance is per level and per direction. A Producer at level L exports AAIF documents that validate against the schema and satisfy the level-L predicates. A Consumer at level L imports and honours every construct required at that level, including the normative MUST statements for that level.¶
The Stateful level is deliberately advanced. It introduces Agent State checkpoints, cross-platform migration, and streaming handoff (see Section 8). Consumers SHOULD achieve Enterprise conformance before implementing Stateful. Enterprise conformance is independently meaningful and is not a prerequisite for Stateful.¶
Conformance reports validate against schema/conformance-report.schema.json and are published at the well-known path /.well-known/aaif-conformance.json.¶
The agent.required_capabilities[] field declares what an agent requires from its executing runtime. A Consumer MUST check all declared capabilities before accepting an agent definition.¶
Capabilities use a dot-namespaced string format: category.capability. Standard categories and example identifiers:¶
The Consumer behaviour on an unsatisfied capability depends on the agent's compliance.safety_level:¶
Consumers SHOULD publish a machine-readable Platform Manifest at the well-known URL path /.well-known/aaif-manifest.json. The manifest advertises the platform's supported capabilities, conformance level, AAIF versions supported, and an intake endpoint (platform.intake_endpoint) for posting agent definitions. Orchestrators and CI/CD systems can fetch this manifest to perform capability negotiation before dispatching an agent.¶
AAIF v3 introduces a companion schema, agent-state.schema.json, for capturing, serialising, and restoring the complete execution state of a running agent. This enables three primary use cases: pause and resume on the same platform, cross-platform live migration, and crash recovery without full conversation replay.¶
An Agent State document carries the following fields:¶
A cross-platform migration follows seven steps:¶
For uninterrupted mid-generation migration, AAIF v3 defines a streaming handoff wire format:¶
Content-Type: application/x-aaif-handoff+ndjson¶
Each line is a newline-delimited JSON object with a "type" discriminator. Message types are: handoff_init, context_chunk, memory_item, pipeline_state, pending_tool, subagent_ref, handoff_complete, and handoff_error.¶
The stream MUST be transmitted over TLS (HTTPS or WSS); plaintext streaming handoffs are non-conformant. The receiving Consumer MUST verify the migration_token in the handoff_init message before processing subsequent messages. If a handoff_error message is received, the Consumer MUST discard all accumulated state and MUST NOT resume execution. The SHA-256 checksum in handoff_complete MUST be verified against the reconstructed Agent State before execution resumes.¶
AAIF documents are canonically JSON [RFC8259]. For bandwidth-constrained transports (embedded runtimes, edge deployments, high-throughput agent mesh), implementations MAY encode AAIF documents as CBOR (Concise Binary Object Representation) [RFC8949]. The logical structure, field names, enum values, and all constraints of the JSON schemas apply without modification to CBOR-encoded documents. The media type for CBOR-encoded AAIF documents is:¶
application/cbor; profile="https://schemacommons.org/SC-006/cbor"¶
Implementations MUST NOT use integer keys as a compression scheme; field names remain UTF-8 text strings so JSON round-trips are lossless. Any Consumer claiming AAIF conformance at Portable level or above that accepts CBOR-encoded definitions MUST also accept the equivalent JSON encoding and produce identical behaviour.¶
AAIF has several open extension points where new values arise regularly: LLM providers, runtime capabilities, condition languages, vault providers, memory backends, and tool protocols. Rather than requiring a schema version change for each new value, AAIF maintains community registries modelled on IANA's expert-review and specification-required registration policies.¶
Each registry is a machine-readable JSON file validated against a registry meta-schema. The schema enum for each extension point is a convenience subset of the registry; registered values with status "standard" are conformant even if not yet reflected in the schema enum. Values in neither the enum nor the registry MUST use the documented escape hatch (model.provider "custom" with provider_id, or x- extension keys at the document root) rather than inventing unregistered bare enum values.¶
The six registries, their extension points, and registration policies are:¶
| Registry | Extension point | Policy |
|---|---|---|
| providers.json | model.provider | Specification Required |
| capabilities.json | required_capabilities[] | Expert Review |
| condition-languages.json | Condition lang | Specification Required |
| vault-providers.json | auth.vault_ref.provider | Specification Required |
| memory-backends.json | memory[].backend | Specification Required |
| tool-protocols.json | tools[].protocol | Standards Action |
Registration policies follow IANA conventions: First Come First Served (unique identifier and one-line description), Specification Required (stable public specification or documentation URL), Expert Review (Editor sign-off confirming orthogonality and scope), and Standards Action (normative schema change in a new MINOR version).¶
Before drafting this section, the editors searched specifically for an existing standard defining a portable, vendor-neutral agent definition document — the thing AAIF itself is. No such standard was found. The frameworks and protocols discussed below each address an adjacent problem, but none of them defines the complete, importable agent record that AAIF defines. That absence is stated plainly here, rather than overstated or replaced with invented modesty about non-existent competitors.¶
gen_ai.* span attributes and an
invoke_agent to chat/execute_tool span tree;
experimental as of March 2026 but already emitted or instrumented by
LangChain, CrewAI, AutoGen, and AG2, and consumed natively by Datadog,
Honeycomb, and New Relic), and OpenInference [OPENINFERENCE]
(Arize AI's OTel-based convention with ten span kinds: LLM, EMBEDDING,
RETRIEVER, RERANKER, TOOL, CHAIN, AGENT, GUARDRAIL, EVALUATOR, PROMPT). AAIF
defers span-attribute semantics to whichever of these the executing runtime
already speaks, rather than standardising a third, competing vocabulary.
Agent observability and audit-event vocabularies more broadly are out of
scope for this document; see the external prior-art note referenced from the
Schema Commons repository for that adjacent discussion.¶
Consumers MUST treat imported tools[].endpoint values as untrusted input and apply capability gating before activating any tool. An AAIF document from an unknown source could declare a tool endpoint pointing to an attacker-controlled server.¶
Secrets MUST NOT appear inline in AAIF documents. The auth.env_var and auth.vault_ref fields name where the Consumer resolves the secret; they carry a reference, not the credential itself. Tools that carry inline credential values in any field violate this specification and MUST be rejected.¶
The constraints[] array MUST be enforced by the Consumer. A Consumer that silently drops a constraint is in violation of this specification and may permit harmful agent behaviour.¶
Consumers MUST be alert to prompt injection in context[type=url] values fetched at runtime. Content retrieved from declared URLs SHOULD be sanitised or sandboxed before injection into the agent's context window.¶
The compliance.data_residency field MUST be respected. Routing an agent to a provider whose data centres are outside the declared region violates the compliance contract and may have legal consequences.¶
Agent State documents contain conversation history and memory contents, which may include personally identifiable information (PII). The same pii_handling policy declared in the agent definition MUST be applied to Agent State documents at rest and in transit. Agent State documents MUST be transmitted over an encrypted channel.¶
The migration_token in Agent State documents and streaming handoffs MUST be a signed, short-lived token with an expiry of at most 15 minutes. The receiving Consumer MUST verify the token signature before accepting the state. The SHA-256 checksum MUST be verified before restoring state; a mismatch indicates tampering or corruption and the import MUST be rejected.¶
The provenance.signature field carries a Base64-encoded Ed25519 signature over the canonical JSON of the agent definition. Consumers receiving agents from untrusted or third-party sources SHOULD verify this signature before execution.¶
The stack_trace field in Agent State error blocks SHOULD be stripped before exporting a checkpoint to an external platform to avoid disclosing implementation details.¶
This document requests registration of the following media type with IANA.¶
AAIF currently maintains six community extension registries (providers, capabilities, condition languages, vault providers, memory backends, and tool protocols) as described in Section 10. These registries are currently operated by the Schema Commons project. A future revision of this document or an accompanying document may request that IANA operate one or more of these registries under the appropriate IANA registration policies (Specification Required or Expert Review as indicated per registry).¶