S5_AR01/rasa/actions/actions.py
2024-10-08 14:46:15 +02:00

154 lines
5.7 KiB
Python

import requests
import json
from rasa_sdk import Action
from rasa_sdk.events import SlotSet
# Action to ask to the Llama model
class ActionAskLlama(Action):
def name(self):
return "action_ask_llama"
def run(self, dispatcher, tracker, domain):
user_input = tracker.latest_message.get('text')
# Call API (Streaming)
url = "http://localhost:11434/api/generate"
payload = {
"model": "llama3.1",
"prompt": user_input
}
try:
response = requests.post(url, json=payload, stream=True)
if response.status_code == 200:
llm_response = ""
# Read the response line by line
for line in response.iter_lines():
if line:
json_line = line.decode('utf-8')
json_data = json.loads(json_line)
# Done flag for defining the end of the response
if json_data.get("done"):
break
llm_response += json_data.get("response", "")
dispatcher.utter_message(text=llm_response.strip())
else:
dispatcher.utter_message(text=f"Erreur lors de l'appel à Ollama: {response.status_code} - {response.text}")
except Exception as e:
dispatcher.utter_message(text=f"Une exception est survenue : {str(e)}")
return []
# Action to ask to tje randomuser API
class ActionRandomuser(Action):
def name(self):
return "action_randomuser"
def run(self, dispatcher, tracker, domain):
url = "https://randomuser.me/api/"
try:
response = requests.get(url)
if response.status_code == 200:
user_data = response.json()
result = user_data["results"][0]
# Extract data
first_name = result["name"]["first"]
last_name = result["name"]["last"]
age = result["dob"]["age"]
street = result["location"]["street"]["name"]
city = result["location"]["city"]
state = result["location"]["state"]
country = result["location"]["country"]
# Send message
message = (
f"Nom: {last_name}, Prénom: {first_name}, Age: {age}, "
f"Lieu d'habitation: {street}, {city}, {state}, {country}"
)
dispatcher.utter_message(text=message)
else:
dispatcher.utter_message(text=f"Erreur lors de l'appel à l'API: {response.status_code} - {response.text}")
except Exception as e:
dispatcher.utter_message(text=f"Une exception est survenue : {str(e)}")
# Action to get city and state from a zipcode (Swiss)
class ActionGetZipcode(Action):
def name(self) -> str:
return "action_swiss_zipcode"
def run(self, dispatcher, tracker, domain):
zipcode = next(tracker.get_latest_entity_values("zipcode"), None)
with open('../logs.txt', 'a') as f:
f.write(zipcode + '\n')
if zipcode:
url = f"https://api.zippopotam.us/ch/{zipcode}"
response = requests.get(url)
if response.status_code == 200:
data = response.json()
places = data.get("places", [])
if places:
place_info = places[0]
city = place_info.get("place name")
state = place_info.get("state")
message = f"Le code postal {zipcode} correspond à {city}, {state}."
else:
message = f"Aucune information trouvée pour le code postal {zipcode}."
else:
message = f"Erreur lors de l'appel à l'API : {response.status_code}."
else:
message = "Je n'ai pas pu extraire le code postal."
dispatcher.utter_message(text=message)
return []
# Action to get the signification of a firstname and 3 famous people known from llama model
class ActionFirstnameSignificationLlama(Action):
def name(self):
return "action_firstname_signification_by_llama"
def run(self, dispatcher, tracker, domain):
firstname = next(tracker.get_latest_entity_values("firstname"), None)
with open('../logs.txt', 'a') as f:
f.write(firstname + '\n')
user_input = "Quelle est la signification du prénom " + firstname + " ? Donne une courte signification. Puis liste 3 personnalités connues portant ce prénom."
# Call API (Streaming)
url = "http://localhost:11434/api/generate"
payload = {
"model": "llama3.1",
"prompt": user_input
}
try:
response = requests.post(url, json=payload, stream=True)
if response.status_code == 200:
llm_response = ""
# Read the response line by line
for line in response.iter_lines():
if line:
json_line = line.decode('utf-8')
json_data = json.loads(json_line)
# Done flag for defining the end of the response
if json_data.get("done"):
break
llm_response += json_data.get("response", "")
dispatcher.utter_message(text=llm_response.strip())
else:
dispatcher.utter_message(text=f"Erreur lors de l'appel à Ollama: {response.status_code} - {response.text}")
except Exception as e:
dispatcher.utter_message(text=f"Une exception est survenue : {str(e)}")
return []