You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rasa Core自定义动作失效及端口占用问题技术求助

解决Rasa自定义动作异常与端口占用问题

环境信息

  • Rasa Core版本:0.13.0
  • Rasa Core SDK版本:0.12.1
  • Python版本:3.6
  • 操作系统:Windows 10

一、先搞定端口占用问题(OSError: WinError 10048)

你遇到的端口冲突是因为rasa_core.run默认占用5005端口,而之前的进程没彻底关闭,或者train_online.py也会试图使用这个端口,导致“一个地址只能被一个进程占用”的错误。咱们可以这样解决:

  1. 找出占用5005端口的进程并结束
    打开Windows命令提示符,运行:

    netstat -ano | findstr :5005
    

    你会得到一串数字,那就是占用端口的进程ID(PID)。接着用命令强制结束这个进程:

    taskkill /PID <替换成你查到的PID> /F
    
  2. 避免后续冲突的正确运行方式
    动作服务器默认用5055端口,和Core的默认5005端口不冲突,所以正确的启动顺序应该是:

    • 先启动动作服务器:python -m rasa_core_sdk.endpoint --actions actions
    • 然后启动Core服务时,如果怕再冲突,可以手动指定其他端口:
      python -m rasa_core.run -d models/dialogue -u models/nlu --endpoints endpoints.yml --port 5006
      
    • 运行train_online.py时,同样可以加--port参数指定不冲突的端口,比如:python train_online.py --port 5007

二、修复自定义动作email_verification的异常

看了你的代码,有几个潜在问题会导致动作运行失败,咱们逐个修正:

1. 缺失类型提示的导入

你的代码里用了List[Event]作为返回类型注解,但没有导入List和Event,这会引发NameError,直接导致动作崩溃。需要在代码开头加上:

from typing import List
from rasa_core_sdk.events import Event

2. 未处理API请求的异常情况

当前代码没有处理网络错误、API返回异常(比如非JSON格式、key不存在)等情况,一旦请求失败,整个动作就会抛出异常。咱们给代码加上异常处理,同时也加上邮箱为空的判断,让逻辑更健壮。

修改后的完整代码:

from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import requests
from typing import List
from rasa_core_sdk import Action
from rasa_core_sdk.events import SlotSet, Event

class EmailVerification(Action):
    def name(self):
        return "email_verification"

    def run(self, dispatcher, tracker, domain):
        # type: (Dispatcher, DialogueStateTracker, Domain) -> List[Event]
        user_email_address = tracker.get_slot('email')
        
        # 先检查是否获取到邮箱
        if not user_email_address:
            dispatcher.utter_message("Sorry, I didn't get your email. Could you please provide it again?")
            return []
        
        base_url = "http://apilayer.net/api/check?access_key=8c47e63ccc2e06553e4daba9eadd23d3&email={email}"
        url = base_url.format(email=user_email_address)
        
        try:
            # 发送请求并设置超时,避免无限等待
            res = requests.get(url, timeout=10)
            # 检查HTTP请求是否成功(比如404、500等错误)
            res.raise_for_status()
            email_data = res.json()
            
            if 'format_valid' in email_data:
                emailVer = email_data['format_valid']
                response = "Your email is valid, thank you." if emailVer else "Your email is Invalid, please retype."
            else:
                response = "Sorry, I couldn't verify your email right now. Please try again later."
                
        # 捕获所有请求相关的异常
        except requests.exceptions.RequestException as e:
            response = f"Sorry, there was an error verifying your email: {str(e)}. Please try again later."
        # 捕获JSON解析失败的异常
        except ValueError:
            response = "Sorry, I received an invalid response from the verification service. Please try again later."
            
        dispatcher.utter_message(response)
        return [SlotSet("email", user_email_address)]

3. 确认端点配置正确

你的endpoints.yml里动作端点配置是http://localhost:5055/webhook,这和动作服务器的默认端口一致,没问题。如果后续修改了动作服务器的端口,记得同步更新这里的URL。

最后再走一遍正确流程

  1. 启动动作服务器:python -m rasa_core_sdk.endpoint --actions actions
  2. 启动Rasa Core服务:python -m rasa_core.run -d models/dialogue -u models/nlu --endpoints endpoints.yml
  3. 运行train_online.py(如果需要):python train_online.py --port 5006

这样应该就能同时解决端口占用和自定义动作的异常问题了。

内容的提问来源于stack exchange,提问作者nesp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:18:11