From 1c2499b03ae256a524a595cfefbac439f2babc25 Mon Sep 17 00:00:00 2001 From: Michael Hansen Date: Thu, 4 Apr 2024 14:45:27 -0500 Subject: [PATCH] Add "conversation" key to translations (#114887) * Use translated trigger response * Use conversation key instead --- .../components/conversation/default_agent.py | 28 +++++++++++++---- .../components/conversation/strings.json | 5 ++++ script/hassfest/translations.py | 5 ++++ tests/components/conversation/test_trigger.py | 30 +++++++++++++++++++ 4 files changed, 63 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/conversation/default_agent.py b/homeassistant/components/conversation/default_agent.py index 32ab7924916..8202814d347 100644 --- a/homeassistant/components/conversation/default_agent.py +++ b/homeassistant/components/conversation/default_agent.py @@ -269,20 +269,38 @@ class DefaultAgent(ConversationEntity): for trigger_id, trigger_result in result.matched_triggers.items() ] - # Use last non-empty result as response. + # Use first non-empty result as response. # # There may be multiple copies of a trigger running when editing in # the UI, so it's critical that we filter out empty responses here. response_text: str | None = None + response_set_by_trigger = False for trigger_future in asyncio.as_completed(trigger_callbacks): - if trigger_response := await trigger_future: - response_text = trigger_response - break + trigger_response = await trigger_future + if trigger_response is None: + continue + + response_text = trigger_response + response_set_by_trigger = True + break # Convert to conversation result response = intent.IntentResponse(language=language) response.response_type = intent.IntentResponseType.ACTION_DONE - response.async_set_speech(response_text or "Done") + + if response_set_by_trigger: + # Response was explicitly set to empty + response_text = response_text or "" + elif not response_text: + # Use translated acknowledgment for pipeline language + translations = await translation.async_get_translations( + self.hass, language, DOMAIN, [DOMAIN] + ) + response_text = translations.get( + f"component.{DOMAIN}.agent.done", "Done" + ) + + response.async_set_speech(response_text) return ConversationResult(response=response) diff --git a/homeassistant/components/conversation/strings.json b/homeassistant/components/conversation/strings.json index 3150623ba65..e3c3aa5af20 100644 --- a/homeassistant/components/conversation/strings.json +++ b/homeassistant/components/conversation/strings.json @@ -37,5 +37,10 @@ } } } + }, + "conversation": { + "agent": { + "done": "Done" + } } } diff --git a/script/hassfest/translations.py b/script/hassfest/translations.py index 724f65eafb6..6c20246b396 100644 --- a/script/hassfest/translations.py +++ b/script/hassfest/translations.py @@ -360,6 +360,11 @@ def gen_strings_schema(config: Config, integration: Integration) -> vol.Schema: }, slug_validator=translation_key_validator, ), + vol.Optional("conversation"): { + vol.Required("agent"): { + vol.Required("done"): translation_value_validator, + }, + }, } ) diff --git a/tests/components/conversation/test_trigger.py b/tests/components/conversation/test_trigger.py index 9e78b9b6180..83f4e97c853 100644 --- a/tests/components/conversation/test_trigger.py +++ b/tests/components/conversation/test_trigger.py @@ -104,6 +104,36 @@ async def test_response(hass: HomeAssistant, setup_comp) -> None: assert service_response["response"]["speech"]["plain"]["speech"] == response +async def test_empty_response(hass: HomeAssistant, setup_comp) -> None: + """Test the conversation response action with an empty response.""" + assert await async_setup_component( + hass, + "automation", + { + "automation": { + "trigger": { + "platform": "conversation", + "command": ["Open the pod bay door Hal"], + }, + "action": { + "set_conversation_response": "", + }, + } + }, + ) + + service_response = await hass.services.async_call( + "conversation", + "process", + { + "text": "Open the pod bay door Hal", + }, + blocking=True, + return_response=True, + ) + assert service_response["response"]["speech"]["plain"]["speech"] == "" + + async def test_response_same_sentence(hass: HomeAssistant, calls, setup_comp) -> None: """Test the conversation response action with multiple triggers using the same sentence.""" assert await async_setup_component(