计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
byted-outbound-call【效率与协作】AI-powered intelligent phone calling service to automatically handle restaurant reservation, modification, and cancellation tasks without manual dialing. Use when users want to reserve, modify, or cancel restaurant bookings.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
希望将生活服务场景中「需要打电话」的琐事外包给AI Agent的用户,适用场景目前只包含餐厅门店的预约、改订、取消。
严禁修改byted-outbound-call下的代码。
| 场景 | Agent名称 | 剧本ID |
|---|---|---|
| 新预约 | 预约Agent | llm_wlne_biffj |
| 修改已有预约 | 改订Agent | llm_eeac_bigci |
| 取消已有预约 | 取消Agent | llm_ivqy_bigcj |
| 需求类型 | 必填信息 | 对应参数名 |
|---|---|---|
| 预约 | 门店名称、门店电话、预约日期(年月日)、预约时间(时分)、人数、用户姓氏、用户联系电话 | shop_name/shop_phone_number/date/time/people_number/first_name/user_phone_number |
| 改订 | 门店名称、门店电话、原本预约的日期(年月日)、原本预约的时间(时分)、原本的人数、新预约日期(年月日)、新预约时间(时分)、新人数、用户姓氏、预订时预留的联系电话 | shop_name/shop_phone_number/date/time/people_number/new_date/new_time/new_people_number/first_name/user_phone_number |
| 取消 | 门店名称、门店电话、预约日期(年月日)、预约时间(时分)、人数、用户姓氏、预订时预留的联系电话 | shop_name/shop_phone_number/date/time/people_number/first_name/user_phone_number |
当调用本技能的脚本时,下列所有的变量都必填,否则消息通知会报错,必须自动将当前会话的如下信息作为环境变量传递给exec命令。信息获取方式如下:
channel字段获取。channel为webchat,则运行工具(tool)sessions_list,从sessions_list输出结果中获取当前对话的会话id(sessionId),并将sessionId赋值给OPENCLAW_SESSION_ID。ELSE: 将字符串赋值"no_need"赋值给OPENCLAW_SESSION_ID。channel为webchat,将字符串赋值"no_need"赋值给OPENCLAW_USER_ID ELSE: 将消息元数据(metadata)中的chat_id字段去除"user:"前缀,赋值给OPENCLAW_USER_ID。按如下步骤一步步执行:
执行脚本:调用scripts/submit_job.py提交外呼任务,调用方式(Agent自动调用,不需要用户手动执行)
推荐方式:通过exec工具内置env参数传递(敏感信息不会出现在命令行历史)
{
"tool": "exec",
"command": "python3 scripts/submit_job.py --request-body '{
"job_name": "【预约/改订/取消】+ 门店名称 + 用户需求",
"job_description": "用户自然语言原始需求(可选)",
"script_id": "对应场景的剧本ID:预约=llm_wlne_biffj/改订=llm_eeac_bigci/取消=llm_ivqy_bigcj",
"params": {
"user_phone_number": "联系电话(所有场景必填)",
"date": "预约日期(仅预约场景)",
"time": "预约时间(仅预约场景)",
"people_number": "预约人数(仅预约场景)",
"shop_name": "门店名称(所有场景必填)",
"shop_phone_number": "门店电话(所有场景必填)",
"first_name": "用户姓氏(所有场景必填)",
"new_date": "新预约日期(仅改订场景)",
"new_time": "新预约时间(仅改订场景)",
"new_people_number": "新预约人数(仅改订场景)"
}
}'
",
"env": {
"OPENCLAW_SESSION_ID": "{{阶段2中获取到的OPENCLAW_SESSION_ID}}",
"OPENCLAW_CHANNEL": "{{阶段2中获取到的OPENCLAW_CHANNEL}}",
"OPENCLAW_USER_ID": "{{阶段2中获取到的OPENCLAW_USER_ID}}"
}
}
查看上一步脚本的输出, 按如下要求进行处理:
JobId,整理为自然语言,在此环节告知用户任务已提交,在完成通知后终止流程。
参考返回样式:✅ 已为你发起外呼任务「海底捞火锅(中关村店)」,程时间较长请耐心等待,任务完成后会通知你! 📋 任务ID:{JobId} 📅 时间:3月20日 19:00 👥 人数:4位 📝 预订人:李先生
scripts/query_job.py查询外呼任务状态和详情,调用方式(Agent自动调用,不需要用户手动执行)
{
"tool": "exec",
"command": "python3 scripts/query_job.py --job_id '{JobId}'"
}📋 任务ID:{JobId} ⏳ 当前状态:呼叫任务已提交,正在排队等待系统发起呼叫。
📋 任务ID:{JobId} 🔄 当前状态:呼叫任务正在处理中,如商家未接听,系统会自动重呼,请耐心等待。
📋 任务ID:{JobId} 📊 当前状态:所有预定的呼叫(包括重呼)均已执行完毕,正在分析通话结果。
📋 任务ID:{JobId} ✅ 任务状态:已完成预订的呼叫,并且完成通话结果分析。 📞 接通情况:正常接通 预约详情:
📅 用餐时间:2026年3月28日 21:00 👥 人数:1位 📝 预订人:高先生 📞 预留电话:尾号 8838
📋 任务ID:{JobId} ✅ 任务状态:已完成预订的呼叫,并且完成通话结果分析。 📞 接通情况:无人接听
❌ 查询失败:呼叫任务不存在,请确认任务ID是否正确
用户输入:帮我预约明天晚上7点的海底捞火锅中关村店,他们电话是13800138000,3个人,我姓王,联系电话13512345678 技能思考:用户query已经包含了门店名称、预约时间、预约人数、用户姓氏、联系电话等所有必要信息,无需追问,调用submit-job并通知客户 技能响应:好的,马上帮你联系海底捞火锅中关村店预约,完成后第一时间告诉你结果~
用户输入:帮我取消明天的海底捞预订 技能思考:用户query中包含了门店名称、时间,需要提供其他信息。 技能响应:请问海底捞的门店电话是多少?预订时预留的姓氏和联系电话是什么呢? 用户补全:电话是13500015678,我姓李,预留电话是13512345678 技能思考:用户query中已经包含所有必填信息,无需追问,直接调用cancel-job并通知客户。 技能响应:好的,马上帮你取消~
用户输入:帮我给领导打个电话请假
技能响应:抱歉哦,我目前只支持生活服务类门店的预约、改订、取消类外呼任务,其他类型的通话需求暂时无法帮你处理~
用户输入:帮我查一下任务ID为 job_123456 的外呼任务状态 技能思考:用户需要查询指定JobId的任务状态,调用query_job脚本 技能响应:好的,马上帮你查询任务状态~ 技能思考:执行查询脚本,获取已整理好的状态结果 技能响应:
📋 任务ID:job_123456 ✅ 任务状态:已完成预订的呼叫,并且完成通话结果分析。 📞 接通情况:正常接通 预约详情:
📅 用餐时间:2026年3月28日 21:00 👥 人数:1位 📝 预订人:高先生 📞 预留电话:尾号 8838
| 错误场景 | 处理逻辑 | 返回示例 |
|---|---|---|
| 商户电话无效/空号 | 直接返回失败,提示用户核对号码 | ❌ 拨打失败,你提供的门店电话135xxxxxxx是空号,请核对后重新提交 |
| 外呼接口调用失败 | 提取接口返回的msg信息整理后返回 | ❌ 外呼服务暂时不可用:接口返回「余额不足」,请充值后再试 |
| 任务提交异常 | 直接返回接口错误信息 | ❌ 任务提交失败:接口返回「剧本ID不存在」,请检查配置是否正确 |
| 环境变量校验失败 | 检查哪些变量没有传递,重试并传递进去 | 重试脚本 |