Skip to content

Commit 36ab8f1

Browse files
wuliang229copybara-github
authored andcommitted
feat(live): Add save_live_blob query parameter to /run_live endpoint
This change introduces a new query parameter `save_live_blob` to the `/run_live` WebSocket endpoint in the ADK web server. When set to true, this parameter enables saving of live blobs during the session. The default value is false. Unit tests are updated to cover this new parameter. Closes issue #4707 Co-authored-by: Liang Wu <wuliang@google.com> PiperOrigin-RevId: 901280577
1 parent 34fbedf commit 36ab8f1

2 files changed

Lines changed: 16 additions & 8 deletions

File tree

src/google/adk/cli/adk_web_server.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2075,6 +2075,7 @@ async def run_agent_live(
20752075
proactive_audio: bool | None = Query(default=None),
20762076
enable_affective_dialog: bool | None = Query(default=None),
20772077
enable_session_resumption: bool | None = Query(default=None),
2078+
save_live_blob: bool = Query(default=False),
20782079
) -> None:
20792080
ws_origin = websocket.headers.get("origin")
20802081
if ws_origin is not None and not _is_request_origin_allowed(
@@ -2117,6 +2118,7 @@ async def forward_events():
21172118
if enable_session_resumption is not None
21182119
else None
21192120
),
2121+
save_live_blob=save_live_blob,
21202122
)
21212123
async with Aclosing(
21222124
runner.run_live(

tests/unittests/cli/test_adk_web_server_run_live.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ async def _get_runner_async(_self, _app_name: str):
105105
"&proactive_audio=true"
106106
"&enable_affective_dialog=true"
107107
"&enable_session_resumption=true"
108+
"&save_live_blob=true"
108109
)
109110

110111
with client.websocket_connect(url) as ws:
@@ -118,28 +119,32 @@ async def _get_runner_async(_self, _app_name: str):
118119
assert run_config.proactivity.proactive_audio is True
119120
assert run_config.session_resumption is not None
120121
assert run_config.session_resumption.transparent is True
122+
assert run_config.save_live_blob is True
121123

122124

123125
@pytest.mark.parametrize(
124126
(
125127
"query,expected_enable_affective,expected_proactive_audio,"
126-
"expected_session_resumption_transparent"
128+
"expected_session_resumption_transparent,expected_save_live_blob"
127129
),
128130
[
129-
("", None, None, None),
130-
("&proactive_audio=true", None, True, None),
131-
("&proactive_audio=false", None, False, None),
132-
("&enable_affective_dialog=true", True, None, None),
133-
("&enable_affective_dialog=false", False, None, None),
134-
("&enable_session_resumption=true", None, None, True),
135-
("&enable_session_resumption=false", None, None, False),
131+
("", None, None, None, False),
132+
("&proactive_audio=true", None, True, None, False),
133+
("&proactive_audio=false", None, False, None, False),
134+
("&enable_affective_dialog=true", True, None, None, False),
135+
("&enable_affective_dialog=false", False, None, None, False),
136+
("&enable_session_resumption=true", None, None, True, False),
137+
("&enable_session_resumption=false", None, None, False, False),
138+
("&save_live_blob=true", None, None, None, True),
139+
("&save_live_blob=false", None, None, None, False),
136140
],
137141
)
138142
def test_run_live_defaults_and_individual_options(
139143
query: str,
140144
expected_enable_affective: bool | None,
141145
expected_proactive_audio: bool | None,
142146
expected_session_resumption_transparent: bool | None,
147+
expected_save_live_blob: bool,
143148
):
144149
session_service = InMemorySessionService()
145150
asyncio.run(
@@ -204,6 +209,7 @@ async def _get_runner_async(_self, _app_name: str):
204209
run_config.session_resumption.transparent
205210
is expected_session_resumption_transparent
206211
)
212+
assert run_config.save_live_blob is expected_save_live_blob
207213

208214

209215
_WS_BASE_URL = (

0 commit comments

Comments
 (0)