Skip to content

Commit f1a167d

Browse files
committed
trying to support intermediate streaming
1 parent d1f05d3 commit f1a167d

File tree

14 files changed

+131
-221
lines changed

14 files changed

+131
-221
lines changed

examples/tutorials/00_sync/000_hello_acp/project/acp.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from agentex.lib.sdk.fastacp.fastacp import FastACP
33
from agentex.lib.types.acp import SendMessageParams
44

5-
from agentex.lib.types.task_message_updates import TaskMessageUpdate
5+
from agentex.types.task_message_update import TaskMessageUpdate
66
from agentex.types.task_message import TaskMessageContent
77
from agentex.types.task_message_content import TextContent
88
from agentex.lib.utils.logging import make_logger

examples/tutorials/00_sync/010_multiturn/project/acp.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from agentex.lib.sdk.fastacp.fastacp import FastACP
66
from agentex.lib.types.acp import SendMessageParams
77
from agentex.lib.types.llm_messages import AssistantMessage, LLMConfig, SystemMessage, UserMessage
8-
from agentex.lib.types.task_message_updates import TaskMessageUpdate
8+
from agentex.types.task_message_update import TaskMessageUpdate
99
from agentex.types.task_message import TaskMessageContent
1010
from agentex.types.task_message_content import TextContent
1111
from agentex.lib.utils.model_utils import BaseModel

examples/tutorials/00_sync/020_streaming/project/acp.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
from agentex.lib.sdk.fastacp.fastacp import FastACP
66
from agentex.lib.types.acp import SendMessageParams
77
from agentex.lib.types.llm_messages import AssistantMessage, LLMConfig, SystemMessage, UserMessage
8-
from agentex.lib.types.task_message_updates import StreamTaskMessageDelta, StreamTaskMessageDone, StreamTaskMessageFull, TaskMessageUpdate, TextDelta
8+
from agentex.types.task_message_update import StreamTaskMessageDelta, StreamTaskMessageDone, StreamTaskMessageFull, TaskMessageUpdate
9+
from agentex.types.task_message_delta import TextDelta
910
from agentex.lib.utils.model_utils import BaseModel
1011
from agentex.types.task_message_content import TaskMessageContent, TextContent
1112

examples/tutorials/10_agentic/00_base/040_other_sdks/project/acp.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88
from agentex.lib.sdk.fastacp.fastacp import FastACP
99
from agentex.lib.types.acp import CancelTaskParams, CreateTaskParams, SendEventParams
1010
from agentex.lib.types.fastacp import AgenticACPConfig
11-
from agentex.lib.types.task_message_updates import (
11+
from agentex.types.task_message_update import (
1212
StreamTaskMessageDelta,
1313
StreamTaskMessageFull,
14-
TextDelta,
1514
)
15+
from agentex.types.task_message_delta import TextDelta
1616
from agentex.lib.utils.logging import make_logger
1717
from agentex.lib.utils.model_utils import BaseModel
1818
from agentex.types.text_content import TextContent

src/agentex/lib/cli/templates/sync/project/acp.py.j2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ from typing import AsyncGenerator, Union
22
from agentex.lib.sdk.fastacp.fastacp import FastACP
33
from agentex.lib.types.acp import SendMessageParams
44

5-
from agentex.lib.types.task_message_updates import TaskMessageUpdate
5+
from agentex.types.task_message_update import TaskMessageUpdate
66
from agentex.types.task_message_content import TaskMessageContent
77
from agentex.types.text_content import TextContent
88
from agentex.lib.utils.logging import make_logger

src/agentex/lib/core/services/adk/messages.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from agentex import AsyncAgentex
55
from agentex.lib.core.services.adk.streaming import StreamingService
66
from agentex.lib.core.tracing.tracer import AsyncTracer
7-
from agentex.lib.types.task_message_updates import StreamTaskMessageFull, TaskMessageUpdate
7+
from agentex.types.task_message_update import StreamTaskMessageFull, TaskMessageUpdate
88
from agentex.types.task_message import TaskMessage, TaskMessageContent
99
from agentex.lib.utils.logging import make_logger
1010
from agentex.lib.utils.temporal import heartbeat_if_in_workflow

src/agentex/lib/core/services/adk/providers/litellm.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88
Completion,
99
LLMConfig,
1010
)
11-
from agentex.lib.types.task_message_updates import (
11+
from agentex.types.task_message_update import (
1212
StreamTaskMessageDelta,
1313
StreamTaskMessageFull,
14-
TextDelta,
1514
)
15+
from agentex.types.task_message_delta import TextDelta
1616
from agentex.types.task_message import TaskMessage
1717
from agentex.types.task_message_content import TextContent
1818
from agentex.lib.utils import logging

src/agentex/lib/core/services/adk/providers/openai.py

Lines changed: 104 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
ResponseFunctionToolCall,
1313
ResponseOutputItemDoneEvent,
1414
ResponseTextDeltaEvent,
15+
ResponseReasoningSummaryTextDeltaEvent,
16+
ResponseReasoningSummaryTextDoneEvent,
17+
ResponseReasoningTextDeltaEvent,
18+
ResponseReasoningTextDoneEvent,
1519
)
1620
from pydantic import BaseModel
1721

