lov-fix-deepseek-tool-call-error · v0.1.0 · 2026-09-11 · sha256 03195891c67e9144

lov-fix-deepseek-tool-call-error v0.1.0A

Immutable. This exact content is served forever at /api/v1/blob/03195891c67e9144.

---
name: lov-fix-deepseek-tool-call-error
description: >
  修复 Codex 在 DeepSeek(provider=yoda)会话里的 No tool output found for tool call 400 与 thread 永久锁死:扫描本地 rollout 取证,恢复任务并落地看图与批次规避规则。Use when a DeepSeek thread fails with No tool output found for tool call.
license: MIT
compatibility: "Portable Agent Skills format. Python 3.8+ standard library only; reads local Codex rollout JSONL; no network, no credentials."
metadata:
  author: skill-publisher
  version: "0.1.0"
  card_standard: lovstudio/skill-card/v1
  content_class: deterministic-output
  tags:
    - codex
    - deepseek
    - tool-call
    - diagnostics
    - recovery
---

# DeepSeek 会话急救 · DeepSeek Thread First Aid

Codex 在 DeepSeek(`provider=yoda`、`wire_api = "responses"`)上跑长任务时,只要一条
assistant 消息里同时发出多个工具调用、且批次里存在被缩放的图片,Codex 就会在批次结果
齐全之前发出下一次请求,DeepSeek 以 `No tool output found for tool call call_XX_...`
返回 400,并让这条 thread 永久失败。本 Skill 负责取证、恢复与预防。

## Triggers

### Activate when

- 用户贴出 `No tool output found for tool call call_...` 报错,或说“又报错了”“这个 thread 又废了”。
- 用户问 Codex + DeepSeek 为什么看图或长任务会 400,或要求“以后别再出现”。
- 需要盘点本机有哪些 thread 中毒、它们是否同一个诱因。
- Use when a Codex thread reports No tool output found for tool call, or the user asks to review every wedged thread on this machine.

### Do not activate when

- 报错发生在别的 provider,或 `wire_api = "chat"` 的配置上;先按 `lov-fix-general` 常规排错。
- 用户只是想读某条 thread 的进度或结果;交给 `lov-read-codex-session`。
- 用户要修的是产品代码缺陷;交给 `lov-fix-general` 或 `debug-pro`。

## Outputs

- 事故清单:时间、thread、被拒调用、同批调用、是否涉及缩放图片、是否已锁死。
- 恢复方案:中毒 thread 的处置方式与接续路径。
- 预防清单:要写入的规则与命令;默认只给方案,不改全局配置。

## Workflow (MANDATORY)

### Step 0: 定位

- 用 `SKILL_DIR`,否则按当前 Skill 上下文推断安装目录。
- 确认 `scripts/scan_deepseek_sessions.py` 存在;缺失时先报出期望路径,不产出半成品。
- 本 Skill 只读:不改 rollout、不改 thread、不写外部服务。

### Step 1: 取证

```bash
python3 "$SKILL_DIR/scripts/scan_deepseek_sessions.py"
```

- 默认扫描 `~/.codex/sessions` 与 `~/.codex/archived_sessions`;用 `--root` 追加目录,
  用 `--file` 指定单个 rollout,用 `--json` 取结构化结果。
- 表格每行是一起事故:时间、session、被拒调用、同批调用、变体、同 call 重复失败次数。
- 用户给了 thread 链接时,同时用宿主的 thread 读取能力看它的实时状态(只读)。
- 大数据量下全量扫描约一分钟;只要相关 thread 时优先用 `--file` 精确扫描。

### Step 2: 判定

- `variant = image_batch_with_resize_notice`:批次含 `view_image`,且该 thread 出现过
  `<image_resize_notice>` —— 当前已知的唯一真实诱因。
- 重复失败次数大于 1,或同一 session 反复出现:thread 已锁死,后续每一轮都会在同一秒失败。
- 批次里没有图片调用时,对照 `references/mechanism.md` 的其它触发路径(hook 注入的
  developer 消息、被中断的批次),不要直接套用图片结论。

### Step 3: 恢复

按 `references/recovery.md` 执行:

- 中毒 thread 不重试、不 fork(fork 继承坏历史,同样 400)。
- 先试 archive → unarchive 让宿主卸载内存中的坏历史;仍失败则新开 thread。
- 新 thread 只通过文本读取旧 thread 的结论与文件路径,绝不导入旧的 assistant 消息。
- 工作产物已在磁盘上,先确认产物完整,再决定是否需要重跑。

### Step 4: 预防

按 `references/prevention.md` 落地,默认顺序:

1. `view_image` 独占一条消息,不与任何其它工具调用同批(含 `sips`、`rg` 这类快命令)。
2. 看图前先生成长边不超过 2048 的副本:`sips -Z 2048 <图> --out <副本>`。
3. 需要高保真视觉复核时,把图交给外部视觉能力(如 `lov-describe-image`),会话内不看图。
4. 规则写入宿主常驻 Prompt 与领域 reference;只在用户明确同意时改动全局配置。
5. 禁止用关闭 `view_image` 工具的方式规避:代价是整机失去看图能力,破坏性远大于收益。

### Step 5: 验证与报告

- 重跑扫描器,确认没有新增事故;如果做了修复动作,回读改动文件确认规则真的存在。
- 输出必须区分:已取证、已恢复、已预防、仍待验证。
- 明确边界:本 Skill 不能修复已中毒的历史,也不能替代上游对竞态的修复;它让用户止损、
  复盘并把规避前移。

## Dependencies

- Python 3.8+ 标准库;可选 PyYAML 仅用于 `scripts/validate_skill.py`。
- 需要本地 Codex 会话目录的读权限;无网络、无凭据。
- 相关能力(可选,不构成硬依赖):`lov-read-codex-session` 读 thread 状态,
  `lov-describe-image` 提供外部看图通道,`lov-feedback-loop` 记录事故反馈。