Skip to content

Commit 6397b4f

Browse files
sorted import block
1 parent bee0223 commit 6397b4f

6 files changed

Lines changed: 76 additions & 123 deletions

File tree

examples/tutorials/10_async/10_temporal/110_pydantic_ai/project/agent.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717

1818
from __future__ import annotations
1919

20-
from collections.abc import AsyncIterable
2120
from datetime import datetime
21+
from collections.abc import AsyncIterable
2222

2323
from pydantic import BaseModel
2424
from pydantic_ai import Agent, RunContext
25-
from pydantic_ai.durable_exec.temporal import TemporalAgent
2625
from pydantic_ai.messages import AgentStreamEvent
26+
from pydantic_ai.durable_exec.temporal import TemporalAgent
2727

2828
from project.tools import get_weather
2929
from agentex.lib.adk import stream_pydantic_ai_events
@@ -61,9 +61,7 @@ def _build_base_agent() -> Agent[TaskDeps, str]:
6161
agent: Agent[TaskDeps, str] = Agent(
6262
MODEL_NAME,
6363
deps_type=TaskDeps,
64-
system_prompt=SYSTEM_PROMPT.format(
65-
timestamp=datetime.now().strftime("%Y-%m-%d %H:%M:%S")
66-
),
64+
system_prompt=SYSTEM_PROMPT.format(timestamp=datetime.now().strftime("%Y-%m-%d %H:%M:%S")),
6765
)
6866
agent.tool_plain(get_weather)
6967
return agent

examples/tutorials/10_async/10_temporal/110_pydantic_ai/project/workflow.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,13 @@
99

1010
from __future__ import annotations
1111

12-
import json
1312
import os
13+
import json
1414

1515
from temporalio import workflow
1616

1717
from agentex.lib import adk
18+
from project.agent import TaskDeps, temporal_agent
1819
from agentex.lib.types.acp import SendEventParams, CreateTaskParams
1920
from agentex.lib.types.tracing import SGPTracingProcessorConfig
2021
from agentex.lib.utils.logging import make_logger
@@ -26,8 +27,6 @@
2627
add_tracing_processor_config,
2728
)
2829

