Messages, Parts, and Artifacts

Agents need to exchange more than plain strings — instructions, files, images, structured data, and finished deliverables — and A2A's content model handles all of it with three composable objects.

Once two agents have found each other and framed work as a task, they need a way to actually communicate: to send instructions and data back and forth, and to return finished outputs. The Agent2Agent protocol (A2A) models this with three objects — Message, Part, and Artifact. This fourth post in the series covers the content model, how multi-modal content is represented, and the important distinction between the conversation and its deliverables.

Messages: the turns of the conversation

A Message is a single communication turn between a client agent and a remote agent. Its key fields:

Messages are how the two sides talk during a task. The client sends a message to kick off or advance the work; the remote agent replies with messages as it asks questions, reports progress, or delivers results. The role field keeps the direction unambiguous, and the taskId/contextId keep each message anchored to its task and broader conversation. A task’s history is, in effect, the sequence of these messages.

Parts: the multi-modal content unit

A Message’s content is not a bare string — it is a list of Parts, and each Part is one piece of content of a specific kind. This is how A2A stays multi-modal. A Part is one of:

Because a Message holds an array of Parts, a single turn can mix modalities — a text instruction alongside an image, or a description alongside a link to a document. And because Parts distinguish inline binary (raw) from referenced content (url), agents can choose the efficient representation: embed small payloads, link to large ones. The content model does not privilege text; it treats it as one Part kind among several, which is what lets A2A carry the messy, multi-modal inputs and outputs real agent work involves.

Conceptually, a message with mixed parts:

{
  "messageId": "m-102",
  "role": "ROLE_USER",
  "taskId": "t-55",
  "parts": [
    { "text": "Translate the attached contract into French." },
    { "url": "https://files.example.com/contract-en.pdf" }
  ]
}

Artifacts: the deliverables

Messages carry the conversation; Artifacts carry the results. An Artifact is an output the task produces — the finished translation, the generated report, the computed dataset. Its fields:

Artifacts live on the Task (its artifacts field), not inside a single message. This separation is deliberate and worth dwelling on: the conversation about the work is distinct from the products of the work. A long task might exchange many messages — clarifications, progress notes — and produce one or several artifacts at the end. Keeping deliverables as first-class Artifacts on the task means a client can retrieve the outputs cleanly by fetching the task, without parsing them out of a chat log, and a task can accumulate multiple outputs (a report plus its supporting data) as distinct, addressable results.

Messages versus artifacts: the mental model

The distinction is the key idea of this post, so make it concrete:

A remote agent that translates a document exchanges messages (“what target language?”, “working on it”) and then produces an Artifact (the translated file). Reusing the same Part model for both keeps the content representation uniform, while separating the two keeps “what was said” distinct from “what was produced.” When you design an A2A agent, decide deliberately which outputs are conversational messages and which are true artifacts — the latter are what clients will retrieve and depend on.

Key takeaways

Further reading

Sources & References

Message, Part, Artifact