Add property supported_languages to AbstractConversationAgent (#91588)

* Add property supported_languages to AbstractConversationAgent

* Fix test

* Use MATCH_ALL for openai supported languages
This commit is contained in:
Erik Montnemery 2023-04-18 22:11:04 +02:00 committed by GitHub
parent d7eb4c4740
commit dc3c47986b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 62 additions and 2 deletions

View file

@ -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."""

View file

@ -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:

View file

@ -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:

View file

@ -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:

View file

@ -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:

View file

@ -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"]

View file

@ -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(

View file

@ -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 == ["*"]