先看现象。把 anthropic 从 0.34 升到 0.40,原来的 for event in stream 写法报 AttributeError,提示 object has no attribute '__iter__',升级日志里只写了一行变更说明。

这类报错背后常见的原因有几处,逐个排除就行。新版本要求用 with client.messages.stream 上下文管理器。还有一种是旧代码拿到的是响应对象而不是事件迭代器。

少数情况下是事件类型名从 completion 改成 content_block_delta。

不容易想到的是,没在退出时关闭连接,长连接被服务端断开。

动手时先看当前 SDK 暴露的方法

python -c "import anthropic;c=anthropic.Anthropic();print([m for m in dir(c.messages) if 'stream' in m])"

然后改成 with 写法并逐事件解析

python -c "print('with client.messages.stream(...) as s: for t in s.text_stream: print(t)')"

随后核对事件类型名的变化

python -c "print(['content_block_delta','message_delta','message_stop'])"

剩下的就是跑一次最小流式请求验证输出完整

python -c "import anthropic;c=anthropic.Anthropic();s=c.messages.stream(model='claude-3-5-sonnet-latest',max_tokens=64,messages=[{'role':'user','content':'hi'}]);print(''.join(s.text_stream))"

这次没动代码,只在配置和运行环境上找原因。

怎么算真的好了,看的是同一批现象。流式输出连续完整,退出 with 块后连接正常关闭,日志里不再出现迭代器报错。

SDK 大版本升级时先看事件模型的命名,很多报错不是网络问题而是事件类型名变了。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189