# Scrivere una operation
Una operation Γ¨ codice Python eseguito quando serve piΓΉ di una risposta fissa: leggere un servizio esterno, fare un calcolo, consultare un database.
1. Crea il file
Le operations sono scoperte automaticamente: basta una funzione con prefisso action_ in un file della cartella delle operations.
python
# agent/operations/ask_capital.py
def action_ask_capital(intent_name: str = None, slots: dict = None) -> dict:
slots = slots or {}
country = slots.get("LOCATION")
if not country:
return {
"response": "Di quale paese vuoi sapere la capitale?",
"slots": {},
"metadata": {"error": "missing_country"},
}
capital = CAPITALS.get(country.lower())
if not capital:
return {
"response": f"Non ho la capitale di '{country}' a disposizione.",
"slots": {},
"metadata": {"error": "country_not_found"},
}
return {
"response": f"La capitale Γ¨ {capital}.",
"slots": {},
"metadata": {},
}La funzione action_ viene registrata come .
2. Collegala alla regola
Nella regola usa il nome preceduto da due underscore:
yaml
rules:
ask_capital:
slots:
LOCATION:
required: true
wait: ask_capital_wait_response
default: __ask_capitalCosa restituire
- Una stringa:
return "Ciao!". - Oppure un dizionario con
response,slots(valori da salvare nel contesto) emetadata.
Parametri disponibili, tutti opzionali: intent_name, slots, session_manager, entity_manager.
Chiamare un servizio esterno
- Imposta sempre un timeout (per esempio 5 secondi).
- Gestisci l'errore e restituisci un messaggio chiaro: un servizio fuori uso non deve rompere la conversazione.
- Un paio di tentativi con breve attesa coprono gli errori passeggeri.
- Se un dato cambia raramente, una mappa statica nel codice Γ¨ piΓΉ semplice e veloce di una chiamata di rete.
Per logica piΓΉ complessa: una classe
python
from agent.operations.base import Operation
class MyOperation(Operation):
@property
def name(self) -> str:
return "my_operation"
def execute(self, intent_name: str, slots: dict = None) -> dict:
return {"response": "Risposta", "slots": {}, "metadata": {}}Prova veloce
Le operations sono funzioni normali: puoi testarle senza avviare il bot.
python
from agent.operations.ask_capital import action_ask_capital
print(action_ask_capital(slots={"LOCATION": "Francia"}))Prossimo passo: [Allenare e validare i modelli](/guides/training-e-validazione).