ZCode 自动继续插件:检测模型回复被截断或为空,自动请求模型继续输出。
解决"干一半自己停了":模型回复因 max-tokens 截断或空响应(empty_model_response)导致回合死亡时,Stop hook 自动触发续写,无需手动发"继续"。
ZCode 的 Stop hook 原生支持"请求继续":回合结束时 hook 返回 {"continue": true, "additionalContext": "..."},客户端会自动让模型再跑一轮(每回合最多 3 次)。
但旧版 hook 脚本读错了 stdin 字段(读 message.content,实际在顶层 responseText),导致:
- 截断检测从未生效——所有对话"干一半停了"都不会自动继续;
- 空响应重发误判所有回复为空 → 疯狂重发 → 被禁用。
本仓库提供修复后的脚本 + 实测确认的 stdin 格式。
{
"cwd": "G:\\Zcode\\插件开发",
"hookEventName": "Stop",
"responsePreview": "...",
"responseText": "...",
"sessionId": "sess_...",
"turnId": "turn_...",
"mode": "yolo",
"toolCallCount": 14,
"stopHookActive": false,
"transcriptPath": "C:\\Users\\...\\zcode-claude-hook-xxx\\transcript.jsonl",
"timestamp": "2026-08-29T09:56:28.120Z"
}- 回复文本在顶层
responseText(responsePreview是截断预览,可作兜底)。 - 没有
message.content字段(旧脚本的解析路径)。 - 输出格式:
{"continue": true, "additionalContext": "..."},两个字段必须同时存在才生效。
# 1. 复制脚本到 ZCode tools 目录
cp hooks/*.py ~/.zcode/tools/
# 2. 在 ~/.zcode/cli/config.json 的 hooks.events.Stop 注册(示例):{
"hooks": {
"enabled": true,
"events": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "python C:/Users/<you>/.zcode/tools/continue-on-truncation.py",
"timeout": 10,
"statusMessage": "检测回复是否被截断..."
},
{
"type": "command",
"command": "python C:/Users/<you>/.zcode/tools/auto-retry-empty-response.py",
"timeout": 10,
"statusMessage": "检测空响应并自动重发..."
}
]
}
]
}
}
}注意:客户端启动时加载配置,改完需重启 ZCode 才生效。
| 脚本 | 作用 | 触发条件 |
|---|---|---|
continue-on-truncation.py |
截断/空响应自动继续 | 未闭合代码块、长回复尾部省略号、悬空标点、空回复 |
auto-retry-empty-response.py |
空响应自动重发 | 回复文本为空(responseText 为空) |
stop-hook-debug.py |
调试用:dump stdin 到日志 | 手动注册,排查格式问题 |
# 构造合法 JSON 输入(注意 Git Bash 的 echo 会破坏反斜杠转义,用 python 生成)
python -c "
import json, subprocess
cases = [
('正常回复', {'responseText': '正常回复内容'}),
('空回复', {'responseText': ''}),
('未闭合代码块', {'responseText': '内容被截断了,最后是\`\`\`'}),
]
for name, payload in cases:
inp = json.dumps(payload, ensure_ascii=False).encode('utf-8')
r = subprocess.run(['python', 'hooks/continue-on-truncation.py'], input=inp, capture_output=True)
print(f'{name}: {r.stdout.decode()!r}')
"- ollama-loop-guard — Ollama 云模型死循环打断代理(HTTP 代理方案)
- dsh-auto-continue — DeepSeek Harness 的自动继续插件(DSH 方案)
MIT