Skip to content

Commit ab4c4b7

Browse files
committed
feat: introduce stream_widget helper function in ADKAgentContext
1 parent 11b29bd commit ab4c4b7

File tree

3 files changed

+22
-32
lines changed

3 files changed

+22
-32
lines changed

adk-chatkit/src/adk_chatkit/_context.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import asyncio
2+
from datetime import datetime
23

3-
from chatkit.types import ThreadMetadata, ThreadStreamEvent
4-
from google.adk.runners import RunConfig
4+
from chatkit.types import ThreadItemDoneEvent, ThreadMetadata, ThreadStreamEvent, WidgetItem
5+
from chatkit.widgets import WidgetRoot
6+
from google.adk.agents.run_config import RunConfig
7+
from google.adk.tools import ToolContext
58
from pydantic import BaseModel
69

710
from ._event_utils import QueueCompleteSentinel
@@ -20,6 +23,20 @@ class ADKAgentContext(ADKContext):
2023
async def stream(self, event: ThreadStreamEvent) -> None:
2124
await self._events.put(event)
2225

26+
async def stream_widget(self, widget: WidgetRoot, tool_context: ToolContext) -> None:
27+
if tool_context.function_call_id is None:
28+
raise ValueError("tool_context.function_call_id is None")
29+
await self.stream(
30+
ThreadItemDoneEvent(
31+
item=WidgetItem(
32+
id=tool_context.function_call_id,
33+
thread_id=self.thread.id,
34+
created_at=datetime.now(),
35+
widget=widget,
36+
)
37+
)
38+
)
39+
2340
def _complete(self) -> None:
2441
self._events.put_nowait(QueueCompleteSentinel())
2542

examples/backend/src/backend/agents/facts/_tools.py

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
from datetime import datetime
21
from typing import Any, Final, Literal, cast
32

43
from adk_chatkit import ChatkitRunConfig, ClientToolCallState, add_client_tool_call_to_tool_response
5-
from chatkit.types import ProgressUpdateEvent, ThreadItemDoneEvent, ThreadStreamEvent, WidgetItem
64
from google.adk.tools import ToolContext
75

86
from ._sample_widget import render_weather_widget
@@ -129,24 +127,10 @@ async def get_weather(
129127
if observed:
130128
result["observation_time"] = observed
131129

132-
# add_widget_to_tool_response(
133-
# result,
134-
# widget,
135-
# )
136-
137130
chatkit_run_config = cast(ChatkitRunConfig, tool_context._invocation_context.run_config)
138131

139132
try:
140-
await chatkit_run_config.context.stream(
141-
ThreadItemDoneEvent(
142-
item=WidgetItem(
143-
id=tool_context.function_call_id,
144-
thread_id=chatkit_run_config.context.thread.id,
145-
created_at=datetime.now(),
146-
widget=widget,
147-
)
148-
)
149-
)
133+
await chatkit_run_config.context.stream_widget(widget, tool_context)
150134
except Exception as exc: # noqa: BLE001
151135
print("[WeatherTool] widget stream failed", {"error": str(exc)})
152136
raise ValueError("Weather data is currently unavailable for that location.") from exc
Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import asyncio
2-
from datetime import datetime
32
from typing import cast
43

54
from adk_chatkit import ChatkitRunConfig
6-
from chatkit.types import ProgressUpdateEvent, ThreadItemDoneEvent, WidgetItem
5+
from chatkit.types import ProgressUpdateEvent
76
from google.adk.tools import ToolContext
87

98
from ._tasks_widget import make_widget
@@ -22,19 +21,9 @@ async def render_tasks_widget(tool_context: ToolContext) -> dict[str, str]:
2221

2322
await chatkit_run_config.context.stream(ProgressUpdateEvent(text="Fetching tasks widget..."))
2423
await asyncio.sleep(2)
25-
await chatkit_run_config.context.stream(ProgressUpdateEvent(text=""))
2624

2725
widget = make_widget()
2826

29-
await chatkit_run_config.context.stream(
30-
ThreadItemDoneEvent(
31-
item=WidgetItem(
32-
id=tool_context.function_call_id,
33-
thread_id=chatkit_run_config.context.thread.id,
34-
created_at=datetime.now(),
35-
widget=widget,
36-
)
37-
)
38-
)
27+
await chatkit_run_config.context.stream_widget(widget, tool_context)
3928

4029
return result

0 commit comments

Comments
 (0)