在Rasa Core调用Apixu API遇1003错误,请求协助解析
解决Rasa Core中调用Apixu API时的Parameter q is missing错误
这个错误(错误码1003)的根源非常清晰:你在调用Apixu天气API时,没有传递必填的q参数——这个参数是用来指定要查询天气的城市/地点的。咱们一步步排查解决:
1. 检查action_weather动作代码的参数传递
首先看你的自定义动作代码,确保你正确从Rasa的槽位中获取了地点信息,并且在调用API时把这个值传给q参数。比如正确的代码结构应该是这样的:
from typing import Dict, Text, List, Any from rasa_sdk import Action, Tracker from rasa_sdk.executor import CollectingDispatcher from apixu.client import ApixuClient, ApixuException class ActionWeather(Action): def name(self) -> Text: return "action_weather" def run(self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, Any]) -> List[Dict[Text, Any]]: # 从槽位获取地点信息,这里假设你的槽位名叫location location = tracker.get_slot("location") # 关键:先判断地点是否存在,不存在就提示用户补充 if not location: dispatcher.utter_message(text="麻烦告诉我你想查询哪个地点的天气呀?") return [] try: # 初始化Apixu客户端 api_key = "你的Apixu API密钥" client = ApixuClient(api_key) # 调用API时必须传入q参数,值为获取到的location current_weather = client.getCurrentWeather(q=location) # 处理天气数据并回复用户(示例) temp_c = current_weather['current']['temp_c'] dispatcher.utter_message(text=f"{location}当前气温是{temp_c}℃") except ApixuException as e: # 捕获API异常,方便调试 dispatcher.utter_message(text=f"查询天气时出错了:{str(e)}") return []
重点要注意:如果location槽位为空,直接调用API就会触发Parameter q is missing错误,所以一定要先做非空判断。
2. 确认Domain文件中的槽位配置
打开你的domain.yml,检查是否正确定义了location槽位,并且设置了正确的映射规则,确保NLU识别到的地点实体能填充到这个槽位里。示例配置:
slots: location: type: text influence_conversation: true mappings: - type: from_entity entity: location intent: ask_weather # 可选:限定只有ask_weather意图才填充这个槽位
3. 验证NLU的实体识别能力
检查你的NLU训练数据(比如nlu.yml),确保包含足够多的带location实体的样本,让模型能正确识别地点:
nlu: - intent: ask_weather examples: | - [北京]的天气怎么样 - [上海]今天气温多少 - 告诉我[广州]的天气 - [深圳]明天会下雨吗 - 杭州的[天气]情况
你可以用rasa test nlu命令测试NLU模型的识别效果,看地点实体是否能被正确标注。
4. 测试槽位填充是否正常
启动rasa shell,和机器人对话,比如输入“北京的天气怎么样”,然后输入/slot命令查看location槽位是否被正确填充。如果槽位是空的,那问题出在NLU识别或者槽位映射上;如果槽位有值但还是报错,就要回到动作代码检查参数传递是否有误。
最后提个常见小坑:别把槽位名称拼错了!比如代码里写的是tracker.get_slot("loc"),但domain里定义的是location,这种低级错误很容易导致参数缺失。
内容的提问来源于stack exchange,提问作者Antonblue16
相关产品推荐
相关产品推荐

