Simon Willison 发布了命令行工具 llm 0.33。发布说明列了四条更新,看着都很家常:升级依赖库、密钥支持按次传入、模板可以叠着用、推理模型多了个摘要选项。真正有意思的一句话,却被他轻描淡写地埋在第一条后面——"我昨天已经发过 0.32.1 的应急修复,但这次才是完整版"。

这句话背后,是一场 llm 自己没主动挑起的麻烦。

一次被上游 SDK 逼出来的补丁

llm 是 Willison 长期维护的开源项目,用来从终端直接调用各家大模型,靠插件生态支持不同厂商。它的底层依赖 OpenAI 官方 Python SDK——这意味着 OpenAI 一旦改动 SDK,llm 就得跟着动。

这次的导火索是 OpenAI Python 3.0.0。新版本把 httpx2 设成默认 HTTP 客户端,不再自动安装旧版 httpx。结果是全新安装的 llm 直接报错,测试用的 mock 逻辑也跟着失效。

Willison 先在前一天发了 0.32.1,做法很简单粗暴:把 openai 依赖锁死在 3.0 以下,先止血。0.33 才是真正的迁移——完整切到 httpx2,把这条依赖链彻底捋顺。

  • 风险.两版之间存在一个短暂窗口,期间新装或升级的用户可能直接撞上安装失败,而这一层因果原文完全没写。

per-call key:多租户场景的老痛点

llm embed 和 embed-multi 命令新增了 --key 参数,Python 方法对应 key=。用法很直接:

Code
llm embed -m text-embedding-3-small --key personal -c "Text to embed"

Python 里写成 model.embed(text, key="sk-...")

这解决的不是什么新问题,而是命令行 AI 工具一直没处理好的老毛病:模型对象习惯把 API key 存成自己的状态,一个对象对应一把钥匙。一旦有多个用户或多个租户共用同一个模型实例,钥匙就会打架——要么共享一把,要么每次都得重新建模型对象。

per-call key 让钥匙跟着调用走,不跟着对象走。旧插件只要还在读 self.key,靠兼容层继续能用,不用推倒重写。

模板可以叠着用,配置和内容终于分开了

-t/--template 现在可以重复传,前后模板按顺序合并。原文给的例子挺直观:先存一个只带模型和推理强度的模板,再存一个只带 prompt 的模板,两个一起跑:

Code
llm -m gpt-5.6-luna -o reasoning_effort high --save lhigh
llm "Generate an SVG of a pelican riding a bicycle" --save pelican
llm -t lhigh -t pelican

本质是把"用什么模型、开多大推理力度"和"具体问它什么"拆成两件事。以前一个模板要么啥都塞进去,要么每次手写一遍参数;现在配置可以复用,内容单独换,谁都不用重写谁。

reasoning_summary:模型说的"我怎么想",不是它真正怎么想

Responses API 的推理模型多了个 reasoning_summary 选项,可选 auto、concise、detailed。配合 llm openai endpoint --responses 可以直接调。

这里有个容易被忽略的边界:reasoning_summary 返回的是模型对自己推理过程的总结性说明,不是完整的隐藏思维链。厂商出于安全和竞争考虑,普遍不会把原始推理过程直接暴露出来,summary 只是官方允许你看到的那一部分。对着重调试模型推理逻辑的开发者来说,这更像是一份"公关稿",能帮你大致理解模型走了哪条路,但别指望靠它复现推理细节。

SDK 突变到补丁落地:三步时间线 OpenAI Python 3.0.0 httpx2 成默认依赖 安装/测试报错 llm 0.32.1 锁定 openai<3.0 临时止血 llm 0.33 完整迁移 httpx2 问题彻底解决

这次更新真正值得记住的,不是四条 changelog,而是它们背后共享的一个事实:llm 这类基于官方 SDK 搭建的开源工具,命脉握在上游厂商手里。OpenAI 换个默认依赖,下游维护者就得连夜发补丁、再补一次完整修复。这不是 llm 一家的处境——所有靠官方 Python SDK 起步的第三方工具,理论上都吃同一份风险。

地基不是自己的,地基一动,住户就得连夜修墙。
  • 结论.per-call key 和模板链式组合,才是这个版本真正面向多租户和复杂工作流的功能升级,比修 SDK 更值得开发者关注。

对普通用户来说,升级建议很简单:直接跳过 0.32.1,装 0.33。对搭建多租户或高并发调用的团队,per-call key 值得现在就用起来,省得以后自己拼补丁。至于 reasoning_summary,别指望它能替代真实的思维链调试——它更像模型自己写的说明书摘要,读个大概可以,别当真相。