diff --git a/.gitignore b/.gitignore index b6e4761..f053927 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,18 @@ dmypy.json # Pyre type checker .pyre/ + +# VSCode +.vscode/ +.history/ +*.DS_Store +*.wpr +*.wpu + +# Rasa stuff +models/ +*.db* +*.dot +terms/ +results/ +.rasa/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..56c1bc8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,11 @@ +FROM rasa/rasa-sdk:3.3.0 +ENV TZ=Etc/UTC + +COPY actions /app/actions + +USER root +RUN /opt/venv/bin/python -m pip install --upgrade pip +RUN pip install --no-cache-dir -r /app/actions/requirements.txt + +USER 1001 +CMD ["start", "--actions", "actions"] diff --git a/actions/actions.py b/actions/actions.py index 6ab76f6..99e93d4 100644 --- a/actions/actions.py +++ b/actions/actions.py @@ -9,27 +9,45 @@ from rasa_sdk import Action, Tracker from rasa_sdk.executor import CollectingDispatcher -import requests +import aiohttp +import json +import logging +logger = logging.getLogger(__name__) class ActionHaystack(Action): def name(self) -> Text: return "call_haystack" - def run(self, dispatcher: CollectingDispatcher, + async def run(self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, Any]) -> List[Dict[Text, Any]]: url = "http://localhost:8000/query" - payload = {"query": str(tracker.latest_message["text"])} + payload = { + "query": str(tracker.latest_message["text"]), + "params":{"filters": {}, "Retriever": {"top_k": 3}, "Reader": {"top_k": 3}, "Query": {"debug": False}} + } headers = { 'Content-Type': 'application/json' } - response = requests.request("POST", url, headers=headers, json=payload).json() + + logger.debug(f"Calling {url}, ask: {str(tracker.latest_message['text'])}") + try: + async with aiohttp.ClientSession() as session: + async with session.post(url, headers=headers, json=payload) as response: + response = await response.json() + except aiohttp.ClientConnectorError as e: + logger.error(f"Haystack service not responding: {str(e)}") + response = {"answers":[{"answer":f"Haystack service not responding: {str(e)}"}]} if response["answers"]: + logger.debug(f"Answers returned by haystack:\n{response}") answer = response["answers"][0]["answer"] + if not answer: + answer = response["answers"][1]["answer"] + logger.debug(f"selected answer: {answer}") else: answer = "No Answer Found!" diff --git a/actions/requirements.txt b/actions/requirements.txt new file mode 100644 index 0000000..7c05f0b --- /dev/null +++ b/actions/requirements.txt @@ -0,0 +1 @@ +aiohttp==3.8.1 diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..ffdf6cb --- /dev/null +++ b/build.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# Build action server image +VERS=3.3.0 +REGISTRY= +IMAGE=haystack-action + +time docker buildx build --platform linux/amd64,linux/arm64 --output=type=registry --tag ${REGISTRY}/${IMAGE}:${VERS} --tag ${REGISTRY}/${IMAGE}:latest . +docker push ${REGISTRY}/${IMAGE} --all-tags diff --git a/data/nlu.yml b/data/nlu.yml index 08e8262..7a86361 100644 --- a/data/nlu.yml +++ b/data/nlu.yml @@ -1,4 +1,4 @@ -version: "2.0" +version: "3.1" nlu: - intent: knowledge_question @@ -30,7 +30,6 @@ nlu: - intent: goodbye examples: | - - good afternoon - cu - good by - cee you later diff --git a/data/rules.yml b/data/rules.yml index 6681c24..1577649 100644 --- a/data/rules.yml +++ b/data/rules.yml @@ -1,4 +1,4 @@ -version: "2.0" +version: "3.1" rules: diff --git a/data/stories.yml b/data/stories.yml index 077651b..6ff78ee 100644 --- a/data/stories.yml +++ b/data/stories.yml @@ -1,4 +1,4 @@ -version: "2.0" +version: "3.1" stories: diff --git a/domain.yml b/domain.yml index 348a01f..8f02a7e 100644 --- a/domain.yml +++ b/domain.yml @@ -1,4 +1,4 @@ -version: '2.0' +version: "3.1" config: store_entities_as_slots: true session_config: