Simon Willison给自己维护的LLM工具发了个小版本更新——llm-anthropic 0.27,更新说明只有一句话:适配Anthropic Python SDK的新版本。他在Claude Code里让Fable 5读一遍官方迁移指南,自动改代码、跑测试,几分钟出了一个PR,合并。

这事听起来平淡,但往前拆一层就不平淡了。Anthropic这次SDK升级不是小改动,而是把底层HTTP库从httpx换成了httpx2——而就在两周前,OpenAI的Python SDK v3.0.0已经做了同一件事。两家头部LLM厂商在半个月内先后换掉同一块底层地基,这不是哪家的孤立决定,更像是Python HTTP客户端生态正在经历一次协同迁移,牵连的是所有拿这两个SDK做过自定义处理的下游项目。

httpx2不是"开HTTP/2",这个误解得先纠正

很多人看到"httpx2"这个名字,第一反应是"升级到HTTP/2协议"。不是。httpx2是Pydantic团队维护的一个独立包,官方文档把它描述为"API兼容的httpx延续版"——换句话说,httpx原作者停更或维护节奏放缓后,Pydantic团队接手做了个平替,两大LLM SDK商几乎同时选择了它作为新的默认依赖。

Anthropic这次的改动范围比OpenAI更大。除了换底层库,v1.0.0还把最低Python版本要求从3.9提到3.10,彻底移除了legacy的Text Completions API(client.completionsHUMAN_PROMPT那一套老接口),并且把typed方法里的temperaturetop_ptop_k参数拿掉了,想传给旧模型得走extra_body。这些都是官方迁移指南里明确写的breaking change,谈不上意外,但足够多。

一个给缓冲,一个直接报错

真正值得记一笔的是两家对"不兼容旧httpx.Client"的处理态度完全不同。

OpenAI选择留了条后路:如果你的代码里自己构造了httpx.Client传给SDK,v3.0.0允许你用类型转换(cast)强行绕过检查继续用,算是给老代码一个过渡期。Anthropic更硬——直接在构造函数里抛TypeError,不商量。

这不是技术细节,是两种工程哲学的分野。OpenAI赌的是"生态兼容优先,技术债可以缓慢还";Anthropic赌的是"接口该断就断,拖着反而积重难返"。哪种更对,取决于你站在哪边——维护老项目的人会骂Anthropic太急,追求代码干净的人会说OpenAI是在拖后腿。

断裂式升级:两种应对哲学 OpenAI v3.0.0 保留过渡通道 旧httpx.Client用cast 强行绕过继续跑 破坏性更温和 技术债留给以后 Anthropic v1.0.0 构造时直接报错 TypeError,无缓冲期 老代码立刻炸 破坏性更彻底 接口该断就断

静默失效比报错更麻烦

对只用SDK默认用法的开发者来说,这次升级大概率无感——正常调用messages.create不会突然出错。但一旦代码碰到"默认用法之外"的路径,风险开始堆积,而且很多不会报错,只是悄悄不对了。

  • TLS信任链变了.httpx2用操作系统信任库而不是certifi证书包,精简容器或走企业代理的环境可能验证不通过。
  • Bedrock区域不再兜底.AnthropicBedrock()过去会静默回退到us-east-1,现在必须显式解析出AWS区域,解析不出直接抛ValueError。
  • respx、pytest-httpx、vcrpy做录制式测试,或用OpenTelemetry、Sentry做HTTP埋点监控的团队,底层库换了实现,这些工具的mock和instrumentation可能悄悄失效——不报错,但监控数据或测试断言从此不准。
  • 风险.mock测试和埋点监控最容易在这次迁移里"静默失效",却不会有任何报错提示你。

llm-anthropic自己就撞上了这一层——为了保住录制的HTTP测试继续可用,0.27把测试期依赖的vcrpy升到了8.3以上,这不是加功能,是给自己的测试基础设施打补丁。

AI生成的PR,测试通过不等于测试到位

Willison这次用Claude Code里的Fable 5,一句话提示词就让AI读完迁移指南、改完代码、跑通测试。效率确实高,PR#84只改了两个文件,合并时通过了覆盖多个Python版本的CI检查,而且没有正式的人工代码评审。

测试全绿,不代表迁移就没有盲区

问题在于,temperature/top_k塞进extra_body、以及超长输出场景下thinking内容与extra_body的合并逻辑,这些改动都没有针对性的新增单元测试,只是靠原有的录制测试间接兜底。换句话说,AI把"能跑通现有测试"这件事做得很漂亮,但"现有测试是否覆盖了新逻辑"这个问题,它没有回答,也没人去补。

这不是说AI辅助迁移不可靠,而是提醒一件更朴素的事:CI绿灯是下限,不是上限。对于维护Python LLM应用、尤其是自己封装过HTTP层或写过录制测试的团队,这次升级值得做的不是等报错,而是主动去翻一遍代理配置、证书链和mock工具的行为,再决定要不要跟着升级。

顺带一提,关于Anthropic v1.0.0是否已经正式对外发布,目前能看到的信息并不完全一致——官方迁移指南和PR引用的release tag都指向v1.0.0已发布,但也有信息显示官方仓库的release列表当前仍停留在0.x系列。这种落差本身值得留意,升级前最好自己去官方仓库确认一下真实的release状态,而不是照抄别人的版本号。