deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
按微信群名决定这条群会话用哪个 Agent 预设(DeepSeek Harness 插件)。只为了一件事:让配好提示词 / 知识库 / MCP 的 Agent 去接某些群的消息,其余全部复用 dsh-wechat-assistant 的逻辑。
dsh plugin --profile web add dsh-wechat-agent-router
装完重启 dsh web,设置里会出现 微信路由 分区。
dsh 0.1.0-rc.7(见 package.json 的 dsh.engines.dsh);Node ^22.19.0 || ^24.0.0。dsh-wechat-assistant:本插件不监听、不收发消息,它只干预「这个群的会话用哪个预设」。
没装微信助手时插件能正常加载,但没有任何群可路由(面板里的群列表会是空的)。lib/client.js 已提交),安装时不需要构建。| 做 | 群名(包含 / 精确)→ Agent 预设 id 的路由;配置界面;把"还没聊过但预设不对"的空白会话补正过来 |
| 不做 | 监听群、读消息、@判定、引用/图片解析、队列串行、按日归档、分片回复、心跳重启、模型选择与配额降级 —— 这些全部仍是 dsh-wechat-assistant 的代码,本插件一行都不改、也不复制 |
所以本插件只有 host 平面 + 一个设置分区,没有任何 preset 平面(它从不进入 Agent 组合,只在 host 干扰"会话用哪个预设"这一个值)。
dsh-wechat-assistant 在创建群会话时点名了一个预设:
// src/bridge.ts(同事的代码,未改动)
unwrap(await ctx.apiProxy.sessions.create(request({
sessionId,
workspaceId: workspace.workspaceId,
agentPreset: 'wechat',
})))
本插件在 host 平面把 apiProxy.sessions.create 这一个方法包一层,按 sessionId 反查群名、算出目标预设、改写 agentPreset 后放行。依据(实测 dsh-host-apiproxy/lib/index.js):
this.sessions = api.sessions),方法可安全替换;sessions.create 的契约写明"同一 sessionId 重试返回同一个会话"(幂等),所以对已存在的会话改写参数不会产生副作用;sessions.list() 的条目带 blank(是否还没跑过 turn)与 agentPreset(当前实际在跑的),所以"该不该补正"是精确判断而不是猜;sessionId = 'wechat-group-' + sha256(群名).slice(0,32)(lib/router.js 里复刻,并有回归测试锁住字面量)。agentPreset.select 仅允许在会话还没跑过 turn 时使用,聊过之后会返回 agent-preset-locked(历史里的工具调用属于旧组合,换掉会让日志自相矛盾)。sessions.create,让新会话从一开始就用对的预设;② 启动后(以及每次保存配置后)扫一遍现有群会话,把 blank === true 且预设不对的补正过来。sessionId。写在 ~/.dsh/settings.yaml 本插件自己的段里(不碰同事的 wechat-assistant 段,只读它的 groups 来知道有哪些群):
wechat-agent-router:
enabled: true # 关闭 = 完全不干预
defaultAgent: '' # 兜底;空串 = 不干预(沿用微信助手原本点名的 wechat)
rules: # 自上而下,第一条命中者生效
- match: 对接 # 群名关键字
mode: contains # contains(默认,不区分大小写)| exact
agent: iot
- match: 群聊总结
mode: exact
agent: archive-agent
界面入口:设置 → 微信路由(与「Agent 管理」并列)。面板里能看每个监听群当前实际用的预设与路由算出的目标,以及是否对得上。
dsh-wechat-assistant 的 Python 端只接受群聊目标(好友会话会直接报「监听目标不是群聊」),候选列表也只给群聊。要支持私信必须改它的传输层。modelProvider/modelName,会覆盖 Agent 预设里的模型设置。想让模型也跟着路由走,需要额外处理。sessionId 方案:群名反查靠复刻的 sha256('wechat-group-'+…)。若上游改了算法,路由匹配不到群 → 自动退化为"不干预"(不会报错,但也不生效);tests/router.test.mjs 用字面量锁住这个值就是为了尽早发现这种漂移。apiProxy 形状变了等)时明确报告而不是静默:日志里会有 会话预设包装未安装:…,面板顶部也会给出提示。npm install # 需要 devDependencies(tsdown / typescript / @types/*)
npm run build # 产出 lib/client.js(已随仓库提交,运行时无需构建)
npm run typecheck
npm test # node --test tests/*.test.mjs
host 半是免构建的 lib/*.js;只有浏览器半需要 tsdown 打包,再由 scripts/wrap-client.ts 包成
DSH 的 window.__ModuleLoader__.load 形状。npm publish 前 prepack 会自动跑一次构建。
插件市场里的列表来自精选列表仓库 awesome-dsh-plugin, 收录方式是往那边提 PR 新增一个条目文件(不是往 dsh-market 提):
contrib/let-mi-think__wechat-agent-router.yml 复制成 data/plugins/let-mi-think__wechat-agent-router.yml(文件名必须与仓库一致);dsh.bundle 且根目录有 cordis.patch.yml(两个都已具备);dsh-plugin topic,并确保仓库创建已满 1 天(CI 会检查);npm 包不是收录的必要条件,但发了才能显示下载量:npm publish 后映射会被自动采集
(条目里不要写 npm: 键,写了会被校验拒绝)。本仓库的 repository 已指向自己,
prepack 会在发布前自动跑一次构建,lib/ 也已随仓库提交,因此从 npm 安装无需构建。
MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。