@@ -22,14 +26,18 @@
2226
StreamingTaskMessageContext,
2327
)
2428
from agentex.lib.core.tracing.tracer import AsyncTracer
25-
from agentex.lib.types.task_message_updates import (
29+
from agentex.types.task_message_update import (
2630
StreamTaskMessageDelta,
2731
StreamTaskMessageFull,
32+
)
33+
from agentex.types.task_message_delta import (
2834
TextDelta,
35+
ReasoningSummaryDelta,
36+
ReasoningContentDelta,
2937
)
3038
from agentex.types.task_message_content import (
31-
TextContent,
3239
ReasoningContent,
40+
TextContent,
3341
ToolRequestContent,
3442
ToolResponseContent,
3543
)
@@ -649,30 +657,7 @@ async def run_agent_streamed_auto_send(
649657
),
650658
)
651659

652-
elif event.item.type == "reasoning_item":
653-
# Handle reasoning items
654-
reasoning_item = event.item.raw_item
655-
656-
reasoning_content = ReasoningContent(
657-
author="agent",
658-
summary=[summary.text for summary in reasoning_item.summary],
659-
content=[content.text for content in reasoning_item.content] if reasoning_item.content else None,
660-
)
661660

662-
# Create reasoning content using streaming context (immediate completion)
663-
async with (
664-
self.streaming_service.streaming_task_message_context(
665-
task_id=task_id,
666-
initial_content=reasoning_content,
667-
) as streaming_context
668-
):
669-
# The message has already been persisted, but we still need to send an update
670-
await streaming_context.stream_update(
671-
update=StreamTaskMessageFull(
672-
parent_task_message=streaming_context.task_message,
673-
content=reasoning_content,
674-
),
675-
)
676661

677662
elif event.type == "raw_response_event":
678663
if isinstance(event.data, ResponseTextDeltaEvent):
@@ -707,6 +692,100 @@ async def run_agent_streamed_auto_send(
707692
),
708693
)
709694

