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 []