dsh-phone: Make and Receive Calls and Send/Receive SMS in the DSH Web Sidebar

前言

在 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_mode
  • phone_sms_threads、phone_sms_thread、phone_sms_send
  • phone_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,清单变绿后浏览器即可注册振铃。

典型用法

  1. 在 Phone 标签查看短信线程并回复;需要时切换 Live / Voicemail / Do not disturb。
  2. 默认 Via server 接听;若网络允许且希望直连 Twilio,改用 Direct。
  3. 在 Agent 对话中调用 phone_sms_send 等工具:先确认返回的 draft,再带 confirm: true 发送。
  4. 新环境先跑 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye