# nlu_en.ymlversion:"3.1"nlu:-intent:track_orderexamples:|
- Where is my order?
- I want to track my package.
- Has my order shipped yet?
- [Order number](order_number) AB12345678, what's the status?
-intent:return_itemexamples:|
- I need to return a product.
- How do I start a return?
- This item is broken, I want a refund.
2. 电商订单查询 Action Server 实现
用户询问订单状态触发自定义 Action,运行于独立 Python 服务器,调用电商平台 API。
import logging
from typing importAny, Text, Dict, Listfrom rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcher
import requests
import jwt
from datetime import datetime, timedelta
logger = logging.getLogger(__name__)
classActionTrackOrder(Action):
defname(self) -> Text:
return"action_track_order"def_get_api_token(self) -> str:
"""生成 JWT 鉴权 Token"""
secret_key = "your-secret-key"
payload = {
'iss': 'your-issuer',
'exp': datetime.utcnow() + timedelta(minutes=5),
'api_key': 'your-api-key'
}
token = jwt.encode(payload, secret_key, algorithm='HS256')
ifisinstance(token, bytes):
token = token.decode('utf-8')
return token
asyncdefrun(self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
order_number = next(tracker.get_latest_entity_values("order_number"), None)
ifnot order_number:
dispatcher.utter_message(text="Please provide your order number.")
return []
api_url = f"https://api.your-ecommerce.com/orders/{order_number}"
headers = {"Authorization": f"Bearer {self._get_api_token()}"}
try:
response = requests.get(api_url, headers=headers, timeout=10.0)
response.raise_for_status()
order_data = response.json()
status = order_data.get('status', 'unknown')
carrier = order_data.get('carrier', 'unknown')
tracking_num = order_data.get('tracking_number', 'N/A')
msg = f"Your order {order_number} is currently '{status}'. "if tracking_num != 'N/A':
msg += f"Track it with {carrier}: {tracking_num}."
dispatcher.utter_message(text=msg)
except requests.exceptions.Timeout:
logger.error(f"API timeout for order {order_number}")
dispatcher.utter_message(text="The order system is busy, please try again later.")
except requests.exceptions.RequestException as e:
logger.error(f"API error for order {order_number}: {e}")
dispatcher.utter_message(text="Sorry, I couldn't fetch your order details at the moment.")
except KeyError as e:
logger.error(f"Unexpected API response format for {order_number}: {e}")
dispatcher.utter_message(text="Received an unexpected response from the order system.")
return []