dsh-yuanbao
已验证dsh-yuanbao · v0.1.3 · MIT
Yuanbao IM channel plugin for deepseek-harness (dsh)
安装
dsh plugin add dsh-yuanbao 用 dsh --profile default --dump-config 确认 layer 已生效 —— 参见安装指南。
源码
发布到 npm 但没有公开仓库。安装前请检查包内容。
标签
作者
说明文档
dsh-yuanbao
中文 | English
基于 deepseek-harness (dsh) 的元宝 IM 通道插件,将元宝开放平台 WebSocket 消息接入 dsh agent runtime。
架构
元宝用户 → 元宝 WebSocket Gateway → dsh-yuanbao → ctx.agents → dsh agent loop → LLM / Tools
↑ │
└── session/event ──────────┘
assistant reply → 元宝发送接口
dsh-yuanbao 作为 Cordis 插件运行在 deepseek-harness 进程内:
- 入站:元宝 WebSocket push → 元宝消息解码 →
agent.followup() - 出站:监听
session/event→ 聚合assistant/chunk→ 发送元宝 C2C / 群消息 - 状态:通过元宝 heartbeat 发送
RUNNING/FINISH,驱动元宝 loading / 思考气泡
安装
方式一:从 npm registry 安装
# 安装到独立 profile
dsh plugin --profile yuanbao add dsh-yuanbao
# 启动
dsh --profile yuanbao
方式二:本地路径安装
# 构建插件
cd /path/to/dsh-yuanbao
pnpm install
pnpm build
# 安装到 deepseek-harness profile
cd /path/to/deepseek-harness
pnpm dsh plugin --profile yuanbao add /path/to/dsh-yuanbao
# 启动
pnpm dsh --profile yuanbao
如果需要和 Web UI 一起使用,也可以安装到 web profile:
pnpm dsh plugin --profile web add /path/to/dsh-yuanbao
pnpm dsh --profile web
环境变量
推荐在 deepseek-harness 启动目录放置 .env:
YUANBAO_APP_KEY=你的元宝AppKey
YUANBAO_APP_SECRET=你的元宝AppSecret
# 可选:如果已经有预签名 token,可直接配置
YUANBAO_TOKEN=
# 可选:Agent 工作目录
DSH_YUANBAO_CWD=/path/to/workspace
如果使用 DeepSeek 官方模型,还需要:
DEEPSEEK_API_KEY=你的DeepSeek API Key
如果使用 Ollama 本地模型,可在 ~/.dsh/settings.yaml 中配置 agent-default-model 指向 Ollama provider。
模型配置
dsh-yuanbao 默认不直接绑定模型,而是继承 deepseek-harness 的宿主默认模型:
agent-default-model:
provider: <provider-id>
model: <model-id>
模型 provider 通常配置在:
~/.dsh/settings.yaml
如果设置了 DSH_HOME,则配置文件位于:
$DSH_HOME/settings.yaml
OpenAI 示例
在 deepseek-harness 启动目录的 .env 中配置:
OPENAI_API_KEY=你的OpenAI API Key
在 ~/.dsh/settings.yaml 中配置:
llm-pi-ai:
providers:
openai:
displayName: OpenAI
apiKeyEnv: OPENAI_API_KEY
api: openai-completions
baseURL: https://api.openai.com/v1
models:
- id: gpt-4o-mini
name: GPT-4o mini
contextWindow: 128000
maxTokens: 16384
input:
- text
agent-default-model:
provider: openai
model: gpt-4o-mini
Claude 示例
在 deepseek-harness 启动目录的 .env 中配置:
ANTHROPIC_API_KEY=你的Anthropic API Key
在 ~/.dsh/settings.yaml 中配置:
llm-pi-ai:
providers:
anthropic:
displayName: Anthropic
apiKeyEnv: ANTHROPIC_API_KEY
api: anthropic-messages
baseURL: https://api.anthropic.com
models:
- id: claude-3-5-sonnet-20241022
name: Claude 3.5 Sonnet
contextWindow: 200000
maxTokens: 8192
input:
- text
agent-default-model:
provider: anthropic
model: claude-3-5-sonnet-20241022
Ollama 示例
在 deepseek-harness 启动目录的 .env 中配置一个占位 key:
OLLAMA_API_KEY=ollama
在 ~/.dsh/settings.yaml 中配置:
llm-pi-ai:
providers:
ollama:
displayName: Ollama
apiKeyEnv: OLLAMA_API_KEY
api: openai-completions
baseURL: http://127.0.0.1:11434/v1
models:
- id: qwen3.5
name: Qwen3.5
contextWindow: 32768
maxTokens: 4096
input:
- text
agent-default-model:
provider: ollama
model: qwen3.5
也可以在 cordis.patch.yml 中给 dsh-yuanbao 显式指定模型,覆盖宿主默认模型:
- insert:
- id: dsh-yuanbao
name: 'dsh-yuanbao'
config:
provider: openai
model: gpt-4o-mini
配置项
| 配置 | 类型 | 默认值 | 说明 |
|---|---|---|---|
appKey |
string | '' |
元宝 AppKey,默认读取 YUANBAO_APP_KEY |
appSecret |
string | '' |
元宝 AppSecret,默认读取 YUANBAO_APP_SECRET |
token |
string | - | 预签名元宝 WebSocket token,默认读取 YUANBAO_TOKEN |
apiDomain |
string | bot.yuanbao.tencent.com |
元宝开放平台 API 域名 |
wsGatewayUrl |
string | wss://bot-wss.yuanbao.tencent.com/wss/connection |
元宝 WebSocket Gateway 地址 |
routeEnv |
string | - | 元宝路由环境 |
botId |
string | - | 已知元宝 bot id |
provider |
string | - | DSH LLM provider;为空时继承宿主默认模型 |
model |
string | - | DSH model;为空时继承宿主默认模型 |
preset |
string | - | Agent preset id |
cwd |
string | process.cwd() |
Agent 工作目录 |
requireMention |
boolean | true |
群聊是否需要 @bot 才触发 |
directPrompt |
string | - | 私聊额外 system prompt |
groupPrompt |
string | - | 群聊额外 system prompt |
textChunkLimit |
number | 3000 |
单条出站消息最大字符数 |
sessionIdleTimeout |
number | 1800000 |
会话闲置超时,默认 30 分钟 |
processingTimeoutMs |
number | 120000 |
Agent 处理超时 |
maxReconnectAttempts |
number | 100 |
WebSocket 最大重连次数 |
access.c2cMode |
open / allowlist / disabled |
open |
私聊访问控制 |
access.c2cAllow |
string[] | [] |
私聊 allowlist |
access.groupMode |
open / allowlist / disabled |
open |
群聊访问控制 |
access.groupAllow |
string[] | [] |
群聊 allowlist |
debug |
boolean | false |
调试模式 |
默认 bundle patch:
- insert:
- id: dsh-yuanbao
name: 'dsh-yuanbao'
config:
appKey: !!js process.env.YUANBAO_APP_KEY ?? ''
appSecret: !!js process.env.YUANBAO_APP_SECRET ?? ''
token: !!js process.env.YUANBAO_TOKEN ?? ''
cwd: !!js process.env.DSH_YUANBAO_CWD ?? process.cwd()
requireMention: true
textChunkLimit: 3000
sessionIdleTimeout: 1800000
内置命令
| 命令 | 说明 |
|---|---|
/yb-help / /yuanbao-help |
查看所有指令 |
/yb-status / /yuanbao-status |
查看当前会话状态 |
/yb-reset / /yuanbao-reset |
重置当前会话上下文 |
核心模块
src/
├── index.ts # Cordis 插件入口
├── bridge.ts # Gateway / SessionManager / 出入站桥接
├── config.ts # 配置 Schema
├── types.ts # 全局类型定义
├── env-loader.ts # 本地 .env 加载
├── logger.ts # 统一日志入口
├── inbound.ts # 元宝入站消息 → agent.followup()
├── commands.ts # 内置命令
├── gateway/ # 元宝 Gateway 层
│ ├── index.ts # WebSocket 生命周期与 push 分发
│ ├── auth.ts # appKey / appSecret 签票鉴权
│ ├── env.ts # User-Agent / 设备信息
│ └── protocol/ # WebSocket / protobuf 协议编解码
├── session/ # 会话管理层
│ ├── manager.ts # 元宝 peer → dsh Agent 映射
│ └── idle-evictor.ts # 闲置回收
└── transport/ # 出站传输层
├── sender.ts # C2C / 群消息 / heartbeat 发送
├── outbound.ts # session/event → 元宝消息
├── outbound-buffer.ts # 流式输出缓冲
├── heartbeat.ts # loading / 思考气泡心跳控制
└── chunker.ts # 文本切分
会话路由
元宝私聊或群聊会稳定映射到一个 dsh session:
sessionKey = yuanbao:${accountId}:${scope}:${peerId}
sessionId = sha256(sessionKey) 派生
解析策略:
进程内复用 → 持久化恢复 → 全新创建
这样可以保证:
- 同一个元宝私聊用户上下文连续
- 同一个元宝群聊上下文连续
- dsh 重启后可恢复历史 session
- 不直接暴露元宝用户标识
设计原则
- 纯 Cordis 插件 — 不修改 deepseek-harness agent loop
- 通道适配独立 — 元宝协议转换在插件内完成,Agent runtime 仍由 dsh 管理
- 会话隔离 — 每个私聊 / 群聊独立映射 Agent session
- 模型继承 — 默认继承宿主
agent-default-model,也可显式配置provider/model - 流式缓冲 — 聚合
assistant/chunk,避免 IM 侧逐 token 刷屏 - 思考气泡 — 用元宝 heartbeat
RUNNING/FINISH驱动 loading 状态 - 安全默认 — 密钥只从环境变量读取,日志会对 secret / token 等字段脱敏
本地开发
# 安装依赖
pnpm install
# 构建
pnpm build
# watch
pnpm dev
# 本地安装到 dsh profile
cd /path/to/deepseek-harness
pnpm dsh plugin --profile yuanbao add /path/to/dsh-yuanbao
pnpm dsh --profile yuanbao
License
MIT