695+
elif isinstance(event.data, ResponseReasoningSummaryTextDeltaEvent):
696+
# Handle reasoning summary text delta
697+
item_id = event.data.item_id
698+
summary_index = event.data.summary_index
699+
700+
# Check if we already have a streaming context for this reasoning item
701+
if item_id not in item_id_to_streaming_context:
702+
# Create a new streaming context for this reasoning item
703+
streaming_context = self.streaming_service.streaming_task_message_context(
704+
task_id=task_id,
705+
initial_content=ReasoningContent(
706+
author="agent",
707+
summary=[],
708+
content=[],
709+
),
710+
)
711+
# Open the streaming context
712+
item_id_to_streaming_context[
713+
item_id
714+
] = await streaming_context.open()
715+
unclosed_item_ids.add(item_id)
716+
else:
717+
streaming_context = item_id_to_streaming_context[
718+
item_id
719+
]
720+
721+
# Stream the summary delta through the streaming service
722+
await streaming_context.stream_update(
723+
update=StreamTaskMessageDelta(
724+
parent_task_message=streaming_context.task_message,
725+
delta=ReasoningSummaryDelta(
726+
summary_index=summary_index,
727+
summary_delta=event.data.delta,
728+
),
729+
),
730+
)
731+
732+
elif isinstance(event.data, ResponseReasoningTextDeltaEvent):
733+
# Handle reasoning content text delta
734+
item_id = event.data.item_id
735+
content_index = event.data.content_index
736+
737+
# Check if we already have a streaming context for this reasoning item
738+
if item_id not in item_id_to_streaming_context:
739+
# Create a new streaming context for this reasoning item
740+
streaming_context = self.streaming_service.streaming_task_message_context(
741+
task_id=task_id,
742+
initial_content=ReasoningContent(
743+
author="agent",
744+
summary=[],
745+
content=[],
746+
),
747+
)
748+
# Open the streaming context
749+
item_id_to_streaming_context[
750+
item_id
751+
] = await streaming_context.open()
752+
unclosed_item_ids.add(item_id)
753+
else:
754+
streaming_context = item_id_to_streaming_context[
755+
item_id
756+
]
757+
758+
# Stream the content delta through the streaming service
759+
await streaming_context.stream_update(
760+
update=StreamTaskMessageDelta(
761+
parent_task_message=streaming_context.task_message,
762+
delta=ReasoningContentDelta(
763+
content_index=content_index,
764+
content_delta=event.data.delta,
765+
),
766+
),
767+
)
768+
769+
770+
771+
772+
773+
elif isinstance(event.data, ResponseReasoningSummaryTextDoneEvent):
774+
# Handle reasoning summary text completion
775+
item_id = event.data.item_id
776+
summary_index = event.data.summary_index
777+
778+
# Note: We don't close the streaming context here since there might be more deltas
779+
# The context will be closed when the reasoning item is completely done
780+
781+
elif isinstance(event.data, ResponseReasoningTextDoneEvent):
782+
# Handle reasoning content text completion
783+
item_id = event.data.item_id
784+
content_index = event.data.content_index
785+
786+
# Note: We don't close the streaming context here since there might be more deltas
787+
# The context will be closed when the reasoning item is completely done
788+
710789
elif isinstance(event.data, ResponseOutputItemDoneEvent):
711790
# Handle item completion
712791
item_id = event.data.item.id

src/agentex/lib/core/services/adk/streaming.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,20 @@
33

44
from agentex import AsyncAgentex
55
from agentex.lib.core.adapters.streams.port import StreamRepository
6-
from agentex.lib.types.task_message_updates import (
6+
from agentex.types.task_message_update import (
77
TaskMessageDelta,
88
TaskMessageUpdate,
9-
TextDelta,
10-
DataDelta,
11-
ToolRequestDelta,
12-
ToolResponseDelta,
13-
StreamTaskMessage,
149
StreamTaskMessageStart,
1510
StreamTaskMessageDelta,
1611
StreamTaskMessageFull,
1712
StreamTaskMessageDone,
1813
)
14+
from agentex.types.task_message_delta import (
15+
TextDelta,
16+
DataDelta,
17+
ToolRequestDelta,
18+
ToolResponseDelta,
19+
)
1920
from agentex.lib.utils.logging import make_logger
2021
from agentex.types.data_content import DataContent
2122
from agentex.types.task_message import (
@@ -187,8 +188,8 @@ async def close(self) -> TaskMessage:
187188
return self.task_message
188189

189190
async def stream_update(
190-
self, update: StreamTaskMessage
191-
) -> StreamTaskMessage | None:
191+
self, update: TaskMessageUpdate
192+
) -> TaskMessageUpdate | None:
192193
"""Stream an update to the repository."""
193194
if self._is_closed:
194195
raise ValueError("Context is already done")

src/agentex/lib/core/temporal/activities/adk/streaming_activities.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from temporalio import activity
44

55
from agentex.lib.core.services.adk.streaming import StreamingService
6-
from agentex.lib.types.task_message_updates import TaskMessageUpdate
6+
from agentex.types.task_message_update import TaskMessageUpdate
77
from agentex.lib.utils.logging import make_logger
88
from agentex.lib.utils.model_utils import BaseModel
99
from agentex.lib.utils.temporal import heartbeat_if_in_workflow

0 commit comments

Comments
 (0)