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

Dialogflow ES与Voximplant呼叫列表连接失败求助

问题:Dialogflow智能体与Voximplant呼叫列表功能连接失败,提示number未定义

错误信息

  • JS error: number is undefined in /application.js:427:7

场景代码

require(Modules.CallList);
require(Modules.AI)

let dialogflow, call, hangup

var CALLER_ID = "441618022716"
let number;
let phone_number


// Create outbound call as soon as StartScenarios HTTP API arrives
VoxEngine.addEventListener(AppEvents.Started, function (e) {
    let data = VoxEngine.customData(); // <-- data from CSV string in JSON format
    data = JSON.parse(data);
     phone_number = data.phone_number;
     call = VoxEngine.callPSTN(phone_number, CALLER_ID) // replace CALLER_ID with the number we bought in previous step (the real one, test number does not work)
     call.addEventListener(CallEvents.Connected, onCallConnected)
     call.addEventListener(CallEvents.Disconnected, VoxEngine.terminate)
     call.addEventListener(CallEvents.Failed, VoxEngine.terminate)
})

function onCallConnected(e) {
  // Create Dialogflow object
    dialogflow = AI.createDialogflow({
      lang: DialogflowLanguage.ENGLISH_US
    })
    dialogflow.addEventListener(AI.Events.DialogflowResponse, onDialogflowResponse)
    // Sending WELCOME event to let the agent says a welcome message
    dialogflow.sendQuery({event : {name: "WELCOME", language_code:"en"}})
    // Playback marker used for better user experience
    dialogflow.addMarker(-300)
    // Start sending media from Dialogflow to the call
    dialogflow.sendMediaTo(call)
    dialogflow.addEventListener(AI.Events.DialogflowPlaybackFinished, (e) => {
      // Dialogflow TTS playback finished. Hangup the call if hangup flag was set to true
      if (hangup) call.hangup()
    })
    dialogflow.addEventListener(AI.Events.DialogflowPlaybackStarted, (e) => {
      // Dialogflow TTS playback started
    })
    dialogflow.addEventListener(AI.Events.DialogflowPlaybackMarkerReached, (e) => {
      // Playback marker reached - start sending audio from the call to Dialogflow
      call.sendMediaTo(dialogflow)
    })
}

// Handle Dialogflow responses
function onDialogflowResponse(e) {
  // If DialogflowResponse with queryResult received - the call stops sending media to Dialogflow
  // in case of response with queryResult but without responseId we can continue sending media to dialogflow
  if (e.response.queryResult !== undefined && e.response.responseId === undefined) {
    call.sendMediaTo(dialogflow)
  } else if (e.response.queryResult !== undefined && e.response.responseId !== undefined) {
    // Do whatever required with e.response.queryResult or e.response.webhookStatus
        // If we need to hangup because end of conversation has been reached
        if (e.response.queryResult.diagnosticInfo !== undefined && 
           e.response.queryResult.diagnosticInfo.end_conversation == true) {
           hangup = true
        }

// Telephony messages arrive in fulfillmentMessages array
    if (e.response.queryResult.fulfillmentMessages != undefined) {
        e.response.queryResult.fulfillmentMessages.forEach((msg) => {
            if (msg.platform !== undefined && msg.platform === "TELEPHONY") processTelephonyMessage(msg)
        })
    }
  }
}

// Process telephony messages from Dialogflow
function processTelephonyMessage(msg) {
  // Transfer call to msg.telephonyTransferCall.phoneNumber
  if (msg.telephonyTransferCall !== undefined) {
    /**
    * Example:
    * dialogflow.stop()
    * let newcall = VoxEngine.callPSTN(msg.telephonyTransferCall.phoneNumber, "put verified CALLER_ID here")
    * VoxEngine.easyProcess(call, newcall)
    */
  }
  // Synthesize speech from msg.telephonySynthesizeSpeech.text
  if (msg.telephonySynthesizeSpeech !== undefined) {
    // See the list of available TTS languages at https://voximplant.com/docs/references/voxengine/language
    // Example: 
    // if (msg.telephonySynthesizeSpeech.ssml !== undefined) call.say(msg.telephonySynthesizeSpeech.ssml, {"language": VoiceList.Amazon.en_US_Joanna})
    // else call.say(msg.telephonySynthesizeSpeech.text, {"language": VoiceList.Amazon.en_US_Joanna})
  }
  // Play audio file located at msg.telephonyPlayAudio.audioUri
  if (msg.telephonyPlayAudio !== undefined) {
    // audioUri contains Google Storage URI (gs://), we need to transform it to URL (https://)
    let url = msg.telephonyPlayAudio.audioUri.replace("gs://", "https://storage.googleapis.com/")
    // Example: call.startPlayback(url)
  }
}

问题分析与解决方案

核心问题

错误提示number is undefined,结合代码来看,你声明了变量let number;但从未给它赋值,而Voximplant的CallList模块可能期望这个变量存在并包含要拨打的号码。同时,你当前使用phone_number变量存储号码,但CallList模块并未识别这个变量名。

解决方案1:统一变量名为number

修改代码,将所有phone_number替换为number:

// 移除let phone_number,保留number
let number;

// 在Started事件中赋值
number = data.phone_number;
// 调用callPSTN时使用number
call = VoxEngine.callPSTN(number, CALLER_ID)

解决方案2:检查CSV数据格式

确保CallList使用的CSV文件中包含名为phone_number的列,且在导入时正确映射为JSON的phone_number字段。如果CSV列名不同(比如number),则需要调整代码中的data.phone_number为对应的键名。

解决方案3:添加错误处理

在解析自定义数据时增加校验,避免因数据缺失导致错误:

VoxEngine.addEventListener(AppEvents.Started, function (e) {
    let data = VoxEngine.customData();
    try {
        data = JSON.parse(data);
    } catch (err) {
        console.error("自定义数据JSON格式错误:", err);
        VoxEngine.terminate();
        return;
    }
    // 校验号码是否存在
    if (!data.phone_number) {
        console.error("自定义数据中缺少phone_number字段");
        VoxEngine.terminate();
        return;
    }
    number = data.phone_number;
    call = VoxEngine.callPSTN(number, CALLER_ID);
    // 后续事件监听代码...
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 14:48:16