前言¶
在 DeepSeek Harness(DSH)里跑智能体时,电话和短信往往还在浏览器之外:Twilio 控制台、手机、单独的 VoIP 客户端。模型要查未读、代发一条短信或说明当前是否勿扰,也需要你自己写胶水层。社区插件 dsh-phone(维护者 lucagiftzek,npm 包 @lucagiftzek/dsh-phone,当前版本 0.3.1)把 Phone 标签页挂进 DSH Web 侧边栏(依赖 dsh-better-sidebar),并在同一套界面里处理短信、通话、实时语音信箱,以及(按 README 描述)Telegram 相关能力;通话音频默认经你自己的服务器转发,便于在限制 WebRTC 的网络里仍能从浏览器接听。
这是什么¶
dsh-phone 是 DSH Web GUI 的「客户端」类插件:在侧边栏增加 Phone 标签,后端由 phone-hookd 守护进程持有 SQLite、对接运营商 webhook,插件本体跑在 dsh-web 内,注册设置页、Agent 工具与 /dsh-phone/api/*。设计上先完整支持 Twilio(README 写明已在真实线路上测试);SIP/中继可通过服务器上的 Asterisk relay 接入,更多运营商选项见仓库文档 docs/PROVIDERS.md、docs/RELAY.md。
核心功能¶
短信与 MMS¶
- 短信线程:收发、送达状态、MMS 图片。
- 分段计数(GSM-7 / Unicode)。
通话¶
- 浏览器内拨号、接听、静音、键盘 DTMF、通话记录。
- Via server(默认):浏览器经 DSH 源站的一条加密 wss 传 G.711 μ-law 音频(约 70 kbit/s 双向),不依赖 Twilio CDN、STUN/TURN;适合 WebRTC 被拦的环境。
- Direct:一键切到 Twilio Voice SDK 的 WebRTC。
- Test audio:不真正拨号即可测网络。
来电策略(一个开关)¶
- Live:本浏览器响铃(可选同时振铃手机,手机需按 1,避免被手机语音信箱抢接);未接进入语音信箱。
- Voicemail:全部进语音信箱;来电说话时可见 实时转写,可 Pick up 热接听(类似 iOS Live Voicemail)。
- Do not disturb:进语音信箱且不响铃、不通知;星标联系人仍可响;可选 SMS 自动回复。
语音信箱与联系人¶
- 问候语(语音或音频文件);录音存于你的服务器;最终转写可走本地 Whisper 端点或 Mistral Voxtral;README 说明录音可从运营商侧删除。
- 联系人:姓名、星标(穿透 DND)、拉黑(拒接)。
Agent 工具¶
模型可通过工具操作电话(发短信或发起语音提醒会先返回 draft,需 confirm: true 才真正执行):
phone_status、phone_set_modephone_sms_threads、phone_sms_thread、phone_sms_sendphone_calls、phone_voicemails、phone_contacts、phone_call_say- 只读诊断:
phone_doctor
配置集中在 DSH Settings > Phone(或标签页齿轮):线路、凭据、webhook、语音信箱、通知、Agent 权限。Apply to Twilio 会创建 API Key 与 TwiML App,并把号码的 voice/SMS webhook 指到你的服务器,随后用清单逐项校验。
架构要点¶
- phone-hookd(
daemon/hookd.mjs):对外127.0.0.1:3098,经反向代理暴露为https://<host>/phone-hook/,Twilio 请求须带有效X-Twilio-Signature;对内 Unix 套接字~/.dsh/phone/hookd.sock(mode 0600),仅插件访问。UI 重启时来电与短信仍可由守护进程处理。 - 插件请求与 dsh-mail / dsh-hpc 相同四类门禁(loopback、同源、短期 capability token、harness session cookie)后再转发到套接字。
安装与启用¶
环境要求(来自 README Install):DSH Web 已装 dsh-better-sidebar;Node 22.5+(node:sqlite);Twilio 账户与带语音+SMS 的号码;可被反向代理到 loopback 的 公网 HTTPS 主机名。
仅安装插件(守护进程已在别处运行时):
dsh plugin --profile web add dsh-better-sidebar # 标签宿主,已装可跳过
dsh plugin --profile web add @lucagiftzek/dsh-phone
# 或:dsh plugin --profile web add github:lucagiftzek/dsh-phone
# 重启 dsh web,再运行 phone-hookd 并按 Install 连接运营商
完整部署还需在本机安装并启用 dsh-phone-hookd(systemd 单元见仓库 deploy/dsh-phone-hookd.service),并把 仅 /phone-hook/ 路由到 127.0.0.1:3098(示例见 deploy/traefik-phone-hook.yml)。开发/自托管场景可用 dsh plugin --profile web add link:$PWD 链接仓库目录(需先在仓库内 npm install && npm run build)。
打开 Settings > Phone:填写 Account SID 与 Auth Token(或 KEY=value 凭据文件,默认 ~/.config/twilio/credentials,键名 TWILIO_ACCOUNT_SID、TWILIO_AUTH_TOKEN),添加线路号码,设置公网 webhook 基址,Save 后 Apply to Twilio,清单变绿后浏览器即可注册振铃。
典型用法¶
- 在 Phone 标签查看短信线程并回复;需要时切换 Live / Voicemail / Do not disturb。
- 默认 Via server 接听;若网络允许且希望直连 Twilio,改用 Direct。
- 在 Agent 对话中调用
phone_sms_send等工具:先确认返回的 draft,再带confirm: true发送。 - 新环境先跑 Test audio,再拨真实号码;异常时用
phone_doctor只读排查。
适用场景与注意¶
适合:已在 DSH Web 上跑 Harness、希望短信/通话与智能体工具同一登录边界内完成,且愿意自建 phone-hookd 与 HTTPS webhook 的开发者或自托管用户。
注意:
- 插件与守护进程以你部署 DSH/Node 时的用户与权限运行;安装前请阅读仓库源码与 LICENSE,并理解 Twilio 与公网 webhook 的安全面(签名校验、仅暴露
/phone-hook/)。 - DSH 社区插件目录(如 skillhub.cn)为独立生态站点,与 DeepSeek / 幻方无官方从属关系;星标与版本以 GitHub / npm 为准(目录页标注星标为 0)。
- SIP、多运营商路线图以 README 与
docs/PROVIDERS.md为准,未在文档写明的能力不要假设已上线。
结尾¶
dsh-phone 把 Twilio(及规划中的 SIP 等)上的短信、浏览器通话、实时语音信箱和一批 phone_* 工具收进 DSH 侧边栏,并把默认通话媒体路径放在你自己的服务器上。进一步了解可查看插件目录页与仓库 README。
- 目录页:https://www.skillhub.cn/plugins/lucagiftzek/dsh-phone
- GitHub:https://github.com/lucagiftzek/dsh-phone