🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

飞书机器人桥接 AX1202/ax-feishu-bridge

DeepSeek Harnessv0.4.9
AX120267 天前有提交已提供中文文档扫描:含敏感能力需联网notify

飞书/Lark 机器人桥接,同时支持 Pi 和 DeepSeek…

52.7/100
综合分
57
GitHub 星标
183
npm 周下载
—/5
用户评分

数据截至 2026/8/28 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add ax-feishu-bridge
npm 源 · ax-feishu-bridge 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · platform
装得上吗
静态安装检查通过
未做真实安装
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 67 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包ax-feishu-bridge @ 0.4.9
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/30 02:38:47

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 112 处,展示前 110 条)
  • 执行外部命令固定命令
    src/adapters/pi/index.ts:271
    child = spawn("node", [piCliEntry, ...args], {
  • 执行外部命令固定命令
    src/adapters/pi/index.ts:281
    child = spawn("bash", ["-lc", daemonCommand()], {
  • 读取本地文件
    src/adapters/pi/index.ts:414
    if (!existsSync(DEBUG_PI_LOG_PATH)) {
  • 读取本地文件
    src/adapters/pi/index.ts:418
    const lines = readFileSync(DEBUG_PI_LOG_PATH, "utf8").trim().split("\n").slice(-20);
  • 执行外部命令固定命令
    src/adapters/pi/index.ts:546
    const result = spawnSync("ps", ["-wwaxo", "pid=,ppid=,command="], { encoding: "utf8" });
  • 执行外部命令固定命令
    src/adapters/pi/index.ts:578
    const result = spawnSync("ps", ["-wwaxo", "pid=,command="], { encoding: "utf8" });
  • 删除本地文件递归
    src/adapters/pi/index.ts:596
    try { rmSync(lockPath, { recursive: true, force: true }); } catch {}
  • 写入本地文件
    src/adapters/pi/index.ts:608
    mkdirSync(lockPath, { recursive: false });
  • 读取本地文件
    src/adapters/pi/index.ts:612
    const age = Date.now() - statSync(lockPath).mtimeMs;
  • 删除本地文件递归
    src/adapters/pi/index.ts:613
    if (age > 30_000) rmSync(lockPath, { recursive: true, force: true });
  • 写入本地文件
    src/feishu/config.ts:168
    mkdirSync(HARNESS_ROOT, { recursive: true });
  • 写入本地文件
    src/feishu/config.ts:171
    mkdirSync(ROOT_DIR, { recursive: true });
  • 读取本地文件
    src/feishu/config.ts:188
    if (!existsSync(legacyPath) || existsSync(targetPath)) return;
  • 写入本地文件
    src/feishu/config.ts:190
    renameSync(legacyPath, targetPath);
  • 读取本地文件
    src/feishu/config.ts:195
    if (!existsSync(path)) return fallback;
  • 读取本地文件
    src/feishu/config.ts:197
    return JSON.parse(readFileSync(path, "utf8")) as T;
  • 写入本地文件
    src/feishu/config.ts:204
    mkdirSync(dirname(path), { recursive: true });
  • 写入本地文件
    src/feishu/config.ts:205
    writeFileSync(path, `${JSON.stringify(value, null, 2)}\n`, "utf8");
  • 写入本地文件
    src/feishu/config.ts:207
    chmodSync(path, 0o600);
  • 删除本地文件递归
    src/feishu/config.ts:212
    rmSync(path, { recursive: true, force: true });
  • 读取本地文件
    src/feishu/config.ts:311
    if (!existsSync(source.configPath)) return undefined;
  • 写入本地文件
    src/feishu/debug.ts:21
    appendFileSync(path, `${line}\n`, "utf8");
  • 读取本地文件
    src/feishu/debug.ts:29
    const content = readFileSync(path, "utf8");
  • 写入本地文件
    src/feishu/debug.ts:35
    writeFileSync(path, `${recent.join("\n")}\n`, "utf8");
  • 读取本地文件
    src/feishu/gateway-lock.ts:28
    if (existsSync(PI_AGENT_DIR)) return join(PI_AGENT_DIR, "locks.json");
  • 读取本地文件
    src/feishu/gateway-lock.ts:195
    if (!existsSync(LOCKS_PATH)) return {};
  • 读取本地文件
    src/feishu/gateway-lock.ts:196
    return JSON.parse(readFileSync(LOCKS_PATH, "utf8")) as LocksFile;
  • 写入本地文件
    src/feishu/gateway-lock.ts:203
    mkdirSync(dirname(LOCKS_PATH), { recursive: true });
  • 写入本地文件
    src/feishu/gateway-lock.ts:204
    writeFileSync(LOCKS_PATH, `${JSON.stringify(locks, null, 2)}\n`, "utf8");
  • 写入本地文件
    src/feishu/gateway-lock.ts:209
    mkdirSync(dirname(LOCKS_PATH), { recursive: true });
  • 删除本地文件递归
    src/feishu/gateway-lock.ts:216
    try { rmSync(lockPath, { recursive: true, force: true }); } catch {}
  • 写入本地文件
    src/feishu/gateway-lock.ts:228
    mkdirSync(lockPath);
  • 读取本地文件
    src/feishu/gateway-lock.ts:232
    const age = Date.now() - statSync(lockPath).mtimeMs;
  • 删除本地文件递归
    src/feishu/gateway-lock.ts:233
    if (age > LOCK_STALE_MS) rmSync(lockPath, { recursive: true, force: true });
  • 读取本地文件
    src/feishu/runtime-config.ts:114
    if (!existsSync(path)) return {};
  • 读取本地文件
    src/feishu/runtime-config.ts:116
    return JSON.parse(readFileSync(path, "utf8")) as Record<string, unknown>;
  • 写入本地文件
    src/feishu/runtime-config.ts:123
    mkdirSync(dirname(path), { recursive: true });
  • 写入本地文件
    src/feishu/runtime-config.ts:124
    writeFileSync(path, `${JSON.stringify(value, null, 2)}\n`, "utf8");
  • 写入本地文件
    src/feishu/runtime-config.ts:126
    chmodSync(path, 0o600);
  • 发起网络请求
    src/feishu/transport.ts:137
    const res = await this.sdkClient.request({
  • 读取本地文件
    src/adapters/pi/PiConversationRuntime.ts:80
    const raw = readFileSync(settingsPath, "utf-8");
  • 读取本地文件
    src/adapters/pi/PiConversationRuntime.ts:494
    if (existsSync(filePath)) {
  • 读取本地文件
    src/adapters/pi/PiConversationRuntime.ts:495
    const stat = statSync(filePath);
  • 读取本地文件
    src/adapters/pi/PiConversationRuntime.ts:511
    if (sessionFile && existsSync(sessionFile)) {
  • 读取本地文件
    src/adapters/pi/PiConversationRuntime.ts:513
    const currentStat = statSync(sessionFile);
  • 读取本地文件
    src/adapters/pi/PiConversationRuntime.ts:629
    const sessionManager = existingFile && existsSync(existingFile)
  • 读取本地文件
    lib/feishu/gateway-lock.js:25
    if (existsSync(PI_AGENT_DIR))
  • 读取本地文件
    lib/feishu/gateway-lock.js:170
    if (!existsSync(LOCKS_PATH))
  • 读取本地文件
    lib/feishu/gateway-lock.js:172
    return JSON.parse(readFileSync(LOCKS_PATH, "utf8"));
  • 写入本地文件
    lib/feishu/gateway-lock.js:179
    mkdirSync(dirname(LOCKS_PATH), { recursive: true });
  • 写入本地文件
    lib/feishu/gateway-lock.js:180
    writeFileSync(LOCKS_PATH, `${JSON.stringify(locks, null, 2)}\n`, "utf8");
  • 写入本地文件
    lib/feishu/gateway-lock.js:184
    mkdirSync(dirname(LOCKS_PATH), { recursive: true });
  • 删除本地文件递归
    lib/feishu/gateway-lock.js:192
    rmSync(lockPath, { recursive: true, force: true });
  • 写入本地文件
    lib/feishu/gateway-lock.js:204
    mkdirSync(lockPath);
  • 读取本地文件
    lib/feishu/gateway-lock.js:209
    const age = Date.now() - statSync(lockPath).mtimeMs;
  • 删除本地文件递归
    lib/feishu/gateway-lock.js:211
    rmSync(lockPath, { recursive: true, force: true });
  • 写入本地文件
    lib/feishu/config.js:107
    mkdirSync(HARNESS_ROOT, { recursive: true });
  • 写入本地文件
    lib/feishu/config.js:110
    mkdirSync(ROOT_DIR, { recursive: true });
  • 读取本地文件
    lib/feishu/config.js:125
    if (!existsSync(legacyPath) || existsSync(targetPath))
  • 写入本地文件
    lib/feishu/config.js:128
    renameSync(legacyPath, targetPath);
  • 读取本地文件
    lib/feishu/config.js:133
    if (!existsSync(path))
  • 读取本地文件
    lib/feishu/config.js:136
    return JSON.parse(readFileSync(path, "utf8"));
  • 写入本地文件
    lib/feishu/config.js:143
    mkdirSync(dirname(path), { recursive: true });
  • 写入本地文件
    lib/feishu/config.js:144
    writeFileSync(path, `${JSON.stringify(value, null, 2)}\n`, "utf8");
  • 写入本地文件
    lib/feishu/config.js:146
    chmodSync(path, 0o600);
  • 删除本地文件递归
    lib/feishu/config.js:151
    rmSync(path, { recursive: true, force: true });
  • 读取本地文件
    lib/feishu/config.js:249
    if (!existsSync(source.configPath))
  • 写入本地文件
    lib/feishu/debug.js:18
    appendFileSync(path, `${line}\n`, "utf8");
  • 读取本地文件
    lib/feishu/debug.js:26
    const content = readFileSync(path, "utf8");
  • 写入本地文件
    lib/feishu/debug.js:33
    writeFileSync(path, `${recent.join("\n")}\n`, "utf8");
  • 发起网络请求
    lib/feishu/transport.js:121
    const res = await this.sdkClient.request({
  • 读取本地文件
    lib/adapters/harness/feishu-command.js:79
    if (!existsSync(source.debugLogPath)) {
  • 读取本地文件
    lib/adapters/harness/feishu-command.js:82
    const lines = readFileSync(source.debugLogPath, "utf8").trim().split("\n").slice(-20);
  • 读取本地文件
    src/feishu/dedupe-store.ts:93
    if (!existsSync(path)) return {};
  • 读取本地文件
    src/feishu/dedupe-store.ts:94
    return JSON.parse(readFileSync(path, "utf8")) as DedupeStore;
  • 写入本地文件
    src/feishu/dedupe-store.ts:102
    writeFileSync(dedupePath(), `${JSON.stringify(store, null, 2)}\n`, "utf8");
  • 删除本地文件递归
    src/feishu/dedupe-store.ts:122
    try { rmSync(lockPath, { recursive: true, force: true }); } catch {}
  • 写入本地文件
    src/feishu/dedupe-store.ts:134
    mkdirSync(dirname(lockPath), { recursive: true });
  • 写入本地文件
    src/feishu/dedupe-store.ts:135
    mkdirSync(lockPath);
  • 读取本地文件
    src/feishu/dedupe-store.ts:139
    const age = Date.now() - statSync(lockPath).mtimeMs;
  • 删除本地文件递归
    src/feishu/dedupe-store.ts:141
    rmSync(lockPath, { recursive: true, force: true });
  • 读取本地文件
    src/feishu/workspace.ts:28
    if (!existsSync(path)) {
  • 读取本地文件
    src/feishu/workspace.ts:34
    stat = statSync(path);
  • 读取本地文件
    lib/feishu/dedupe-store.js:70
    if (!existsSync(path))
  • 读取本地文件
    lib/feishu/dedupe-store.js:72
    return JSON.parse(readFileSync(path, "utf8"));
  • 写入本地文件
    lib/feishu/dedupe-store.js:80
    writeFileSync(dedupePath(), `${JSON.stringify(store, null, 2)}\n`, "utf8");
  • 删除本地文件递归
    lib/feishu/dedupe-store.js:99
    rmSync(lockPath, { recursive: true, force: true });
  • 写入本地文件
    lib/feishu/dedupe-store.js:111
    mkdirSync(dirname(lockPath), { recursive: true });
  • 写入本地文件
    lib/feishu/dedupe-store.js:112
    mkdirSync(lockPath);
  • 读取本地文件
    lib/feishu/dedupe-store.js:117
    const age = Date.now() - statSync(lockPath).mtimeMs;
  • 删除本地文件递归
    lib/feishu/dedupe-store.js:119
    rmSync(lockPath, { recursive: true, force: true });
  • 读取本地文件
    lib/feishu/runtime-config.js:86
    if (!existsSync(path))
  • 读取本地文件
    lib/feishu/runtime-config.js:89
    return JSON.parse(readFileSync(path, "utf8"));
  • 写入本地文件
    lib/feishu/runtime-config.js:96
    mkdirSync(dirname(path), { recursive: true });
  • 写入本地文件
    lib/feishu/runtime-config.js:97
    writeFileSync(path, `${JSON.stringify(value, null, 2)}\n`, "utf8");
  • 写入本地文件
    lib/feishu/runtime-config.js:99
    chmodSync(path, 0o600);
  • 读取本地文件
    lib/feishu/workspace.js:23
    if (!existsSync(path)) {
  • 读取本地文件
    lib/feishu/workspace.js:28
    stat = statSync(path);
  • 发起网络请求
    src/feishu/cardkit-stream.ts:78
    const res = await fetch(`${this.baseUrl()}/open-apis/auth/v3/tenant_access_token/internal`, {
  • 发起网络请求
    src/feishu/cardkit-stream.ts:105
    const cr = await fetch(`${this.baseUrl()}/open-apis/cardkit/v1/cards`, {
  • 发起网络请求
    src/feishu/cardkit-stream.ts:116
    const sr = await fetch(`${this.baseUrl()}/open-apis/im/v1/messages/${this.replyToMessageId}/reply`, {
  • 发起网络请求
    src/feishu/cardkit-stream.ts:191
    const res = await fetch(
  • 发起网络请求
    src/feishu/cardkit-stream.ts:250
    const settingsRes = await fetch(`${this.baseUrl()}/open-apis/cardkit/v1/cards/${this.cardId}/settings`, {
  • 发起网络请求
    src/feishu/cardkit-stream.ts:279
    const updateRes = await fetch(`${this.baseUrl()}/open-apis/cardkit/v1/cards/${this.cardId}`, {
  • 发起网络请求
    lib/feishu/cardkit-stream.js:51
    const res = await fetch(`${this.baseUrl()}/open-apis/auth/v3/tenant_access_token/internal`, {
  • 发起网络请求
    lib/feishu/cardkit-stream.js:78
    const cr = await fetch(`${this.baseUrl()}/open-apis/cardkit/v1/cards`, {
  • 发起网络请求
    lib/feishu/cardkit-stream.js:88
    const sr = await fetch(`${this.baseUrl()}/open-apis/im/v1/messages/${this.replyToMessageId}/reply`, {
  • 发起网络请求
    lib/feishu/cardkit-stream.js:163
    const res = await fetch(`${this.baseUrl()}/open-apis/cardkit/v1/cards/${this.cardId}/elements/content/content`, {
  • 发起网络请求
    lib/feishu/cardkit-stream.js:221
    const settingsRes = await fetch(`${this.baseUrl()}/open-apis/cardkit/v1/cards/${this.cardId}/settings`, {
  • 发起网络请求
    lib/feishu/cardkit-stream.js:249
    const updateRes = await fetch(`${this.baseUrl()}/open-apis/cardkit/v1/cards/${this.cardId}`, {
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

⚠ 该插件运行需访问外部网络 / 远程 API,部署在国内无外网环境时可能无法正常使用。

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-attachment-local@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-agent-presets@deepseek-ai/dsh-llm@deepseek-ai/dsh-session@deepseek-ai/dsh-session-query
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

1 张 · 点击查看大图

功能亮点

  • 桥接飞书机器人
  • 支持双平台
  • 远程对话编程助手
展开完整介绍(64 字)↓

飞书/Lark 机器人桥接,同时支持 Pi 和 DeepSeek Harness(DSH)双平台,随时随地远程与你的编程助手对话

v0.4.92026-08-27
· 新增特性 · 会话按需热同步:飞书收到消息准备回答前,自动检测电脑终端外部写入,无缝同步最新上下文,无需重启扩展或手动命令。 · 配置保持:热重载时自动继承当前会话的模型(/model)与思考强度(/thinking)配置。 · 架构隔离:改动完全限制在 Pi 适配器内部,对 DSH(Harness)零影响。
v0.4.12026-08-17
· ✨ 新特性 · 双平台支持:同时支持 Pi 和 DeepSeek Harness(DSH)两个平台,一套代码、两边通用 · Pi 与 DSH 插件可并行运行 · 配置文件自动生成在对应平台的文件夹下 · 新增 Web UI 命令 · 🔄 其他变更 · 项目更名为 ax-feishu-bridge
v0.3.02026-08-12
pi-feishu-lark v0.3.0 更新说明 这次是基于 v0.2.4 的一次整体交互与稳定性升级,重点让 Pi 在飞书里的使用更接近日常聊天体验。 · 回复体验升级:消息发送后立即显示“正在回复…”,答案在同一张卡片中流式更新;支持停止、完成和失败状态。 · 会话控制更完整:支持在飞书内查看状态,并新增 /thinking 用于切换当前模型的思考强度。 · 上下文理解升级:回复一条普通消息、富文本或告警卡片时,Pi 会自动读取被回复的原内容,再结合你的追问进行处理。 · 支持交互卡片解析:监控、告警机器人等发送的飞书卡片,现在可以转成 Pi 可理解的文字内容。 · 群聊使用更灵活:支持 @ 触发、关键词触发,以及回复机器人消息后继续追问。 · 配置可在飞书内调整:私聊中使用 /config 即可即时调整群聊触发、流式回复等设置,无需重启。 · 稳定性增强:增加消息去重、接口重试、流式回复失败回退,以及更稳健的后台连接与会话管理。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
ax-feishu-bridge 支持 Deepseek Harness/Pi 接入飞书/Lark 的消息桥接扩展:在熟悉的聊天界面里与本机 DSH/Pi 持续协作。 中文 · English DSH、Pi 飞书交流反馈群:<https://applink.feishu.cn/client/chat/chatter/add_by_link?link_token=57dvecbb-95d3-4d01-b689-6ebc3d17c867> 扩展有什么问题可以加群反馈。 我的媒体平台 关注我第一时间了解最新 AI 工具 全平台账号名称:AX 阿煊 B站:<https://space.bilibili.com/4489397> 主要能力 - 扫码快速创建飞书/Lark 机器人,减少手动配置 - 私聊、群聊、群话题分别维护独立的 Pi 会话 - 支持群聊策略: - open:群里和话题里可直接回复,不需要 @,还需手动在飞书开发者后台开启机器人「获取群组中所有消息」的权限 - mention:只有 @ 机器人、命中关键词或回复机器人消息时才会回复(后两项可选开启) - 支持图片、代码文件和文本文件等附件输入;图片识别取决于当前模型是否支持图片 - 支持解析飞书 interactive 告警卡片;回复一条消息或卡片时,可把原内容一并带给 Pi
展开完整文档(README 剩余 1 节)
ax-feishu-bridge

支持 Deepseek Harness/Pi 接入飞书/Lark 的消息桥接扩展:在熟悉的聊天界面里与本机 DSH/Pi 持续协作。

中文 · English

DSH、Pi 飞书交流反馈群:<https://applink.feishu.cn/client/chat/chatter/add_by_link?link_token=57dvecbb-95d3-4d01-b689-6ebc3d17c867>

扩展有什么问题可以加群反馈。

我的媒体平台 关注我第一时间了解最新 AI 工具

全平台账号名称:AX 阿煊

B站:<https://space.bilibili.com/4489397>

主要能力

- 扫码快速创建飞书/Lark 机器人,减少手动配置
- 私聊、群聊、群话题分别维护独立的 Pi 会话
- 支持群聊策略:
- open:群里和话题里可直接回复,不需要 @,还需手动在飞书开发者后台开启机器人「获取群组中所有消息」的权限
- mention:只有 @ 机器人、命中关键词或回复机器人消息时才会回复(后两项可选开启)
- 支持图片、代码文件和文本文件等附件输入;图片识别取决于当前模型是否支持图片
- 支持解析飞书 interactive 告警卡片;回复一条消息或卡片时,可把原内容一并带给 Pi
- 支持群聊关键词触发、回复机器人消息继续追问
- 支持在飞书内切换当前会话的模型、工作区、历史会话和思考强度
- 收到消息后立即显示「正在回复…」,后续答案在同一张卡片中流式输出;可停止,并会显示完成或失败状态
- 支持渲染显示 Markdown 格式内容
- Pi agent 关闭后,仍有后台常驻服务可以对话,pi agent 无需前台运行。

快速开始

下面的快速开始先介绍 DeepSeek Harness(DSH),Pi 用户可直接跳到 Pi 快速开始。

DeepSeek Harness(DSH)

本扩展同时以 DeepSeek Harness 组合包(bundle)形式分发,飞书机器人的配置和聊天体验与 Pi 一致。

1. 安装

前提:本机已安装 dsh

从 npm 安装

dsh plugin --profile web add ax-feishu-bridge --ignore-scripts

2. 启动与首次配置

安装后重启 dsh,如果没有检测到飞书机器人配置,会自动进入终端配置向导:推荐选择「扫码自动创建飞书助手」,按提示扫描终端里的二维码即可;如果你已经有现成的飞书/Lark 应用,也可以选择手动填写 App ID 和 App Secret。

配置完成后桥接会自动启动并连上飞书/Lark,之后每次启动 dsh 也会自动连接。

DSH 使用独立的配置文件 ~/.dsh/feishu/config.harness.json(存放在 dsh 自己的家目录下),与 Pi 的配置互不干扰,两边可以同时安装、共存。

3. 在飞书里互动

- 私聊:直接发消息
- 群聊:根据群聊策略决定是否需要 @ 机器人
- 话题:每个话题会独立对应一个会话

群聊策略设为 open 后,想要不 @ 机器人就能回复任何群内消息,还需要到飞书开发者后台 - 对应机器人事件与回调 - 打开「获取群组中所有消息」或「获取群组中用户和机器人发送的消息」这两个任意一个权限。
图片说明

/new、/resume、/model、/thinking、/stop、/workspace、/status、/config 等聊天内命令同样可用,完整列表见下文「飞书里怎么用」。

两点区别需要注意:

- DSH 的 /feishu 管理命令是精简版:提供 setup / status / autostart / debug / reset,没有 start / stop / restart——桥接随 dsh 自动启停,由配置里的 autoStart 控制。
- DSH 的环境变量前缀是 HARNESS_(例如 HARNESS_APP_ID),而不是 Pi 的 FEISHU_;卡片回调端口默认也不同——Pi 默认 3001,DSH 默认 3002,两边同时启用也不会冲突。

Pi

1. 安装

pi install npm:ax-feishu-bridge

也可以从 Git 安装:

pi install git:github.com/AX1202/ax-feishu-bridge

2. 初始化配置

在 Pi 里运行:

/feishu setup

推荐选择「扫码自动创建飞书助手」,按提示扫描终端里的二维码即可。

如果你已经有现成的飞书/Lark 应用,也可以选择手动填写 App ID 和 App Secret。

3. 启动桥接

/feishu start

如果开启了自动启动,Pi 会话启动时会自动连上飞书/Lark。

4. 开始聊天

在飞书/Lark 里打开机器人,直接发消息即可。

- 私聊:直接发消息
- 群聊:根据群聊策略决定是否需要 @ 机器人
- 话题:每个话题会独立对应一个 Pi 会话

群聊策略设为 open 后,想要不 @ 机器人就能回复任何群内消息,还需要到飞书开发者后台 - 对应机器人事件与回调 - 打开「获取群组中所有消息」或「获取群组中用户和机器人发送的消息」这两个任意一个权限。

Windows 上运行 Pi Agent 飞书插件配置方法

解决方法

1. 先安装 Git for Windows

安装后一般会有这个文件:

C:\Program Files\Git\bin\bash.exe

这个就是 Windows 上给 Pi 使用的 Bash 环境。

2. 配置 Pi 的 settings.json

打开:

C:\Users\你的用户名\.pi\agent\settings.json

在大括号里加这一行:

"shellPath": "C:\\Program Files\\Git\\bin\\bash.exe"
注意:如果你原来文件里还有其他配置,不要删掉,只加这一行即可。

这个配置主要是告诉 Pi 主程序 使用哪个 Bash。

3. 把 Git Bash 加到 Windows PATH

有些插件会直接调用:

bash

它不一定读取 Pi 的 shellPath 配置,所以还需要把 Git Bash 加到系统 PATH。

在 PowerShell 里执行:

[Environment]::SetEnvironmentVariable(
"Path",
[Environment]::GetEnvironmentVariable("Path", "User") + ";C:\Program Files\Git\bin",
"User"
)

4. 重启 PowerShell

执行完上面的命令后,要关闭 PowerShell,再重新打开。

然后验证:

where.exe bash

如果输出:

C:\Program Files\Git\bin\bash.exe

说明修复成功。

5. 再运行 Pi

pi

总结

最稳的配置是两个都做:

settings.json 配置 shellPath + Windows PATH 加入 C:\Program Files\Git\bin

前者给 Pi 主程序用,后者给插件或子进程直接调用 bash 用。

飞书里怎么用

发送给机器人的常用命令:

| 命令 | 作用 |
| /new | 为当前会话新建一个 Pi 会话 |
| /resume | 打开当前工作区的历史会话列表;可在卡片中切到全部会话 |
| /model | 打开模型选择卡片,切换当前会话使用的模型 |
| /thinking | 打开思考强度选择卡片,切换当前模型实际支持的档位 |
| /stop | 停止当前这条回复的处理 |
| /workspace | 查看当前会话绑定的工作区 |
| /workspace /path/to/project | 把当前会话切换到指定工作区,下一条消息生效 |
| /status | 查看当前会话的工作状态、模型、思考强度和上下文占用 |
| /commands | 查看机器人支持的全部命令 |
| /config | 查看运行时配置(仅限与机器人的私聊) |
| /config groupKeywords 关键词1,关键词2 | 设置群聊关键词触发并立即生效 |
| /config streamingReply false | 关闭流式展示,改用普通回复卡片 |
| /config clear groupKeywords | 清除某项运行时配置覆盖 |

Pi 里怎么管理

| 命令 | 作用 |
| /feishu setup | 打开初始化配置 |
| /feishu start | 启动飞书桥接 |
| /feishu stop | 停止飞书桥接 |
| /feishu restart | 重启桥接,并重新加载最新代码和配置 |
| /feishu status | 查看连接状态、当前 owner 和配置 |
| /feishu autostart | 开关自动启动 |
| /feishu debug | 查看最近 20 条调试日志 |
| /feishu reset | 清除配置和映射,但保留会话历史 |

DSH 里怎么管理

在 DSH 的 web 输入框或终端里输入(依赖宿主 DSH 的命令能力;宿主未提供时会静默跳过,不影响桥接本身):

| 命令 | 作用 |
| /feishu setup | 重新配置机器人;问答与二维码在 DSH 进程所在终端进行,已有配置时先确认覆盖 |
| /feishu status | 查看连接状态、当前 owner 和配置 |
| /feishu autostart | 开关自动启动 |
| /feishu debug | 查看最近 20 条调试日志 |
| /feishu reset confirm | 清除配置和映射,但保留会话历史 |

与 Pi 的区别:DSH 不提供 /feishu start | stop | restart——桥接随 dsh 自动启停,setup / reset 之后把插件重启 dsh,新配置即可生效。

注意(DSH 平台限制):命令结果以可折叠的命令节点显示在对话流里,但空白的全新会话不渲染命令记录——如果敲了命令没看到任何反应,先在该会话里发一条普通消息,再执行命令即可。setup 不受影响(问答与二维码在终端)。

配置

配置默认保存在:

~/.pi/agent/feishu/config.json

也可以通过环境变量配置:

| 变量 | 说明 |
| FEISHU_APP_ID | 飞书/Lark 应用 ID |
| FEISHU_APP_SECRET | 飞书/Lark 应用密钥 |
| FEISHU_DOMAIN | feishu 或 lark,默认 feishu |
| FEISHU_GROUP_POLICY | open 或 mention,默认 open |
| FEISHU_GROUP_KEYWORDS | 群聊关键词,逗号或分号分隔;命中后无需 @ |
| FEISHU_GROUP_ALSO_ON_REPLY | 1 时回复机器人消息可继续追问,无需再次 @ |
| FEISHU_IGNORE_BOT_MESSAGES | 是否忽略其他机器人消息,默认 true |
| FEISHU_LANGUAGE | zh 或 en |
| FEISHU_REACT_EMOJI | 收到消息时的表情回应,默认 Get |
| FEISHU_AUTO_START | 1 或 0 |
| FEISHU_CARD_ACTION_MODE | webhook 或 ws,默认 webhook |
| FEISHU_CARD_ACTION_WEBHOOK_HOST | 卡片回调监听地址,默认 0.0.0.0 |
| FEISHU_CARD_ACTION_WEBHOOK_PORT | 卡片回调端口,默认 3001(DSH 用 HARNESS_CARD_ACTION_WEBHOOK_PORT,默认 3002) |
| FEISHU_CARD_ACTION_WEBHOOK_PATH | 卡片回调路径,默认 /webhook/card |
| FEISHU_PROMPT_NOTIFY_SEC | 长任务超过多少秒后在飞书发一条“仍在处理中”提示,默认 180,0 关闭 |
| FEISHU_PROMPT_TIMEOUT_SEC | 任务硬超时秒数,超时后中止任务并报失败,默认 0(不设硬超时,长期运行也不会被报失败) |
| FEISHU_PARSE_INTERACTIVE_CARDS | 是否把 interactive 卡片转为 Pi 可读文字,默认 true |
| FEISHU_INCLUDE_QUOTED_MESSAGE | 回复/引用消息时是否带入原消息内容,默认 true |
| FEISHU_QUOTED_MESSAGE_MAX_CHARS | 引用消息最多带入的字符数,默认 8000 |
| FEISHU_SEND_MAX_RETRIES | 飞书接口临时失败时的重试次数,默认 2 |
| FEISHU_STREAMING_REPLY | 是否启用 CardKit 单卡流式回复,默认 true |
| FEISHU_STREAM_PRINT_FREQUENCY_MS | 流式逐字显示的刷新间隔,默认 50 |
| FEISHU_STREAM_PRINT_STEP | 每次显示的字符数,默认 1 |
| FEISHU_STREAM_PUSH_INTERVAL_MS | 向飞书推送最新正文的间隔,默认 120 毫秒 |
| FEISHU_EXT_DEV | 1 时显示本地开发标识 DEV |

config.json 字段

除了上面的环境变量,也可以在 config.json 里设置(优先级:环境变量 > config.json > 默认值):

| 字段 | 说明 |
| promptNotifySec | 长任务超过多少秒后在飞书发一条“仍在处理中”提示,默认 180,0 关闭 |
| promptTimeoutSec | 任务硬超时秒数,超时后中止任务并报失败,默认 0(不设硬超时,长期运行也不会被报失败) |

注意:长时间任务(例如跑测试、构建、批量处理)默认不会再被报为“任务失败”——到达 promptNotifySec 后只会在飞书里提示“任务仍在处理中”,回复卡片保持“回复中”,完成后正常送达结果。只有显式设置 promptTimeoutSec 后才会硬超时。修改后请执行 /feishu restart 生效。

运行时配置

以下桥接设置可以在与机器人的私聊里用 /config 立即修改,无需重启,并保存到各自平台数据目录下的 runtime-overrides.json(Pi 为 ~/.pi/agent/feishu/,DSH 为 ~/.dsh/feishu/):

/config
/config groupKeywords 报警,告警 /config groupAlsoOnReply true /config streamingReply false /config clear groupKeywords /config clear all

可热更新的范围仅包括 groupPolicy、groupKeywords、groupAlsoOnReply、ignoreBotMessages、reactEmoji、language 以及流式展示参数;应用凭证、引用消息展开和连接方式不能通过聊天修改。

会保存哪些文件

| 路径 | 内容 |
| ~/.pi/agent/feishu/config.json | 机器人凭证和基础配置 |
| ~/.pi/agent/feishu/runtime-overrides.json | 通过私聊 /config 保存的运行时配置覆盖 |
| ~/.pi/agent/feishu/state.json | 飞书会话和 Pi 会话的映射 |
| ~/.pi/agent/feishu/bridge.json | 从飞书发起的 Pi 任务路由信息 |
| ~/.pi/agent/feishu/debug.log | 调试日志 |
| ~/.pi/agent/locks.json | 当前飞书连接的 owner 锁 |
| ~/.pi/agent/sessions/ | 每个飞书会话对应的 Pi 会话文件 |
| ~/.dsh/feishu/ | DSH 侧的配置、状态与日志(仅安装 DSH 时产生;未装 Pi 的机器不会创建 ~/.pi) |

连接锁选址:机器上装有 Pi(存在 ~/.pi/agent 目录)时沿用 ~/.pi/agent/locks.json,保证两边能协商同一个机器人的连接;纯 DSH 环境则使用 ~/.dsh/locks.json。

常见说明

- 图片能不能被识别,取决于当前选中的模型是否支持图片输入。
- 图片、文本/代码文件输入是已有能力;interactive 卡片解析和回复消息上下文展开是新版补充的能力。
- 对一条消息或卡片点“回复”后,Pi 会看到原消息内容和你的新问题;这不是把原消息再次发送到群里。
- /feishu reset 只会清掉配置和映射,不会删除会话历史。
- 从 TUI、CLI 或其他渠道创建的任务,不会主动发到飞书。
- /workspace 当前只支持绝对路径,或 ~/ 开头的路径。
- /resume 默认先显示当前项目的最近历史会话,也可以在卡片里切到“全部会话”并翻页浏览。
- 卡片按钮现在优先走 webhook 回包模式;如果你还想临时沿用旧的 WS 更新方式,可以把 FEISHU_CARD_ACTION_MODE 设成 ws。
- 卡片回调默认监听 0.0.0.0:3001/webhook/card(Pi)/ 0.0.0.0:3002/webhook/card(DSH),需要在飞书开发者后台把交互卡片回调地址指到一个外部可访问的 URL。

常见问题

为什么机器人没回复?

先看三件事:

- 飞书机器人是否已经创建并配置好
- /feishu start 是否已经运行
- 群聊策略是否要求 @ 机器人

为什么我在群里发了消息,机器人没有理我?

如果你把群聊策略设成了 mention,就需要 @ 机器人后它才会回复。\
open模式下:群里和话题里可直接回复,不需要 @,但还需手动在飞书开发者后台开启机器人“获取群组中所有消息”权限才能生效。

还没有实现后台服务开机自启动功能,目前需要电脑开机后手动启动一次 Pi agent 才能正常工作。启动后,Pi agent 无需前台运行,关闭后,仍可以在飞书/Lark 里对话。
预览分享卡片长什么样 ↓AX1202/ax-feishu-bridge
分享 · DeepSeek Harness Hub
AX1202/ax-feishu-bridge

飞书/Lark 机器人桥接,同时支持 Pi 和 DeepSeek…

回到顶部