fix(tools): 清除 36 条无法注册的飞书工具声明,未注册告警 20→0

根因(实测两层):
- tools.alsoAllow 声明 37 个 feishu_* 工具,仅 feishu_chat 能注册
- 其余 36 个由 @larksuite/openclaw-lark 提供,而该插件无法加载:
  require("openclaw/plugin-sdk") 在 openclaw 2026.9.4 的 exports 中不存在
  (只有 ./plugin-sdk/core 等子路径);插件版本 2026.6.10 落后一个大版本

关键对照: @openclaw/feishu 2026.9.4 已装且 loaded,提供 14 个飞书工具
(doc/wiki/drive/perm/bitable),能力无损失 —— 无需依赖 lark 插件

处置:
- tools.alsoAllow: 37 条 -> 1 条(feishu_chat)
- plugins.entries.openclaw-lark.enabled 保持 false(曾置 true 验证失败后回退)
- 重启验证: 未注册告警 0、插件加载失败 0、feishu 14 工具全在、飞书渠道正常
- 文档补充"渠道层 vs 工具层"辨析:这也解释了为何手机飞书交互一直正常
This commit is contained in:
yangxuan
2026-09-16 16:36:40 +08:00
parent 94720f78cc
commit 0865090a2b
2 changed files with 48 additions and 60 deletions
+47 -23
View File
@@ -222,44 +222,66 @@ openclaw models list --provider deepseek
| 手段 | 动作 | 预期 |
|---|---|---|
| 收敛工具集 | 让高频 agent 少暴露「用不上」的工具(当前 `tools.profile=full`;本机 `tools.allow` 未设置`tools.alsoAllow` 有 37 条——**其中 36 条无效声明**,见下方告警说明) | 模型少做无效试探,轮次下降(⚠️ 需实测,见 §5) |
| 收敛工具集 | 让高频 agent 少暴露「用不上」的工具(当前 `tools.profile=full`;本机 `tools.allow` 未设置`tools.alsoAllow` 仅剩 `feishu_chat`——**36 条无效声明已于 16:35 清除**,见下方说明) | 模型少做无效试探,轮次下降(⚠️ 需实测,见 §5) |
| 提升单轮信息密度 | 在 agent 的 `AGENTS.md` 中要求「一次调用批量取证」:合并多次 `read`/`memory_search` 为一次 | 显著减少往返 |
| 并行取证 | 把可并行的只读操作交给 `subagents`(当前 `subagents.maxConcurrent=4` | 串行改并行 |
| 技能不必现装现用 | 需要什么技能**提前装好**,避免在对话中触发 ClawHub 审计+安装(实测单次 13.5–14s) | 消除最大单点等待 |
> ⚠️ **有 36 个「声明了却不存在」的工具**2026-09-16 复核,**告警仍在持续**:当天 20 次,最后一次 16:27:34):
> `tools.profile (full) allowlist contains unknown entries` 与 `tools.allow allowlist contains unknown entries` 各 10 次,报的全是 `feishu_bitable_*` / `feishu_calendar_*` / `feishu_task_*` 等。
> ⚠️ **有 36 个「声明了却不存在」的工具 → 已于 2026-09-16 16:35 修复,两条告警均清零**(详见下方"处置结果")。
**根因定位(实测)**本机 `tools.alsoAllow` 声明了 **37 个** `feishu_*` 工具,但只有 **1 个真正注册成功**
**问题的样子**`tools.profile (full) allowlist contains unknown entries``tools.allow allowlist contains unknown entries` 各 10 次(当天累计 20 次,最后一次 16:27:34),报的全是 `feishu_bitable_*` / `feishu_calendar_*` / `feishu_task_*` 等。
#### 根因(实测,两层)
**第一层**`tools.alsoAllow` 声明了 **37 个** `feishu_*` 工具,但只有 **1 个**`feishu_chat`,由 `@openclaw/feishu` 提供)能注册——其余 **36 个属于另一个插件** `@larksuite/openclaw-lark`
**第二层(真因)**`openclaw-lark` **根本加载不了**——它 `require("openclaw/plugin-sdk")`,而 openclaw 2026.9.4 的 `package.json#exports` 里**只有 `./plugin-sdk/core``./plugin-sdk/setup` 等子路径,没有裸的 `./plugin-sdk`**
```
alsoAllow 声明 37 个 ─┬─ ✅ 成功注册: feishu_chat feishu 插件提供,enabled: true
└─ ❌ 注册失败: 其余 36 个 ← openclaw-lark 插件提供
$ openclaw-lark failed to load from ~/.openclaw/extensions/openclaw-lark/index.js:
Error: Cannot find module 'openclaw/plugin-sdk'
$ 插件版本: 2026.6.10(升级前的旧版;npm 上最新仅 2026.7.16
```
`openclaw-lark` 在配置里被**显式关闭**了:
**这不是配置问题,是版本不兼容**——该插件用了已不存在的模块路径,且其最新版仍落后主流 `openclaw` 一个大版本。
```json5
"plugins": { "entries": {
"feishu": { "enabled": true }, // 只提供 feishu_chat
"openclaw-lark": { "enabled": false } // 36 个 feishu_* 工具的真正提供者 → 未加载
}}
#### 关键对照:你要的能力其实已经有了
`@openclaw/feishu` 已经装好并在跑(`status: loaded``trusted-official`),它提供 **14 个**飞书工具(`tools.profile=full` 下全部可用):
```
feishu_doc feishu_wiki feishu_drive feishu_perm feishu_chat feishu_app_scopes
feishu_bitable_get_meta feishu_bitable_list_fields feishu_bitable_list_records
feishu_bitable_get_record feishu_bitable_create_record feishu_bitable_update_record
feishu_bitable_create_app feishu_bitable_create_field
```
验证:`grep "http server listening" 日志` → 实际只加载 **6 个插件**dingtalk-connector, feishu, memory-core, ollama, openclaw-weixin, searxng),**不含 openclaw-lark**。
**影响**`alsoAllow` 里那 36 条是**无效声明**——它们不报错,但也不生效;模型可能尝试调用不存在的工具而浪费一轮往返。
**两个互斥的修法(需决策,不建议同时做)**
| 方案 | 做法 | 代价 |
| | `@larksuite/openclaw-lark`(坏) | `@openclaw/feishu`(在用) |
|---|---|---|
| **A. 精简声明**(推荐,契合 P0-2 | 从 `tools.alsoAllow` 删掉用不上的 `feishu_*` 条目 | 需先确认哪些飞书能力**真的要用** |
| **B. 启用插件** | `plugins.entries.openclaw-lark.enabled = true` | 真实注册 36 个工具,**工具面大幅变大**,可能反增轮次与上下文开销;且 lark 插件需飞书应用凭据/oauth 流程 |
| 版本 | 2026.6.10(最新 2026.7.16 | **2026.9.4**`peerDeps: openclaw>=2026.9.4` |
| 加载 | **失败**`openclaw/plugin-sdk` 不存在) | 正常 |
| 工具 | 38 个细粒度(calendar / task / im / oauth / sheet…) | **14 个**doc / wiki / drive / perm / bitable),用 `_create`/`_list` 动词对内部再做复合操作 |
| 适配 | 落后一个大版本 | 与 openclaw 同步 |
> 复核命令(注意:告警**不是**历史遗留,会随每次配置重载/插件加载重现):
#### 处置结果(2026-09-16 16:35 已完成)
| 动作 | 结果 |
|---|---|
| 从 `tools.alsoAllow` 删除 36 条 lark 专属声明(保留 `feishu_chat` | 未注册告警 **20 次/天 → 0** |
| `plugins.entries.openclaw-lark.enabled` 保持 **false** | 消除 `failed to load` 报错(曾尝试置 true 验证:确认失败后回退) |
| 复查 `@openclaw/feishu` | `status: loaded`、**14 个工具全在**,能力无损失 |
| 复查飞书渠道 | WebSocket 正常连接,**手机 App 交互不受影响** |
> **两个独立层次,别混淆**(这是本次排查最值得记住的一点):
> - **渠道层**:飞书 App ⇄ gateway 的消息收发,由 `@openclaw/feishu` 的 channel 部分负责 → **一直正常**,所以手机交互没问题
> - **工具层**:模型在对话里"动手操作飞书"的能力,由插件的 `contracts.tools` 负责 → 那 36 条声明在这里无效
>
> `alsoAllow` 坏掉**不会**影响聊天交互,只会让"让 AI 去操作飞书文档/多维表格"这类动作落空。
> 复核命令(改完这两个都应为 0/不为 0 都应引起注意):
> ```bash
> grep -c "allowlist contains unknown entries" /tmp/openclaw/openclaw-$(date +%F).log
> grep -c "failed to load" /tmp/openclaw/openclaw-$(date +%F).log
> grep "http server listening" /tmp/openclaw/openclaw-$(date +%F).log | tail -1 # 看实际加载了哪些插件
> ```
@@ -366,6 +388,8 @@ python3 ~/.openclaw/scripts/perf-analyze.py [日志1 日志2 ...]
|---|---|---|
| 主配置 | 删除 `models.providers.newapi``modelPolicy.allow` 收敛为 `deepseek/deepseek-flash``sql` agent 主模型改为 deepseek | 配置热重载(日志:`config hot reload applied` |
| agent 级 `models.json` | `finances`/`main`/`resume`/`sql`/`travel` 各自残留的 new-api provider(含指向 `192.168.2.74:3000``100.115.195.188:3000` 的条目,含**明文 key**)全部移除 | 下次 gateway 启动生效 |
| 备份 | `~/.openclaw/openclaw.json.bak-20260916-161323-pre-newapi-removal``~/.openclaw/backups/agent-models-json-2026-09-16T0816/` | — |
| 工具声明清理 | `tools.alsoAllow` 由 37 条减为 1 条(删除 36 条由 `openclaw-lark` 提供、实际无法注册的声明) | 重启 gateway16:35),告警 20→0 |
| 插件开关 | `plugins.entries.openclaw-lark.enabled` 保持 **false**(曾置 true 实测其 `require("openclaw/plugin-sdk")` 失败,遂回退) | 重启 gateway |
| 备份 | `openclaw.json.bak-20260916-161323-pre-newapi-removal``...-163214-pre-lark-enable``...-163405-pre-alsoallow-fix``backups/agent-models-json-2026-09-16T0816/`(均在 `~/.openclaw/` 下) | — |
> `agent` 级 `models.json` 是**第二套模型定义**(被 `loadCustomModels()` 读取),与主配置 `openclaw.json` 并行生效——排查模型问题时**两处都要看**,这是本次分析的第一个教训。