AgentCapabilities, a set of OPTIONAL groups, each an object of OPTIONAL
fields. This page states what a declaration obliges. It deliberately does not
specify how a consumer obtains a declaration — see Retrieval.
Declaring
Every group, and every field within a group, is OPTIONAL. A producer declares what it has something to say about and omits the rest. Records a field references keep their own requirements: aSubagentInfo needs its name, and
an entry in tools.items is a Tool.
An omitted field means undeclared, not unsupported. An agent that says
nothing about reasoning has not said it cannot reason; a consumer MUST NOT
infer the absence of a capability from the absence of its declaration. Where an
agent wants to state that something is not supported, the boolean fields exist
to carry false explicitly.
A producer SHOULD declare only what it does. A declaration is a statement to the
application about how to prepare for a run; a declaration the agent does not
honour misleads the interface built on it. There is no obligation to declare
everything true — a minimal declaration is conforming — but what is declared
SHOULD hold.
Declarations are informative, not binding. The event stream is authoritative: a
consumer MUST NOT reject a stream, or treat a run as failed, because an event
arrives that a declaration did not anticipate, or because a declared capability
went unexercised. A run that emits reasoning events under
reasoning: { supported: false } has a producer worth a complaint, not a stream
worth rejecting.
The groups
The groups partition the protocol’s features. Where a group describes an event family, that family’s page governs what the events themselves oblige; the declaration only anticipates them.
Some fields deserve a note beyond their description in the schema.
output.structuredOutput declares that an agent can shape its answer to a
schema, but this version of the protocol has no field through which a consumer
supplies one and no event that identifies output as structured. The declaration
tells an application the agent is able; how a schema reaches the agent and how
the shaped answer comes back are integration-specific, and a consumer MUST NOT
expect a standard event to carry either.
multimodal.output declares what an agent can produce, but this version of
the protocol defines no image or audio output: assistant message content and
TEXT_MESSAGE_CONTENT deltas are text. The declaration is for the application
— which may receive such output through an integration-specific channel — and
nothing in this specification says how it travels. A consumer MUST NOT expect a
standard event to carry it.
tools.items lists the tools the agent provides — its own functions, search,
code execution — and is distinct from RunAgentInput.tools, which carries the
tools the application offers for one run. The two never merge: an agent’s own
tools are not the application’s to execute, and the application’s are not
declared here.
multiAgent.subagents names the subagents an agent may invoke, for selection
interfaces. It is a list of definitions, not of invocations: the identifiers a
consumer meets on the wire are subagentRunId values, one per invocation,
minted at run time — Subagents governs those,
and nothing here predicts them.
Two transport flags likewise describe mechanisms this version does not
define. transport.resumable speaks of resuming an interrupted stream by
sequence number, and transport.pushNotifications of delivery after a run has
finished; neither HTTP binding carries sequence
numbers, resumes a stream, or defines a post-run channel. An agent MAY declare
them for a transport of its own; a consumer MUST NOT expect either of the
standard bindings to honour them.
identity.metadata and custom
Two open objects carry what the standard fields do not. identity.metadata is
the protocol’s Metadata shape — open by key, any
JSON value under a key — for integration-specific identity information. custom
is the escape hatch for capabilities that fit no standard group. Both are open
by key: a consumer MUST preserve what it does not recognise inside them rather
than stripping it, exactly as for metadata elsewhere. The protocol attaches no
meaning to either.