开发人员:STU-XIE
dsh-weixin
dsh-weixin 把微信 iLink/ClawBot 私聊接入 DSH agent。插件模式直接使用 DSH apiProxy,独立模式通过 DSH Web HTTP RPC + WebSocket 事件流连接。
功能
- 流式回复按模型分段:单独一行的
---= 新气泡(单/双换行、句子内---不切分),一轮最多 10 条;长度上限按当前气泡累计,空闲超时自动兜底 - 用户每条新消息可打断上一轮仍在生成的回复,最新输入优先处理
- Prompt 定制:system-prompt / soul / rules / memory 四个文件,网页表单编辑即时生效
- 微信“正在输入”状态,任务结束自动关闭
- 长轮询看门狗、指数退避重连和连接状态记录
- 登录约 24 小时到期前生成新二维码,旧 token 在扫码前继续工作
- 图片、语音、视频、文件接收(AES-128-ECB 解密)与文件发送
- 白名单、管理员命令、发送目录边界和 50 MB 媒体上限
- 用户→DSH 会话映射、对话历史、错误日志和单实例锁持久化
- DSH“设置 → 微信”页面,支持状态、扫码、权限、流式参数和定时任务热更新
- 五段 cron 定时提示任务
安装到 DSH
# 可选:默认 DSH_ROOT 为 D:\Program Files\dsh,profile 为 web
$env:DSH_ROOT = 'D:\Program Files\dsh'
$env:DSH_PROFILE = 'web'
npm install
npm run install:dsh
安装脚本调用 DSH 官方 plugin add 逻辑。Windows 上源码路径含空格时,脚本会使用 $DSH_HOME/bundles/dsh-weixin 稳定缓存,避免生成无法解析的 profile 包链接。
cd 'D:\Program Files\dsh'
pnpm dsh --profile web --dump-config
pnpm dsh --profile web
首次启动会打开扫码窗口(独立应用窗口,扫码成功后自动关闭)。登录凭据、会话映射和设置默认持久保存在 $DSH_HOME/channels/dsh-weixin(通常是 ~/.dsh/channels/dsh-weixin),更新或卸载插件不会删除它。
插件模式不输出日志:dsh-weixin 由 DSH 加载时给自身组件注入静默 logger(不动 DSH 自己的
console,因此 DSH 的启动横幅、状态输出等都保持正常);插件自身的收发/扫码日志不打印到 DSH 终端。扫码/续期窗口在 DSH 所在机器上用独立应用窗口弹出,扫码成功后自动关闭。需要完整日志排查时请改用独立模式npm start。
卸载
npm run uninstall:dsh
卸载会从指定 DSH profile 移除 bundle,并清理安装脚本创建的稳定缓存;不删除你的会话数据。
微信命令
/help:查看命令/new:创建并切换到新 DSH 会话/stop:取消当前任务/status:查看连接和会话状态/renew:立即生成扫码续期链接/send <相对路径>:发送outboxDir内的文件/users、/allow add|remove <ID>、/cron:管理员命令
定时任务
在设置页填写 JSON 数组:
[
{
"id": "morning-summary",
"cron": "0 9 * * 1-5",
"userId": "微信用户ID",
"prompt": "总结今天的待办事项",
"enabled": true
}
]
cron 按运行 DSH 的本地时区解析,五个字段依次是分、时、日、月、星期。
独立模式
npm start
默认连接 http://127.0.0.1:3080。配置集中放在 config/.env(参考 config/.env.example,该文件不进入版本库):进程已有的环境变量优先,.env 只补充缺失项;DSH_URL、WX_BOT_CWD、WX_BOT_SESSION_DIR、WX_BOT_PRESET、WX_BOT_ACCESS_POLICY、WX_BOT_ALLOWLIST、WX_BOT_ADMINS、WX_BOT_STREAMING、WX_BOT_TYPING 等均可在其中配置。
WX_BOT_SEND_INTERVAL_MS(默认 200)控制两次微信消息发送的最小间隔(毫秒),用于降低 iLink 发送限流概率;设 0 可关闭节流。
独立模式会在启动微信连接前调用只读 DSH API 检查服务。如果 DSH 未启动、地址错误或端口上不是 DSH,程序会提示先运行 pnpm dsh web 并以退出码 1 结束,不会启动扫码和微信轮询。检测超时默认为 3000 ms,可用 DSH_STARTUP_CHECK_TIMEOUT_MS 调整。
气泡与流式输出
微信一次只显示一条消息气泡。回复由模型按下列契约切成多条气泡:
- 单独一行的
---= 一个气泡结束:模型在输出中用单独占一行、前后带换行的---(等价于\n---\n)主动切气泡,程序把它前面的内容立即作为一条消息发送(分隔符本身不进入微信文案)。单个/双换行只是段落排版,句子中间嵌入的---也只是普通文字,都不会触发切分。此契约写在src/prompt/system-prompt.md,可在设置页修改。 - 一轮最多 10 条气泡:整轮回复分隔出的气泡总数不超过 10 条,内容多时合并、精简,避免触发微信 iLink 发送限流。
- 长度兜底(按当前气泡累计):当前这一个气泡累计超过
streamFlushChars(默认 800 字符)时,在最近的标点/换行处强制切分;每切出一个气泡后从下一个气泡重新计数,不从整条回复头部累计。 - 空闲兜底:模型超过
streamFlushMs(默认 30000 ms)没有新内容时,强制发出当前气泡,避免“没反应”。
Prompt 定制(人设 / 规则 / 记忆)
项目自带默认 prompt 文件:
src/prompt/
system-prompt.md 系统设定与气泡契约
soul.md 人设与灵魂
rules.md 行为规则
memory.md 背景记忆(静态,人工维护)
首次启动会把默认文件复制到频道数据目录(插件模式 $DSH_HOME/channels/dsh-weixin/prompt/,独立模式 session/prompt/),之后在 DSH“设置 → 微信”页面的 Prompt 定制 区编辑这些副本(保存/重置默认),修改对下一条消息即时生效。渲染后的 prompt 会在每次请求前注入给模型,支持 {date} 占位符(当前日期)。
开发验证
npm test
npm run check
No comments yet. Be the first to write one.