29-
from project.agent import TaskDeps, temporal_agent
30-
3130
add_tracing_processor_config(
3231
SGPTracingProcessorConfig(
3332
sgp_api_key=os.environ.get("SGP_API_KEY", ""),

src/agentex/lib/adk/_modules/_pydantic_ai_async.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,15 @@ async def stream_pydantic_ai_events(stream, task_id: str) -> str:
3131
import json
3232

3333
from pydantic_ai.messages import (
34-
FunctionToolResultEvent,
35-
PartDeltaEvent,
36-
PartEndEvent,
37-
PartStartEvent,
3834
TextPart,
39-
TextPartDelta,
35+
PartEndEvent,
4036
ThinkingPart,
41-
ThinkingPartDelta,
4237
ToolCallPart,
38+
TextPartDelta,
39+
PartDeltaEvent,
40+
PartStartEvent,
41+
ThinkingPartDelta,
42+
FunctionToolResultEvent,
4343
)
4444

4545
from agentex.lib import adk

src/agentex/lib/adk/_modules/_pydantic_ai_sync.py

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,36 +23,36 @@ async def handle_message_send(params):
2323
import json
2424
from typing import Any, AsyncIterator
2525

26+
from pydantic_ai.run import AgentRunResultEvent
2627
from pydantic_ai.messages import (
27-
FinalResultEvent,
28-
FunctionToolCallEvent,
29-
FunctionToolResultEvent,
30-
PartDeltaEvent,
31-
PartEndEvent,
32-
PartStartEvent,
3328
TextPart,
34-
TextPartDelta,
29+
PartEndEvent,
3530
ThinkingPart,
36-
ThinkingPartDelta,
3731
ToolCallPart,
38-
ToolCallPartDelta,
32+
TextPartDelta,
33+
PartDeltaEvent,
34+
PartStartEvent,
3935
ToolReturnPart,
36+
FinalResultEvent,
37+
ThinkingPartDelta,
38+
ToolCallPartDelta,
39+
FunctionToolCallEvent,
40+
FunctionToolResultEvent,
4041
)
41-
from pydantic_ai.run import AgentRunResultEvent
4242

4343
from agentex.lib.utils.logging import make_logger
44-
from agentex.types.reasoning_content_delta import ReasoningContentDelta
45-
from agentex.types.task_message_content import TextContent
4644
from agentex.types.task_message_delta import TextDelta
45+
from agentex.types.tool_request_delta import ToolRequestDelta
4746
from agentex.types.task_message_update import (
48-
StreamTaskMessageDelta,
4947
StreamTaskMessageDone,
5048
StreamTaskMessageFull,
49+
StreamTaskMessageDelta,
5150
StreamTaskMessageStart,
5251
)
52+
from agentex.types.task_message_content import TextContent
5353
from agentex.types.tool_request_content import ToolRequestContent
54-
from agentex.types.tool_request_delta import ToolRequestDelta
5554
from agentex.types.tool_response_content import ToolResponseContent
55+
from agentex.types.reasoning_content_delta import ReasoningContentDelta
5656

5757
logger = make_logger(__name__)
5858

@@ -98,9 +98,7 @@ def _tool_return_content(result: ToolReturnPart | Any) -> Any:
9898

9999
async def convert_pydantic_ai_to_agentex_events(
100100
stream_response: AsyncIterator[Any],
101-
) -> AsyncIterator[
102-
StreamTaskMessageStart | StreamTaskMessageDelta | StreamTaskMessageFull | StreamTaskMessageDone
103-
]:
101+
) -> AsyncIterator[StreamTaskMessageStart | StreamTaskMessageDelta | StreamTaskMessageFull | StreamTaskMessageDone]:
104102
"""Convert a Pydantic AI agent event stream into Agentex stream events.
105103
106104
Mapping:

tests/lib/adk/test_pydantic_ai_async.py

Lines changed: 22 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -10,34 +10,33 @@
1010

1111
from __future__ import annotations
1212

13-
from dataclasses import dataclass, field
1413
from typing import Any, AsyncIterator
14+
from dataclasses import field, dataclass
1515

1616
import pytest
1717
from pydantic_ai.messages import (
18-
FunctionToolResultEvent,
19-
PartDeltaEvent,
20-
PartEndEvent,
21-
PartStartEvent,
22-
RetryPromptPart,
2318
TextPart,
24-
TextPartDelta,
19+
PartEndEvent,
2520
ThinkingPart,
26-
ThinkingPartDelta,
2721
ToolCallPart,
22+
TextPartDelta,
23+
PartDeltaEvent,
24+
PartStartEvent,
2825
ToolReturnPart,
26+
RetryPromptPart,
27+
ThinkingPartDelta,
28+
FunctionToolResultEvent,
2929
)
3030

31-
from agentex.lib.adk._modules._pydantic_ai_async import stream_pydantic_ai_events
32-
from agentex.types.reasoning_content import ReasoningContent
33-
from agentex.types.reasoning_content_delta import ReasoningContentDelta
3431
from agentex.types.task_message import TaskMessage
32+
from agentex.types.text_content import TextContent
33+
from agentex.types.reasoning_content import ReasoningContent
3534
from agentex.types.task_message_delta import TextDelta
3635
from agentex.types.task_message_update import StreamTaskMessageDelta
37-
from agentex.types.text_content import TextContent
3836
from agentex.types.tool_request_content import ToolRequestContent
3937
from agentex.types.tool_response_content import ToolResponseContent
40-
38+
from agentex.types.reasoning_content_delta import ReasoningContentDelta
39+
from agentex.lib.adk._modules._pydantic_ai_async import stream_pydantic_ai_events
4140

4241
TASK_ID = "task_test"
4342

@@ -70,9 +69,7 @@ async def __aexit__(self, exc_type, exc_val, exc_tb) -> bool:
7069

7170
async def stream_update(self, update: StreamTaskMessageDelta) -> None:
7271
if self.closed:
73-
raise AssertionError(
74-
"stream_update called after close — helper closed the wrong context"
75-
)
72+
raise AssertionError("stream_update called after close — helper closed the wrong context")
7673
self.updates.append(update)
7774

7875
async def close(self) -> None:
@@ -85,9 +82,7 @@ class FakeStreamingModule:
8582
def __init__(self) -> None:
8683
self.contexts: list[FakeContext] = []
8784

88-
def streaming_task_message_context(
89-
self, *, task_id: str, initial_content: Any
90-
) -> FakeContext:
85+
def streaming_task_message_context(self, *, task_id: str, initial_content: Any) -> FakeContext:
9186
tm = TaskMessage(
9287
id=f"m{len(self.contexts) + 1}",
9388
task_id=task_id,
@@ -255,9 +250,7 @@ async def test_empty_thinking_delta_is_skipped(
255250
await stream_pydantic_ai_events(_aiter(events), TASK_ID)
256251

257252
ctx = streaming.contexts[0]
258-
assert _reasoning_deltas(ctx) == [], (
259-
"Empty ThinkingPartDelta must not publish a zero-length reasoning delta"
260-
)
253+
assert _reasoning_deltas(ctx) == [], "Empty ThinkingPartDelta must not publish a zero-length reasoning delta"
261254
assert ctx.closed is True
262255

263256

@@ -274,9 +267,7 @@ async def test_tool_call_emits_full_tool_request_message_on_part_end(
274267
),
275268
PartEndEvent(
276269
index=1,
277-
part=ToolCallPart(
278-
tool_name="get_weather", args='{"city":"Paris"}', tool_call_id="c1"
279-
),
270+
part=ToolCallPart(tool_name="get_weather", args='{"city":"Paris"}', tool_call_id="c1"),
280271
),
281272
]
282273
await stream_pydantic_ai_events(_aiter(events), TASK_ID)
@@ -299,15 +290,11 @@ async def test_tool_call_with_dict_args_passes_through(
299290
events = [
300291
PartStartEvent(
301292
index=0,
302-
part=ToolCallPart(
303-
tool_name="search", args={"q": "weather"}, tool_call_id="c"
304-
),
293+
part=ToolCallPart(tool_name="search", args={"q": "weather"}, tool_call_id="c"),
305294
),
306295
PartEndEvent(
307296
index=0,
308-
part=ToolCallPart(
309-
tool_name="search", args={"q": "weather"}, tool_call_id="c"
310-
),
297+
part=ToolCallPart(tool_name="search", args={"q": "weather"}, tool_call_id="c"),
311298
),
312299
]
313300
await stream_pydantic_ai_events(_aiter(events), TASK_ID)
@@ -366,9 +353,7 @@ async def test_tool_return_emits_full_tool_response_message(
366353
_, messages = fake_adk
367354
events = [
368355
FunctionToolResultEvent(
369-
part=ToolReturnPart(
370-
tool_name="get_weather", content="Sunny, 72F", tool_call_id="c1"
371-
),
356+
part=ToolReturnPart(tool_name="get_weather", content="Sunny, 72F", tool_call_id="c1"),
372357
),
373358
]
374359
await stream_pydantic_ai_events(_aiter(events), TASK_ID)
@@ -387,9 +372,7 @@ async def test_tool_return_with_non_string_content_stringifies(
387372
_, messages = fake_adk
388373
events = [
389374
FunctionToolResultEvent(
390-
part=ToolReturnPart(
391-
tool_name="t", content={"temp": 72, "sky": "clear"}, tool_call_id="c"
392-
),
375+
part=ToolReturnPart(tool_name="t", content={"temp": 72, "sky": "clear"}, tool_call_id="c"),
393376
),
394377
]
395378
await stream_pydantic_ai_events(_aiter(events), TASK_ID)
@@ -447,9 +430,7 @@ async def test_text_then_tool_then_text_uses_separate_contexts_in_order(
447430
part=ToolCallPart(tool_name="get_weather", args="{}", tool_call_id="c1"),
448431
),
449432
FunctionToolResultEvent(
450-
part=ToolReturnPart(
451-
tool_name="get_weather", content="Sunny", tool_call_id="c1"
452-
),
433+
part=ToolReturnPart(tool_name="get_weather", content="Sunny", tool_call_id="c1"),
453434
),
454435
# Second model response: more text.
455436
PartStartEvent(index=0, part=TextPart(content="")),
@@ -458,9 +439,7 @@ async def test_text_then_tool_then_text_uses_separate_contexts_in_order(
458439
]
459440
final = await stream_pydantic_ai_events(_aiter(events), TASK_ID)
460441

461-
assert len(streaming.contexts) == 2, (
462-
"One context per text part — tool calls don't open streaming contexts"
463-
)
442+
assert len(streaming.contexts) == 2, "One context per text part — tool calls don't open streaming contexts"
464443
assert all(ctx.closed for ctx in streaming.contexts)
465444
assert _text_deltas(streaming.contexts[0]) == ["Looking up..."]
466445
assert _text_deltas(streaming.contexts[1]) == ["It's sunny."]

0 commit comments

Comments
 (0)