From 7ecee8268df88eae6cd2e881afb67f7632388272 Mon Sep 17 00:00:00 2001 From: Denis Shulyaka Date: Tue, 19 Dec 2023 23:22:18 +0300 Subject: [PATCH 1/3] Add conversation_id parameter to conversation.process service --- homeassistant/components/conversation/__init__.py | 4 +++- homeassistant/components/conversation/services.yaml | 4 ++++ homeassistant/components/conversation/strings.json | 4 ++++ tests/components/conversation/test_init.py | 8 ++++++-- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/conversation/__init__.py b/homeassistant/components/conversation/__init__.py index 29dd56c11ec054..193bd45bba03a6 100644 --- a/homeassistant/components/conversation/__init__.py +++ b/homeassistant/components/conversation/__init__.py @@ -42,6 +42,7 @@ ATTR_TEXT = "text" ATTR_LANGUAGE = "language" ATTR_AGENT_ID = "agent_id" +ATTR_CONVERSATION_ID = "conversation_id" DOMAIN = "conversation" @@ -66,6 +67,7 @@ def agent_id_validator(value: Any) -> str: vol.Required(ATTR_TEXT): cv.string, vol.Optional(ATTR_LANGUAGE): cv.string, vol.Optional(ATTR_AGENT_ID): agent_id_validator, + vol.Optional(ATTR_CONVERSATION_ID): cv.string, } ) @@ -164,7 +166,7 @@ async def handle_process(service: core.ServiceCall) -> core.ServiceResponse: result = await async_converse( hass=hass, text=text, - conversation_id=None, + conversation_id=service.data.get(ATTR_CONVERSATION_ID), context=service.context, language=service.data.get(ATTR_LANGUAGE), agent_id=service.data.get(ATTR_AGENT_ID), diff --git a/homeassistant/components/conversation/services.yaml b/homeassistant/components/conversation/services.yaml index 953db065614416..3846426c3f07db 100644 --- a/homeassistant/components/conversation/services.yaml +++ b/homeassistant/components/conversation/services.yaml @@ -14,6 +14,10 @@ process: example: homeassistant selector: conversation_agent: + conversation_id: + example: my_conversation_1 + selector: + text: reload: fields: diff --git a/homeassistant/components/conversation/strings.json b/homeassistant/components/conversation/strings.json index 8240cfa3f82cdc..255e6cec430486 100644 --- a/homeassistant/components/conversation/strings.json +++ b/homeassistant/components/conversation/strings.json @@ -16,6 +16,10 @@ "agent_id": { "name": "Agent", "description": "Conversation agent to process your request. The conversation agent is the brains of your assistant. It processes the incoming text commands." + }, + "conversation_id": { + "name": "Conversation ID", + "description": "ID of the conversation, to be able to continue a previous conversation" } } }, diff --git a/tests/components/conversation/test_init.py b/tests/components/conversation/test_init.py index fdbf10b0c7f347..72dbe8752dbfef 100644 --- a/tests/components/conversation/test_init.py +++ b/tests/components/conversation/test_init.py @@ -873,14 +873,18 @@ async def test_http_processing_intent_conversion_not_expose_new( @pytest.mark.parametrize("agent_id", AGENT_ID_OPTIONS) @pytest.mark.parametrize("sentence", ("turn on kitchen", "turn kitchen on")) +@pytest.mark.parametrize("conversation_id", ("my_new_conversation", None)) async def test_turn_on_intent( - hass: HomeAssistant, init_components, sentence, agent_id, snapshot + hass: HomeAssistant, init_components, conversation_id, sentence, agent_id, snapshot ) -> None: """Test calling the turn on intent.""" hass.states.async_set("light.kitchen", "off") calls = async_mock_service(hass, LIGHT_DOMAIN, "turn_on") - data = {conversation.ATTR_TEXT: sentence} + data = { + conversation.ATTR_TEXT: sentence, + conversation.ATTR_CONVERSATION_ID: conversation_id, + } if agent_id is not None: data[conversation.ATTR_AGENT_ID] = agent_id result = await hass.services.async_call( From 70eb7601936ce60c6d16dd9db3580beead85b869 Mon Sep 17 00:00:00 2001 From: Denis Shulyaka Date: Tue, 19 Dec 2023 23:32:54 +0300 Subject: [PATCH 2/3] fix test --- tests/components/conversation/test_init.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/components/conversation/test_init.py b/tests/components/conversation/test_init.py index 72dbe8752dbfef..fa6e0eca24f5bf 100644 --- a/tests/components/conversation/test_init.py +++ b/tests/components/conversation/test_init.py @@ -881,12 +881,11 @@ async def test_turn_on_intent( hass.states.async_set("light.kitchen", "off") calls = async_mock_service(hass, LIGHT_DOMAIN, "turn_on") - data = { - conversation.ATTR_TEXT: sentence, - conversation.ATTR_CONVERSATION_ID: conversation_id, - } + data = {conversation.ATTR_TEXT: sentence} if agent_id is not None: data[conversation.ATTR_AGENT_ID] = agent_id + if conversation_id is not None: + data[conversation.ATTR_CONVERSATION_ID] = conversation_id result = await hass.services.async_call( "conversation", "process", From c8faf716a91cb24fa3df4851ffc7754d6a8c31da Mon Sep 17 00:00:00 2001 From: Denis Shulyaka Date: Wed, 20 Dec 2023 00:41:36 +0300 Subject: [PATCH 3/3] fix tests --- .../conversation/snapshots/test_init.ambr | 128 +++++++++++++++++- 1 file changed, 124 insertions(+), 4 deletions(-) diff --git a/tests/components/conversation/snapshots/test_init.ambr b/tests/components/conversation/snapshots/test_init.ambr index f7145a9ab56ab9..9d6eb6ca88df16 100644 --- a/tests/components/conversation/snapshots/test_init.ambr +++ b/tests/components/conversation/snapshots/test_init.ambr @@ -225,7 +225,7 @@ ]), }) # --- -# name: test_turn_on_intent[turn kitchen on-None] +# name: test_turn_on_intent[None-turn kitchen on-None] dict({ 'conversation_id': None, 'response': dict({ @@ -255,7 +255,7 @@ }), }) # --- -# name: test_turn_on_intent[turn kitchen on-homeassistant] +# name: test_turn_on_intent[None-turn kitchen on-homeassistant] dict({ 'conversation_id': None, 'response': dict({ @@ -285,7 +285,7 @@ }), }) # --- -# name: test_turn_on_intent[turn on kitchen-None] +# name: test_turn_on_intent[None-turn on kitchen-None] dict({ 'conversation_id': None, 'response': dict({ @@ -315,7 +315,127 @@ }), }) # --- -# name: test_turn_on_intent[turn on kitchen-homeassistant] +# name: test_turn_on_intent[None-turn on kitchen-homeassistant] + dict({ + 'conversation_id': None, + 'response': dict({ + 'card': dict({ + }), + 'data': dict({ + 'failed': list([ + ]), + 'success': list([ + dict({ + 'id': 'light.kitchen', + 'name': 'kitchen', + 'type': , + }), + ]), + 'targets': list([ + ]), + }), + 'language': 'en', + 'response_type': 'action_done', + 'speech': dict({ + 'plain': dict({ + 'extra_data': None, + 'speech': 'Turned on light', + }), + }), + }), + }) +# --- +# name: test_turn_on_intent[my_new_conversation-turn kitchen on-None] + dict({ + 'conversation_id': None, + 'response': dict({ + 'card': dict({ + }), + 'data': dict({ + 'failed': list([ + ]), + 'success': list([ + dict({ + 'id': 'light.kitchen', + 'name': 'kitchen', + 'type': , + }), + ]), + 'targets': list([ + ]), + }), + 'language': 'en', + 'response_type': 'action_done', + 'speech': dict({ + 'plain': dict({ + 'extra_data': None, + 'speech': 'Turned on light', + }), + }), + }), + }) +# --- +# name: test_turn_on_intent[my_new_conversation-turn kitchen on-homeassistant] + dict({ + 'conversation_id': None, + 'response': dict({ + 'card': dict({ + }), + 'data': dict({ + 'failed': list([ + ]), + 'success': list([ + dict({ + 'id': 'light.kitchen', + 'name': 'kitchen', + 'type': , + }), + ]), + 'targets': list([ + ]), + }), + 'language': 'en', + 'response_type': 'action_done', + 'speech': dict({ + 'plain': dict({ + 'extra_data': None, + 'speech': 'Turned on light', + }), + }), + }), + }) +# --- +# name: test_turn_on_intent[my_new_conversation-turn on kitchen-None] + dict({ + 'conversation_id': None, + 'response': dict({ + 'card': dict({ + }), + 'data': dict({ + 'failed': list([ + ]), + 'success': list([ + dict({ + 'id': 'light.kitchen', + 'name': 'kitchen', + 'type': , + }), + ]), + 'targets': list([ + ]), + }), + 'language': 'en', + 'response_type': 'action_done', + 'speech': dict({ + 'plain': dict({ + 'extra_data': None, + 'speech': 'Turned on light', + }), + }), + }), + }) +# --- +# name: test_turn_on_intent[my_new_conversation-turn on kitchen-homeassistant] dict({ 'conversation_id': None, 'response': dict({