voyager
Nagi-ovo
Enhancement suite for Gemini, AI Studio, Claude & ChatGPT — plus a prompt manager for any web UI, DeepSeek Harness included. / 面向 Gemini、AI Studio、Claude 与 ChatGPT 的增强套件;提示词管理器可用于任意 Web UI,含 DeepSeek Harness。
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:ailoushu666/dsh-feishu-bridge
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
把飞书机器人接入 DeepSeek Harness(DSH) 的桥接插件。
在飞书里跟机器人对话,消息会被转成 DSH Agent 的一次任务;Agent 的最终回答和执行过程提示(例如调用了哪些工具)都会回到飞书里显示。
English: README.en.md
@larksuiteoapi/node-sdk 的 WebSocket 长连接接收事件,无需公网 IP / 域名 / 内网穿透。🔧 调用工具 <名称> 的过程提示。在飞书里直接发(群聊里 @机器人,单聊直接发),大小写不敏感。
| 命令 | 参数 | 作用 | 是否打断当前对话 |
|---|---|---|---|
/reset |
— | 开启新对话(旧对话保留在 DSH 侧边栏)。别名:/new、/clear、重置、新会话、清空会话、重置会话 |
是 |
/compact |
— | 压缩上下文(把较早历史总结成摘要,降低 token 占用)。别名:/压缩、压缩上下文、压缩会话 |
否 |
/workspace |
<目录绝对路径> |
切换项目目录(目录不存在会提示,需先在本地创建) | 是 |
/mode(= /permission) |
<read\|write\|full> |
切换工作模式:只读 / 工作区写入 / 完整访问(即权限预设,含沙箱 + 审批策略) | 否(仅本会话生效) |
/model |
<模型名> |
切换模型(不支持的模型名会提示) | 否(下一轮生效) |
/effort |
<off\|high\|max> |
设置推理强度(只允许模型实际支持的档位) | 否(下一轮生效) |
/stop |
— | 立即停止当前正在运行的任务。别名:/cancel、/halt |
— |
/feedback |
<反馈内容> |
记录对当前会话的反馈 | 否 |
/goal |
[目标\|clear\|edit <目标>\|pause\|resume] |
设置 / 查看 / 管理长任务目标 | 否 |
/plan |
[off\|描述] |
进入 / 退出计划模式(先规划再动手) | 否 |
/export |
— | 导出会话日志(网页端功能,飞书文字通道无法下发文件,会提示到网页端操作) | — |
/session |
[编号\|完整ID] |
不带参数列出未归档会话(含标题),带参数切换到指定会话 | 是(切换会话) |
/help |
— | 列出全部命令 | — |
不带参数时,/workspace、/mode、/model、/effort 会返回当前值或可选项;/mode 的短名 read / write / full 分别对应 read-only / workspace-write / danger-full-access,全名同样可用。
^22.19.0 或 >= 24(与 Harness 一致)。dsh web)。im.message.receive_v1、开通必要权限。飞书后台的完整配置步骤见 docs/feishu-setup.md。
按 docs/feishu-setup.md 完成:创建自建应用 → 启用机器人能力 → 开通权限 → 配置长连接订阅 im.message.receive_v1 → 发布并安装应用。记下 App ID 和 App Secret。
web Profilenpx @deepseek-ai/dsh plugin --profile web add "<本项目目录>"
安装后,插件会在 bundle 层创建一个默认禁用的 feishu-bridge 实例。
App ID(非敏感)和 App Secret(敏感)分开存放:
把 App Secret 写进 DSH 的凭据文件 ~/.dsh/.credentials.yaml(Windows:C:\Users\<你>\.dsh\.credentials.yaml),键名与 appSecretEnv 一致(默认 FEISHU_APP_SECRET):
FEISHU_APP_SECRET: <你的 App Secret>
编辑 Profile 补丁 ~/.dsh/profiles/web/cordis.patch.yml(Windows:C:\Users\<你>\.dsh\profiles\web\cordis.patch.yml),用同样的 id 覆盖为启用并填入 App ID:
- id: feishu-bridge
disabled: false
config:
appId: cli_xxxxxxxxxxxxxxxx # App ID(非敏感)
appSecretEnv: FEISHU_APP_SECRET # App Secret 的引用名,值在 ~/.dsh/.credentials.yaml
domain: feishu # 中国版 feishu;国际版 Lark 用 lark
requireMention: true # 群聊需要 @机器人
dmMode: open # 单聊:open / allowlist / disabled
不要用
insert再创建一个同名实例,否则会报duplicate loader entry id: feishu-bridge。
npx @deepseek-ai/dsh web
看到下面这行表示飞书长连接建立成功:
feishu-bridge: WebSocket connected
@机器人 你的问题。/help 查看完整命令列表。| 内容 | 文件 |
|---|---|
| 启用实例 + 插件配置 | ~/.dsh/profiles/web/cordis.patch.yml(Windows:C:\Users\<你>\.dsh\profiles\web\cordis.patch.yml) |
| App Secret(凭据) | ~/.dsh/.credentials.yaml(Windows:C:\Users\<你>\.dsh\.credentials.yaml) |
| 配置项 | 必填 | 默认值 | 说明 |
|---|---|---|---|
appId |
是 | 无 | 飞书应用 App ID(非敏感,直接写明文) |
appSecretEnv |
是 | FEISHU_APP_SECRET |
App Secret 的凭据引用名,真正的值在 ~/.dsh/.credentials.yaml |
domain |
否 | feishu |
feishu(中国版)/ lark(国际版) |
requireMention |
否 | true |
群聊是否必须 @机器人 |
dmMode |
否 | open |
单聊策略:open / allowlist / disabled |
groupAllowlist |
否 | [] |
群 chat_id 白名单,空 = 不限制 |
dmAllowlist |
否 | [] |
dmMode: allowlist 时允许的用户 open_id |
botOpenId |
否 | 无 | 机器人 open_id,用于精确判断“是否 @机器人”;不填则退化为“mentions 非空” |
provider / model |
否 | Harness 默认 | 为飞书渠道单独指定模型 |
reasoningEffort |
否 | 模型默认 | 为飞书渠道指定推理强度(如 off/high/max,取决于模型支持) |
workspace |
否 | 第一个 Workspace | Agent 的工作目录 |
agentPreset |
否 | 默认 Preset | Agent 使用的 Preset(决定工具/系统提示组合) |
streamProgress |
否 | true |
是否把执行过程(工具调用)回传飞书 |
maxProgressMessages |
否 | 10 |
单个 turn 内最多回传多少条过程消息 |
resetCommand |
否 | /reset |
重置会话的指令 |
compactCommand |
否 | /compact |
手动压缩上下文的指令 |
requireAdminForGroupReset |
否 | true |
群聊重置是否要求群主/管理员(需 im:chat:readonly 权限;设为 false 则群成员也能重置) |
errorMessage |
否 | 内置中文提示 | Agent 出错时返回给用户的统一提示(最长 500 字符) |
完整示例:
- id: feishu-bridge
disabled: false
config:
appId: cli_xxxxxxxxxxxxxxxx
appSecretEnv: FEISHU_APP_SECRET
domain: feishu
requireMention: true
dmMode: open
# 可选:
provider: deepseek-official
model: deepseek-v4-flash
reasoningEffort: high
workspace: C:\Project\my-repo
agentPreset: coding
streamProgress: true
maxProgressMessages: 10
默认配置(单聊 + 群聊 @机器人 + 回复)需要以下权限,详细步骤见 docs/feishu-setup.md:
| 权限标识 | 用途 | 是否必需 |
|---|---|---|
im:message.p2p_msg:readonly |
获取单聊消息 | 是 |
im:message.group_at_msg:readonly |
获取群组中 @机器人的消息 | 是 |
im:message:send_as_bot |
以应用身份发消息(回复) | 是 |
im:chat:readonly |
读取群信息(判断群主/管理员) | 仅群聊 /reset 需管理员权限时 |
事件订阅:接收方式选长连接,订阅 im.message.receive_v1。
dsh-feishu-bridge/
├── package.json # 包元数据 + dsh.bundle 声明
├── cordis.patch.yml # bundle patch:默认禁用的插件实例
├── lib/
│ ├── index.js # 插件入口(name/inject/Config/apply + 命令分发)
│ ├── config.js # 配置 Schema + 校验
│ ├── feishu.js # 飞书长连接 + 发消息/回复
│ └── bridge.js # 会话映射 + Agent 驱动 + 渠道状态 + 命令执行
├── docs/
│ ├── technical.md # 技术文档
│ └── feishu-setup.md # 飞书开发者后台配置指南
└── .env.example # 说明凭据存放位置(实际部署无需 .env)
~/.dsh/.credentials.yaml 里,插件不记录、不落盘到项目目录。errorMessage,不把异常堆栈 / 敏感信息发给飞书用户。chat_id / thread_id。chatId → sessionId 映射:DSH 重启后,已有飞书聊天会重建新 Session(旧 Session 仍在磁盘,但不再被复用)。/export(导出 ZIP)是 DSH 网页端能力,飞书文字通道无法下发文件。| 现象 | 排查 |
|---|---|
| 启动时鉴权失败 | App ID / Secret 是否同属一个应用;FEISHU_APP_SECRET 是否写进了 ~/.dsh/.credentials.yaml |
| 显示已连接但收不到消息 | 应用是否发布并安装;机器人是否在群里;是否订阅 im.message.receive_v1;接收方式是否长连接;权限是否已通过审批;群聊是否 @机器人 |
| 能收到但不能回复 | 是否开通 im:message:send_as_bot;查看终端里的飞书 API 报错 |
| 长连接反复重连 | 检查能否访问飞书 HTTPS/WebSocket;是否同时跑了多个长连接消费者 |
| 改了配置不生效 | 停止并重启 Harness(实例在 Profile 启动时创建) |
群聊 /reset 提示“只有群主或群管理员” |
要么开通 im:chat:readonly 权限,要么配置 requireAdminForGroupReset: false |
| 连续对话偶发“没反应” | 多为 DeepSeek API 速率/并发限制(TPM/RPM);稍等重试,或用 /effort off 降低推理开销 |
npx @deepseek-ai/dsh plugin --profile web remove dsh-feishu-bridge
然后清掉 ~/.dsh/profiles/web/cordis.patch.yml 里残留的 feishu-bridge 配置。
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: feishu、lark。