154 lines
5.7 KiB
Python
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 [] |