Skip to content

Commit b9a4539

Browse files
committed
feat(live): support Live API translation config in RunConfig
1 parent 7e8965d commit b9a4539

3 files changed

Lines changed: 48 additions & 0 deletions

File tree

src/google/adk/agents/run_config.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,9 @@ class RunConfig(BaseModel):
239239
realtime_input_config: Optional[types.RealtimeInputConfig] = None
240240
"""Realtime input config for live agents with audio input from user."""
241241

242+
translation_config: Optional[types.StreamTranslationConfig] = None
243+
"""Configures real-time speech-to-speech translation for live agents."""
244+
242245
enable_affective_dialog: Optional[bool] = None
243246
"""If enabled, the model will detect emotions and adapt its responses accordingly."""
244247

src/google/adk/flows/llm_flows/basic.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ def _build_basic_request(
8383
llm_request.live_connect_config.realtime_input_config = (
8484
invocation_context.run_config.realtime_input_config
8585
)
86+
llm_request.live_connect_config.stream_translation_config = (
87+
invocation_context.run_config.translation_config
88+
)
8689
active_model_name = (
8790
getattr(getattr(agent, 'canonical_live_model', None), 'model', None)
8891
or llm_request.model

tests/unittests/flows/llm_flows/test_basic_processor.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,3 +254,45 @@ async def test_keeps_affective_dialog_and_proactivity_for_non_gemini_3_1(
254254

255255
assert llm_request.live_connect_config.enable_affective_dialog is True
256256
assert llm_request.live_connect_config.proactivity is not None
257+
258+
@pytest.mark.asyncio
259+
async def test_sets_translation_config(self):
260+
"""Translation config is forwarded to the live connect config."""
261+
agent = LlmAgent(
262+
name='test_agent',
263+
model='gemini-3.5-live-translate-preview',
264+
)
265+
invocation_context = await _create_invocation_context(agent)
266+
invocation_context.run_config = RunConfig(
267+
translation_config=types.StreamTranslationConfig(
268+
target_language_code='pl',
269+
echo_target_language=True,
270+
),
271+
)
272+
llm_request = LlmRequest()
273+
processor = _BasicLlmRequestProcessor()
274+
275+
async for _ in processor.run_async(invocation_context, llm_request):
276+
pass
277+
278+
stream_translation_config = (
279+
llm_request.live_connect_config.stream_translation_config
280+
)
281+
assert stream_translation_config.target_language_code == 'pl'
282+
assert stream_translation_config.echo_target_language is True
283+
284+
@pytest.mark.asyncio
285+
async def test_translation_config_defaults_to_none(self):
286+
"""Without a translation config the live connect field stays None."""
287+
agent = LlmAgent(
288+
name='test_agent',
289+
model='gemini-2.5-flash-live',
290+
)
291+
invocation_context = await _create_invocation_context(agent)
292+
llm_request = LlmRequest()
293+
processor = _BasicLlmRequestProcessor()
294+
295+
async for _ in processor.run_async(invocation_context, llm_request):
296+
pass
297+
298+
assert llm_request.live_connect_config.stream_translation_config is None

0 commit comments

Comments
 (0)