diff --git a/homeassistant/components/conversation/agent.py b/homeassistant/components/conversation/agent.py index 0056f35def6..18a2f4edf56 100644 --- a/homeassistant/components/conversation/agent.py +++ b/homeassistant/components/conversation/agent.py @@ -49,6 +49,11 @@ class AbstractConversationAgent(ABC): """Return the attribution.""" return None + @property + @abstractmethod + def supported_languages(self) -> list[str]: + """Return a list of supported languages.""" + @abstractmethod async def async_process(self, user_input: ConversationInput) -> ConversationResult: """Process a sentence.""" diff --git a/homeassistant/components/conversation/default_agent.py b/homeassistant/components/conversation/default_agent.py index 02d90d1c8dd..b3a66d80307 100644 --- a/homeassistant/components/conversation/default_agent.py +++ b/homeassistant/components/conversation/default_agent.py @@ -13,7 +13,7 @@ from typing import IO, Any from hassil.intents import Intents, ResponseType, SlotList, TextSlotList from hassil.recognize import RecognizeResult, recognize_all from hassil.util import merge_dict -from home_assistant_intents import get_intents +from home_assistant_intents import get_domains_and_languages, get_intents import yaml from homeassistant import core, setup @@ -86,6 +86,11 @@ class DefaultAgent(AbstractConversationAgent): self._config_intents: dict[str, Any] = {} self._slot_lists: dict[str, SlotList] | None = None + @property + def supported_languages(self) -> list[str]: + """Return a list of supported languages.""" + return get_domains_and_languages()["homeassistant"] + async def async_initialize(self, config_intents): """Initialize the default agent.""" if "intent" not in self.hass.config.components: diff --git a/homeassistant/components/google_assistant_sdk/__init__.py b/homeassistant/components/google_assistant_sdk/__init__.py index 93699321eda..7a9ca70bf14 100644 --- a/homeassistant/components/google_assistant_sdk/__init__.py +++ b/homeassistant/components/google_assistant_sdk/__init__.py @@ -150,6 +150,14 @@ class GoogleAssistantConversationAgent(conversation.AbstractConversationAgent): "url": "https://www.home-assistant.io/integrations/google_assistant_sdk/", } + @property + def supported_languages(self) -> list[str]: + """Return a list of supported languages.""" + language_code = self.entry.options.get( + CONF_LANGUAGE_CODE, default_language_code(self.hass) + ) + return [language_code] + async def async_process( self, user_input: conversation.ConversationInput ) -> conversation.ConversationResult: diff --git a/homeassistant/components/openai_conversation/__init__.py b/homeassistant/components/openai_conversation/__init__.py index 6f76142106a..d6eeb85e06a 100644 --- a/homeassistant/components/openai_conversation/__init__.py +++ b/homeassistant/components/openai_conversation/__init__.py @@ -9,7 +9,7 @@ from openai import error from homeassistant.components import conversation from homeassistant.config_entries import ConfigEntry -from homeassistant.const import CONF_API_KEY +from homeassistant.const import CONF_API_KEY, MATCH_ALL from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryNotReady, TemplateError from homeassistant.helpers import intent, template @@ -70,6 +70,11 @@ class OpenAIAgent(conversation.AbstractConversationAgent): """Return the attribution.""" return {"name": "Powered by OpenAI", "url": "https://www.openai.com"} + @property + def supported_languages(self) -> list[str]: + """Return a list of supported languages.""" + return [MATCH_ALL] + async def async_process( self, user_input: conversation.ConversationInput ) -> conversation.ConversationResult: diff --git a/tests/components/conversation/__init__.py b/tests/components/conversation/__init__.py index 4812411fe23..db233be04cf 100644 --- a/tests/components/conversation/__init__.py +++ b/tests/components/conversation/__init__.py @@ -18,6 +18,11 @@ class MockAgent(conversation.AbstractConversationAgent): self.calls = [] self.response = "Test response" + @property + def supported_languages(self) -> list[str]: + """Return a list of supported languages.""" + return ["smurfish"] + async def async_process( self, user_input: conversation.ConversationInput ) -> conversation.ConversationResult: diff --git a/tests/components/conversation/test_default_agent.py b/tests/components/conversation/test_default_agent.py index f375d3ca1e3..810e2905034 100644 --- a/tests/components/conversation/test_default_agent.py +++ b/tests/components/conversation/test_default_agent.py @@ -1,4 +1,5 @@ """Test for the default agent.""" +from unittest.mock import patch import pytest @@ -121,3 +122,18 @@ async def test_exposed_areas( # This should be an intent match failure because the area isn't in the slot list assert result.response.response_type == intent.IntentResponseType.ERROR assert result.response.error_code == intent.IntentResponseErrorCode.NO_INTENT_MATCH + + +async def test_conversation_agent( + hass: HomeAssistant, + init_components, +) -> None: + """Test DefaultAgent.""" + agent = await conversation._get_agent_manager(hass).async_get_agent( + conversation.HOME_ASSISTANT_AGENT + ) + with patch( + "homeassistant.components.conversation.default_agent.get_domains_and_languages", + return_value={"homeassistant": ["dwarvish", "elvish", "entish"]}, + ): + assert agent.supported_languages == ["dwarvish", "elvish", "entish"] diff --git a/tests/components/google_assistant_sdk/test_init.py b/tests/components/google_assistant_sdk/test_init.py index 293b42fa57b..837f98ad4b9 100644 --- a/tests/components/google_assistant_sdk/test_init.py +++ b/tests/components/google_assistant_sdk/test_init.py @@ -7,6 +7,7 @@ from unittest.mock import call, patch import aiohttp import pytest +from homeassistant.components import conversation from homeassistant.components.google_assistant_sdk import DOMAIN from homeassistant.config_entries import ConfigEntryState from homeassistant.core import HomeAssistant @@ -334,6 +335,9 @@ async def test_conversation_agent( ) await hass.async_block_till_done() + agent = await conversation._get_agent_manager(hass).async_get_agent(entry.entry_id) + assert agent.supported_languages == ["en-US"] + text1 = "tell me a joke" text2 = "tell me another one" with patch( diff --git a/tests/components/openai_conversation/test_init.py b/tests/components/openai_conversation/test_init.py index 144d77beab5..62136ecfffd 100644 --- a/tests/components/openai_conversation/test_init.py +++ b/tests/components/openai_conversation/test_init.py @@ -137,3 +137,15 @@ async def test_template_error( assert result.response.response_type == intent.IntentResponseType.ERROR, result assert result.response.error_code == "unknown", result + + +async def test_conversation_agent( + hass: HomeAssistant, + mock_config_entry: MockConfigEntry, + mock_init_component, +) -> None: + """Test OpenAIAgent.""" + agent = await conversation._get_agent_manager(hass).async_get_agent( + mock_config_entry.entry_id + ) + assert agent.supported_languages == ["*"]