[Feat]: Add streaming-aware helper for artifact updates
Nobody has claimed this yet.
Assessment
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Newbie friendliness
- 55/100
- Issue type
- Feature
- Clarity
- Clearly specified
- Activity status
- Stale
- Tech stack
- python
- Domain
- backend-api-design
Research direction
The helper should be added to a2a/utils/artifact.py. Start by examining the existing new_text_artifact function and the TaskArtifactUpdateEvent class. The new ArtifactStreamer needs to generate a stable UUID, manage state, and produce events with the correct append and last_chunk flags. Update the travel_planner_agent sample to use the new helper as a final step.
Written by the indexing model from the issue text.
Description
Problem
When implementing streaming text output via TaskArtifactUpdateEvent, the current new_text_artifact utility generates a fresh UUID for artifact_id on every call. This makes it impossible to use append=True correctly, since append semantics require a stable artifact_id across chunks.
The sample travel_planner_agent demonstrates this problem — it calls new_text_artifact in a loop:
async for event in self.agent.stream(query):
message = TaskArtifactUpdateEvent(
contextId=context.context_id,
taskId=context.task_id,
artifact=new_text_artifact(
name='current_result',
text=event['content'],
),
)
await event_queue.enqueue_event(message)
Each iteration produces a new artifact_id, so clients cannot merge chunks into a single artifact. This results in N separate artifact cards in the UI instead of one progressively streamed response.
Describe the solution you'd like
Add a stateful streaming helper to a2a.utils that:
- Generates a stable artifact_id once on construction
- Provides an append(text) method that returns a
TaskArtifactUpdateEventwithappend=True,last_chunk=False - Provides a finalize() method that returns a TaskArtifactUpdateEvent with append=True, last_chunk=True
Example API:
from a2a.utils import ArtifactStreamer
streamer = ArtifactStreamer(context_id, task_id, name="response")
async for chunk in llm.stream(prompt):
await event_queue.enqueue_event(streamer.append(chunk))
await event_queue.enqueue_event(streamer.finalize())
This would live in a2a/utils/artifact.py alongside the existing new_text_artifact and new_artifact helpers.
Describe alternatives you've considered
No response
Additional context
- The travel_planner_agent sample should also be updated to use this helper once available.
- The A2A spec defines append on
TaskArtifactUpdateEventas: "If true, the content of this artifact should be appended to a previously sent artifact with the same ID.". So the currentnew_text_artifactusage in a streaming loop is a misuse of the spec's intent.
Code of Conduct
- I agree to follow this project's Code of Conduct
- Dominant language
- Python
- Stars
- 2.2k
- Forks
- 496
- Avg merge
- 2d 6h
- Merged PRs (30d)
- 19
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from a2aproject/a2a-python
-
component: server status:awaiting response
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
a2aproject/a2a-python#1237 · 2 comments · 1 assignee ·
-
component: server status:awaiting response status:stale
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
a2aproject/a2a-python#1215 · 2 comments · 1 assignee ·
-
component: server status:awaiting response status:stale
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
a2aproject/a2a-python#1205 · 3 comments · 1 assignee ·
-
component: server status:awaiting response status:stale
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
a2aproject/a2a-python#1204 · 2 comments · 1 assignee ·
-
component: server
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
a2aproject/a2a-python#1192 · 3 comments · 1 assignee ·
All issues in a2aproject/a2a-python
Similar issues
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
xinnan-tech/xiaozhi-fde-talk#263 ·
-
rules
Difficulty 1/5 Under an hour Newbie friendliness 90/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
huggingface/Repo2RLEnv#163 · 1 comment ·
-
Difficulty 1/5 Under an hour Newbie friendliness 95/100
huggingface/sentence-transformers#4074 ·
-
comp/dashboard invalid P3
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
NousResearch/hermes-agent#121143 ·