报错是这么冒出来的。解析 Claude 流式响应时只处理 content_block_delta 里的 text_delta,遇到 thinking_delta 和 input_json_delta 时读 ev.delta.text 抛 KeyError,整条流直接中断。

中间走过弯路,把「工具调用走 input_json_delta 做增量拼接」当成主因,改完现象没变。

排查方向其实有限,先把可能性排一排。事件类型不止 text_delta 一种。另一种情况是思考模式会先发 thinking_delta。

还有一种情况,代码用字典下标取值而不是 get。

先打印一次完整的事件序列确认类型

python claude_events.py --dump-types

随后按 delta 的类型分支处理

python claude_parse.py --branch-delta

工具参数单独累积

python claude_parse.py --tool-args

剩下的就是用带工具和思考的请求覆盖三条分支

python claude_stream.py --tools --thinking

这类问题以前遇到过,但这次的触发条件和上次不一样。

这类改动我都写进变更记录,过两周再出问题时能对上号。

别只看报错消失,验证要多做一步。三种 delta 都能被正确归类,文本与工具参数各自完整,流结束时不再出现 KeyError。

Claude 的流式事件是分层结构,先看事件类型再看 delta 类型,直接取 text 只在纯文本场景成立。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189