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

Twilio语音聊天机器人函数呼入正常,外呼触发应用错误求助

Twilio外呼触发OpenAI语音机器人异常排查与解决

问题背景

基于Twilio开发的语音聊天机器人,对接OpenAI实现双向语音对话:监听用户语音转写后传递给OpenAI生成回复并播报。该机器人在呼入触发Twilio函数时运行正常,但通过Twilio Studio流程触发外呼后执行函数出现应用错误,无法获取正常回复。

使用的核心函数为Transcribe(初始化对话+监听用户语音)和Respond(处理语音转写+调用OpenAI生成回复)。

可能原因及解决方案

1. 初始化对话上下文传递异常

呼入场景下,用户拨打电话直接触发Transcribe函数,此时event.convo为空,函数会正常执行初始化分支发送问候。但Studio外呼流程中,若初始调用Transcribe时未正确传递空值convo,或请求方法不匹配,会导致逻辑异常。

解决步骤:

  • 在Studio的「Run Function」组件中,设置请求方法为POST,并显式添加参数convo,值留空,确保函数能进入初始化分支。
  • 检查Studio流程:外呼接通后直接调用Transcribe函数,避免多余组件干扰初始上下文。

2. 未处理异步操作异常

Respond函数包含异步OpenAI API调用,若未捕获异常,API请求失败时会直接抛出错误,导致Twilio返回应用错误。此外,原代码未处理用户未说话(SpeechResult为空)的场景,也会引发逻辑报错。

修正代码:

const presetPrompt =`The following is a conversation with an AI friend named Joanna. Joanna is friendly, funny, creative, and very talkative. If you are asked the meaning of life, respond with simply "42" and nothing else 

`;
const { OpenAI } = require("openai");

exports.handler = async function(context, event, callback) {
    try {
        // 使用Twilio环境变量存储API密钥,避免硬编码
        const openai = new OpenAI({ api_key: context.OPENAI_API_KEY });
        const twiml = new Twilio.twiml.VoiceResponse();

        // 为convo添加默认值,防止undefined
        let convo = event.convo || '';
        const voiceInput = event.SpeechResult;

        // 处理用户未说话的情况
        if (!voiceInput) {
            twiml.say({ voice: 'Polly.Joanna-Neural' }, "Sorry, I didn't catch that.");
            const params = new URLSearchParams({ convo: convo });
            twiml.redirect({ method: 'POST' }, `/transcribe?${params}`);
            return callback(null, twiml);
        }

        // 拼接对话上下文
        convo += `
You: ${voiceInput}
Joanna:`;
        const aiResponse = await generateAIResponse(convo);
        convo += aiResponse;  
        twiml.say({ voice: 'Polly.Joanna-Neural' }, aiResponse);

        // 传递对话上下文回Transcribe函数
        const params = new URLSearchParams({ convo: convo });
        twiml.redirect({ method: 'POST' }, `/transcribe?${params}`);

        return callback(null, twiml);
    } catch (error) {
        console.error('Function Error:', error);
        const twiml = new Twilio.twiml.VoiceResponse();
        twiml.say({ voice: 'Polly.Joanna-Neural' }, "Oops, something went wrong.");
        return callback(null, twiml);
    }

    async function generateAIResponse(convo) {
        try {
            const apiResponse = await openai.completions.create({
                model: "gpt-3.5-turbo-instruct",
                prompt: presetPrompt + convo,
                max_tokens: 60, 
                temperature: 0.8, 
                stop: ['\n', '\n\n'],
            });
            console.log('OpenAI Response:', apiResponse);
            // 处理空回复,避免无限递归
            const responseText = apiResponse.choices[0].text.trim();
            return responseText || "Hmm, let me think...";
        } catch (apiError) {
            console.error('OpenAI API Error:', apiError);
            return "Sorry, I'm having trouble connecting right now.";
        }
    }
};

3. 硬编码API密钥的环境适配问题

原代码中硬编码OPENAI_API_KEY,在Studio触发场景下可能无法正确读取环境变量(Twilio函数的环境变量需通过context对象访问),导致OpenAI API调用失败。

修正点:
将const openai = new OpenAI({ api_key: 'OPENAI_API_KEY'});改为const openai = new OpenAI({ api_key: context.OPENAI_API_KEY });,并确保Twilio函数的环境变量中已配置OPENAI_API_KEY。

4. 日志排查建议

通过Twilio Console的「Functions > Logs」查看Studio触发时的请求参数和错误信息:

  • 确认event.convo和event.SpeechResult是否正确传递;
  • 检查OpenAI API调用的请求日志,确认是否有请求发送及响应状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:14:57