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

如何正确执行Twilio Studio对话流程?解决重复执行报错

问题分析与解决

错误原因

你遇到的问题核心是每次用户发消息,你的代码都会创建一个新的Studio Flow Execution,但Twilio不允许同一个联系人(用户)同时存在多个活跃的Execution,所以触发了报错。而且你调用.update(status='ended')会直接结束刚创建的Execution,导致用户只能收到第一条消息,后续回复又触发新的创建请求,陷入循环。

简单说:你的代码现在是"每次消息都开新会话",但Twilio要求一个用户只能有一个活跃会话,同时你还把刚开的会话直接关了,自然没法继续对话。

正确的处理逻辑

Twilio Studio的会话(Execution)是可以复用的:当用户和Flow交互时,如果已经有活跃的会话,用户的回复会自动被Twilio路由到这个会话继续执行流程,不需要手动创建新的。所以你的代码只需要在用户没有活跃会话时创建新的Execution,有活跃会话时直接让Twilio自动处理即可。

代码修改步骤

1. 添加查询活跃会话的函数

先写一个函数,用来检查当前用户是否有正在运行的Studio Flow会话:

def get_active_execution(phone_number):
    # 查询该用户对应的活跃Studio Flow Execution
    executions = twilio_client.studio.v2.flows(Config.TWILIO_STUDIO_FLOW_SID).executions.list(
        to=f'whatsapp:{phone_number}',
        status='active'
    )
    # 返回第一个活跃会话,没有则返回None
    return executions[0] if executions else None

2. 修复Studio Flow创建函数

去掉多余的.update(status='ended'),不要刚创建就结束会话:

def twilio_studio_flow(phone_number: str):
    '''
    创建新的Studio Flow Execution(仅当没有活跃会话时调用)
    '''
    twilio_client.studio \
        .v2 \
        .flows(Config.TWILIO_STUDIO_FLOW_SID) \
        .executions \
        .create(
            to=f'whatsapp:{phone_number}', 
            from_=Config.TWILIO_PHONE_NUMBER,
            parameters={
                "appointment_time": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
            }
        )

3. 修改消息接收逻辑

只在没有活跃会话时创建新的Execution,有活跃会话时直接交给Twilio处理:

def incoming_message() -> str:
    incoming_message = request.values.get('Body', '').lower()
    phone_number = request.values.get('From', None).replace('whatsapp:', '')
    resp = MessagingResponse()
    
    # 先验证手机号
    if not validate_phone_number(phone_number):
        resp.message('Lo sentimos, no pudimos validar tu numero de telefono 😟')
        return str(resp)
    
    # 检查是否有活跃会话
    active_execution = get_active_execution(phone_number)
    
    if active_execution:
        # 已有活跃会话,Twilio会自动把用户的回复路由到该会话,不需要额外操作
        return str(resp)
    else:
        # 没有活跃会话,创建新的Execution
        twilio_studio_flow(phone_number)
        # 不要用resp.message包裹,Studio Flow会自动发送初始消息
        return str(resp)

4. 修复端点函数的冗余代码

你的incoming_message_data函数里有重复的message键,修正一下:

@twilio.route('/incoming_message', methods=['GET', 'POST'])
def incoming_message_data() -> str:
    if request.method == 'POST':
        message = incoming_message()
        if message and message != [{}]:
            response = {
                'success': True, 
                'message': message, 
                'status_code': 200, 
                'error': None, 
                'code': ''
            }
        else:
            response = {
                'success': False,  
                'message': 'Message could not be sent', 
                'status_code': 400, 
                'error': '', 
                'code': ''
            }
        # Twilio接收Webhook需要返回Twiml,所以直接返回message即可
        return message
    return ''

额外注意事项

  • 确保你的Studio Flow里使用了Send & Wait for Reply组件,这个组件会让Flow处于等待状态,Twilio会自动把用户的后续回复路由到当前活跃的Execution。
  • 不要手动结束活跃Execution,除非你确实需要终止会话,否则Twilio会自动在流程结束后将Execution状态改为completed。

内容的提问来源于stack exchange,提问作者Luis Cedillo Maldonado

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:20:23