oclaw/docs/runtime-skill-troubleshooting.md
oliver 4a23b715a2 重构仓库目录为统一的 runtime 分层并清理历史 openclaw 残留。
本次迁移将网关/通道/工具/技能/脚本与协议资源集中到新结构,统一路径常量与脚本转发机制,减少顶层噪音并保证运行与测试行为一致。

Made-with: Cursor
2026-04-25 01:24:23 +08:00

119 lines
5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# oclaw Skill 排障手册
本文用于排查 oclaw skill 在安装、暴露、执行、记忆回写四个阶段的问题。
## 1) 安装接口返回字段
`/admin/api/skills/install*`、`/admin/api/skills/auto-install`、`/admin/api/skills/retry-install` 统一返回:
- `ok`: 是否成功
- `result.detail`: 原始细节文本
- `result.error_code`: 归一化错误码
- `result.retryable`: 是否建议重试
## 2) 常见 `error_code` 与处理建议
| `error_code` | 含义 | `retryable` | 建议 |
| --- | --- | --- | --- |
| `ok` | 安装/创建成功 | `false` | 无 |
| `transport_or_extract_error` | 下载失败或解压异常 | `true` | 检查网络、URL、压缩包完整性后重试 |
| `invalid_archive` | 压缩包不合法(空包/过大/类型不支持) | `false` | 修正包格式或来源 |
| `invalid_skill_package` | 缺 `SKILL.md` 或包含不安全路径/文件 | `false` | 修正技能包结构和内容 |
| `already_exists` | 目标技能目录已存在 | `false` | 使用 overwrite 或换名 |
| `runtime_error` | 自动安装中途异常并已回滚 | `true` | 看 detail 定位异常后重试 |
| `unknown` | 未归类错误 | `false` | 结合 detail 和 trace 排查 |
## 3) 按 `trace_id` 排障路径
推荐按下列顺序查询同一个 `trace_id`:
1. `oclaw_gateway`
- `skill_manifest`
- `router_decision`
2. `oclaw_agent_core`
- `run_started`
- `attempt_started`
3. `oclaw_direct_loop`
- `tool_wire_filter`
- `tool_result_context_guard`
4. `oclaw_skill_executor`
- `skill_selected`
- `skill_executed`
5. `oclaw_agent_core`
- `after_turn_memory`
- `attempt_finished`
- `run_finished`
可快速判断问题落在哪一段:安装未生效、工具未暴露、工具执行失败、结果被截断、记忆未写入。
## 4) 快速检查项
- `AIA_SKILL_RUNTIME_ENABLED` 是否开启
- `AIA_SKILLS_PROMPT_IN_SYSTEM` 是否开启
- `AIA_SKILL_DISABLED_NAMES` 是否误禁用了目标 skill
- `AIA_SKILL_AUTO_INSTALL_ENABLED` 是否关闭
- 目标 skill 的 `SKILL.md` 是否包含合法 frontmatter(尤其 `metadata.oclaw.install`)
## 5) 典型故障定位
- **症状:skill 在 prompt 中看不到**
- 查 `skill_manifest.skills_total` 与 `hidden_total`
- 查 `AIA_SKILL_DISABLED_NAMES`
- 查 wire policy 是否过滤(`tool_wire_filter.hidden_*`)
- **症状:skill 可见但执行失败**
- 查 `skill_executed.ok=false` 与 `error_code`
- 查 `attempt_finished.error_code` 是否被归类为可重试错误
- **症状:有回复但记忆未入库**
- 查 `after_turn_memory`
- 若无该事件,先看 attempt 是否成功
- 若有该事件仍无记录,检查记忆写入阈值与 writer 配置
## 6) Admin 接口字段对照(速查)
以下接口都返回统一结构:`{ ok, result: { detail, error_code, retryable } }`。
| 接口 | 用途 | 常见请求字段 | 关键返回字段 |
| --- | --- | --- | --- |
| `POST /admin/api/skills/install` | 从本地目录安装 | `source_dir`, `overwrite` | `result.error_code`, `result.retryable` |
| `POST /admin/api/skills/install-registry` | 从 registry 压缩包安装 | `archive_url`, `overwrite` | `result.error_code`, `result.retryable` |
| `POST /admin/api/skills/auto-install` | 依据描述自动安装 | `name`, `description` | `result.error_code`, `result.retryable` |
| `POST /admin/api/skills/retry-install` | 对失败记录重试安装 | `install_id` | `result.error_code`, `result.retryable` |
排障时建议优先读取:
- `result.error_code`:确定是否是包格式、下载链路、运行时异常
- `result.retryable`:决定是否直接重试,还是先改包/改配置
- `result.detail`:补充上下文(具体 URL、异常片段、回滚原因)
## 7) 值班排障最短路径
1. 在 Admin 安装结果中先看 `result.error_code` 与 `result.retryable`
2. 按 `trace_id` 检索 `skill_manifest -> skill_executed -> after_turn_memory`
3. 若 `retryable=true`,修复网络/瞬时问题后执行 `/retry-install`
4. 若 `retryable=false`,优先修正技能包内容或运行时开关再重试
## 8) Relay 文件指针排障(新增)
当技能/专家输出文件引用时,优先检查:
- 入站消息 `attachments[]` 是否包含 `type=relay_pointer` 与 `pointer_uri`
- `metadata.relay_share_envelope.attachments.pointers[]` 是否存在且数量匹配
- `gateway_received` trace 中:
- `relay_pointer_count`
- `relay_envelope_present`
- `relay_envelope_pointer_count`
常见问题:
- **有附件但 pointer 计数为 0**
- 附件对象缺少 `pointer_uri`,或字段名不符合协议
- **envelope 存在但 pointer 数量为 0**
- `relay_share_envelope.attachments.pointers` 结构错误(非数组/元素非对象)
- **LLM 无法使用共享文件**
- 确认消息构建阶段将 pointer 作为文本元信息注入,而不是直接传大文件内容
- **ACP 子任务立即失败(无模型执行)**
- 常见 `error_code`:`relay_envelope_invalid`、`relay_envelope_unsupported_version`
- 语义:输入契约错误,固定 `retryable=false`,应先修 payload 再重试