diff --git a/app/internal/command_endpoints/__init__.py b/app/internal/command_endpoints/__init__.py index 11f2fdf..85ce157 100644 --- a/app/internal/command_endpoints/__init__.py +++ b/app/internal/command_endpoints/__init__.py @@ -2,6 +2,9 @@ from pydantic import BaseModel +from app.internal.wac import wac_search + + class CommandEndpointConfigException(Exception): """Raised when an the command endpoint configuration is invalid @@ -45,3 +48,10 @@ def __init__(self, **kwargs): class CommandEndpoint(): name = "WAS CommandEndpoint" log = logging.getLogger("WAS") + + def search_wac(self, command, language): + wac_success, wac_command = wac_search( + command + ) + + return wac_success, wac_command diff --git a/app/internal/command_endpoints/ha_ws.py b/app/internal/command_endpoints/ha_ws.py index 24de8df..b03d9db 100644 --- a/app/internal/command_endpoints/ha_ws.py +++ b/app/internal/command_endpoints/ha_ws.py @@ -6,8 +6,9 @@ from copy import copy -from jsonget import json_get +from jsonget import json_get, json_get_default +from app.internal.wac import FEEDBACK, openai_chat, wac_add from . import ( CommandEndpoint, CommandEndpointResponse, @@ -81,12 +82,36 @@ async def cb_msg(self, msg): if msg["type"] == "event": if msg["event"]["type"] == "intent-end": id = int(msg["id"]) + command = self.connmap[id]["jsondata"]["text"] ws = self.connmap[id]["ws"] out = CommandEndpointResult() - response_type = msg["event"]["data"]["intent_output"]["response"]["response_type"] - if response_type == "action_done": + # not all responses contain speech but default in the pydantic model is "Error" + out.speech = json_get_default(msg, "/event/data/intent_output/response/speech/plain/speech", "") + response_type = json_get(msg, "/event/data/intent_output/response/response_type") + if response_type in ["action_done", "query_answer"]: out.ok = True - out.speech = msg["event"]["data"]["intent_output"]["response"]["speech"]["plain"]["speech"] + learned = wac_add(command, rank=0.9, source='autolearn') + + if learned is True and FEEDBACK is True: + out.speech = f"{out.speech} and learned command" + + elif response_type == "error": + response_code = json_get(msg, "/event/data/intent_output/response/data/code") + if response_code == "no_intent_match": + self.log.debug(self.connmap[id]) + + language = self.connmap[id]["jsondata"]["language"] + wac_success, wac_command = self.search_wac(command, language) + + if wac_success: + jsondata = self.connmap[id]["jsondata"] + jsondata["text"] = wac_command + self.send(jsondata, ws) + self.connmap.pop(id) + return + else: + out.speech = openai_chat(command) + command_endpoint_response = CommandEndpointResponse(result=out) self.log.debug(f"sending {command_endpoint_response} to {ws}") asyncio.ensure_future(ws.send_text(command_endpoint_response.model_dump_json()))