1 """Support for Wyoming intent recognition services."""
5 from wyoming.asr
import Transcript
6 from wyoming.client
import AsyncTcpClient
7 from wyoming.handle
import Handled, NotHandled
8 from wyoming.info
import HandleProgram, IntentProgram
9 from wyoming.intent
import Intent, NotRecognized
18 from .const
import DOMAIN
19 from .data
import WyomingService
20 from .error
import WyomingError
21 from .models
import DomainDataItem
23 _LOGGER = logging.getLogger(__name__)
28 config_entry: ConfigEntry,
29 async_add_entities: AddEntitiesCallback,
31 """Set up Wyoming conversation."""
32 item: DomainDataItem = hass.data[DOMAIN][config_entry.entry_id]
43 """Wyoming conversation agent."""
45 _attr_has_entity_name =
True
49 config_entry: ConfigEntry,
50 service: WyomingService,
52 """Set up provider."""
60 for maybe_intent
in self.
serviceservice.info.intent:
61 if maybe_intent.installed:
65 for maybe_handle
in self.
serviceservice.info.handle:
66 if maybe_handle.installed:
70 model_languages: set[str] = set()
74 if intent_model.installed:
75 model_languages.update(intent_model.languages)
79 conversation.ConversationEntityFeature.CONTROL
83 if handle_model.installed:
84 model_languages.update(handle_model.languages)
93 """Return a list of supported languages."""
97 self, user_input: conversation.ConversationInput
99 """Process a sentence."""
100 conversation_id = user_input.conversation_id
or ulid.ulid_now()
101 intent_response = intent.IntentResponse(language=user_input.language)
104 async
with AsyncTcpClient(self.
serviceservice.host, self.
serviceservice.port)
as client:
105 await client.write_event(
107 user_input.text, context={
"conversation_id": conversation_id}
112 event = await client.read_event()
114 _LOGGER.debug(
"Connection lost")
115 intent_response.async_set_error(
116 intent.IntentResponseErrorCode.UNKNOWN,
117 "Connection to service was lost",
120 response=intent_response,
121 conversation_id=user_input.conversation_id,
124 if Intent.is_type(event.type):
126 recognized_intent = Intent.from_event(event)
127 _LOGGER.debug(
"Recognized intent: %s", recognized_intent)
129 intent_type = recognized_intent.name
131 e.name: {
"value": e.value}
132 for e
in recognized_intent.entities
134 intent_response = await intent.async_handle(
139 text_input=user_input.text,
140 language=user_input.language,
143 if (
not intent_response.speech)
and recognized_intent.text:
144 intent_response.async_set_speech(recognized_intent.text)
148 if NotRecognized.is_type(event.type):
149 not_recognized = NotRecognized.from_event(event)
150 intent_response.async_set_error(
151 intent.IntentResponseErrorCode.NO_INTENT_MATCH,
156 if Handled.is_type(event.type):
158 handled = Handled.from_event(event)
159 intent_response.async_set_speech(handled.text)
162 if NotHandled.is_type(event.type):
163 not_handled = NotHandled.from_event(event)
164 intent_response.async_set_error(
165 intent.IntentResponseErrorCode.FAILED_TO_HANDLE,
170 except (OSError, WyomingError)
as err:
171 _LOGGER.exception(
"Unexpected error while communicating with service")
172 intent_response.async_set_error(
173 intent.IntentResponseErrorCode.UNKNOWN,
174 f
"Error communicating with service: {err}",
177 response=intent_response,
178 conversation_id=user_input.conversation_id,
180 except intent.IntentError
as err:
181 _LOGGER.exception(
"Unexpected error while handling intent")
182 intent_response.async_set_error(
183 intent.IntentResponseErrorCode.FAILED_TO_HANDLE,
184 f
"Error handling intent: {err}",
187 response=intent_response,
188 conversation_id=user_input.conversation_id,
193 response=intent_response, conversation_id=conversation_id
None __init__(self, ConfigEntry config_entry, WyomingService service)
conversation.ConversationResult async_process(self, conversation.ConversationInput user_input)
list[str] supported_languages(self)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)