Skip to content

Commit 05497e1

Browse files
committed
feat: isDelta property on Message for streaming (#267)
1 parent 61df7d0 commit 05497e1

File tree

4 files changed

+26
-5
lines changed

4 files changed

+26
-5
lines changed

src/a2a/server/events/event_consumer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ async def consume_all(self) -> AsyncGenerator[Event]:
102102

103103
is_final_event = (
104104
(isinstance(event, TaskStatusUpdateEvent) and event.final)
105-
or isinstance(event, Message)
105+
or (isinstance(event, Message) and not event.isDelta)
106106
or (
107107
isinstance(event, Task)
108108
and event.status.state

src/a2a/server/tasks/task_manager.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,25 @@ async def get_task(self) -> Task | None:
7878
logger.debug('Task %s not found.', self.task_id)
7979
return self._current_task
8080

81+
async def add_history_message(self, task: Task) -> None:
82+
"""Adds a message to the task's history.
83+
84+
If the message is not a delta, it appends the message to the history.
85+
If the message is a delta, but with the same messageId, it extends the last message in the history.
86+
If the message is a delta, but with a different messageId, it appends the message to the history.
87+
88+
Args:
89+
task: The task with the message to add to the history.
90+
"""
91+
if not task.status.message:
92+
return
93+
if not task.history:
94+
task.history = [task.status.message]
95+
elif task.history[-1].messageId != task.status.message.messageId:
96+
task.history.append(task.status.message)
97+
elif task.status.message.isDelta:
98+
task.history[-1].parts.extend(task.status.message.parts)
99+
81100
async def save_task_event(
82101
self, event: Task | TaskStatusUpdateEvent | TaskArtifactUpdateEvent
83102
) -> Task | None:
@@ -132,10 +151,7 @@ async def save_task_event(
132151
'Updating task %s status to: %s', task.id, event.status.state
133152
)
134153
if task.status.message:
135-
if not task.history:
136-
task.history = [task.status.message]
137-
else:
138-
task.history.append(task.status.message)
154+
await self.add_history_message(task)
139155
if event.metadata:
140156
if not task.metadata:
141157
task.metadata = {}

src/a2a/server/tasks/task_updater.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,4 +182,5 @@ def new_agent_message(
182182
messageId=str(uuid.uuid4()),
183183
metadata=metadata,
184184
parts=parts,
185+
isDelta=False
185186
)

src/a2a/types.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1336,6 +1336,10 @@ class Message(BaseModel):
13361336
"""
13371337
Identifier of task the message is related to
13381338
"""
1339+
isDelta: bool | None = None
1340+
"""
1341+
Indicates if this is a delta message
1342+
"""
13391343

13401344

13411345
class MessageSendParams(BaseModel):

0 commit comments

Comments
 (0)