LLM 0.32 实战拆解:从命令行外壳到轻量 Agent 框架

📅 2026/8/13 11:34:44
LLM 0.32 实战拆解:从命令行外壳到轻量 Agent 框架
一、背景为什么命令行工具需要「Agent 骨架」如果你用过 Simon Willison 的llm命令行工具你会对它的定位很熟悉一个统一调用多厂商模型的 CLI 外壳。只要装好插件一行llm 问题就能切到 OpenAI、Anthropic、Gemini 或本地模型不需要记每家 SDK 的写法。但 2026 年 8 月 4 日发布的LLM 0.32明显不甘心只做外壳。它在向后兼容的前提下把底层模型交互从「字符串」改成了「结构化消息 类型化 Part」给工具链加入了暂停、恢复、人工审批的语义还把日志换成内容寻址的消息存储。这套能力组合起来llm已经从「帮你发请求」的工具进化到「帮你组织一次 Agent 运行」的轻量框架。这不是修辞。官方 Release Notes 把这次更新称为 a major, backwards-compatible update to the way prompts, responses, tools and logs are represented。本文会围绕 0.32 的四个核心变化给出一个可复现的实战拆解环境安装 → 结构化事件流 → 服务端工具 → 可暂停工具链 → 内容寻址日志 → 避坑清单。在 LLM 应用落地的过程中最痛的往往不是第一次调用模型而是把模型放进一个持续运行的闭环里模型会请求工具工具要执行执行结果要回传模型推理模型的 thinking 内容会和正文混在一起UI 上很难单独渲染遇到敏感操作删除文件、转账、发邮件必须插进人工审批点一轮 Agent 跑下来日志里同一段系统提示和对话历史被重复存储 N 次好不容易跑通的工具链想换一家模型又得重写对接逻辑。以前llm能解决第一层问题统一发请求。0.32 则开始解决后面四层问题结构化事件流response.stream_events()把文本、推理、工具调用、工具结果拆成类型化事件服务端工具-T WebSearch、-T CodeInterpreter等模型侧工具可以直接从 CLI 调用可暂停/恢复的工具链工具内部raise llm.PauseChain(...)即可干净地暂停执行等待外部事件后继续内容寻址日志SQLite 里的消息按内容哈希去重长对话不再重复落库。二、环境准备安装 LLM 0.32 并配置密钥LLM 0.32 没有特别高的 Python 版本门槛官方文档的安装方式如下来源Setup - LLM# pip / pipx / uv 均可任选其一 pip install -U llm # 或 pipx install llm # 或 uv tool install llm验证版本llm --version # 期望输出类似llm, version 0.32配置 OpenAI 密钥0.32 的默认模型已改为gpt-5.6-lunallm keys set openai # 按提示粘贴 sk-... 即可或者通过环境变量export OPENAI_API_KEYsk-...查看当前默认模型llm models default # gpt-5.6-luna如果你没设置过默认模型0.32 会直接用gpt-5.6-luna。官方文档给出的定价是$0.20 / 1M input tokens、$1.20 / 1M output tokens来源Setup - LLM。三、实战 1用stream_events()拆解模型输出0.32 之前llm的response是一个文本迭代器import llm model llm.get_model(gpt-5.6-luna) response model.prompt(用一句话解释量子计算) for chunk in response: print(chunk, end)这段代码仍然可用因为 0.32 保持向后兼容。但如果你要区分正文、推理轨迹、工具调用和工具结果旧写法就不够了。0.32 引入了Message和Part概念。一个Message可以包含多个类型化的PartTextPart、ReasoningPart、ToolCallPart、ToolResultPart、AttachmentPart。流式输出时用response.stream_events()按事件类型处理import llm model llm.get_model(gpt-5.6-luna) response model.prompt(解释量子计算并说明它为什么可能对密码学有威胁) for event in response.stream_events(): if event.type reasoning: # 推理模型的 thinking 内容 print(f[思考] {event.chunk}, end, flushTrue) elif event.type text: # 最终给用户的正文 print(event.chunk, end, flushTrue) elif event.type tool_call_name: print(f\n[调用工具: {event.chunk}]) elif event.type tool_call_args: print(f参数: {event.chunk}) elif event.type tool_result: print(f工具结果: {event.chunk})代码意图把原本混在一起的输出流拆成不同语义的事件。这样你的 UI 可以把 reasoning 折叠、把工具调用高亮、把正文单独渲染而不需要再对字符串做正则解析。图1输出模型从「字符串迭代」变成「结构化事件流」。红色侧代表 0.31 及更早的局限绿色侧展示 0.32 的事件类型与对应 Part 类型。概念示意图非运行截图。除了流式response.messages()可以直接拿到组装好的结构化输出response.to_dict()和Response.from_dict()可以把完整轮次持久化为 JSON方便你在外部 Agent 循环里保存状态。response.prompt.messages则是真正发给模型的消息链是调试时的权威记录。四、实战 2服务端工具-T WebSearch与-T CodeInterpreter0.32 的另一大变化是支持 OpenAI Responses API 的「服务端工具」。这类工具不是在你本地执行的函数而是由模型提供方在服务端执行并返回结果。从命令行看用法非常直接# 让模型自动调用 OpenAI 的 WebSearch 工具 llm Rust 1.88 什么时候发布 -T WebSearch 让模型调用服务端代码解释器内存限制 4GB llm 用 Python 计算 2 的 100 次方并验证质因数 -T CodeInterpreter(memory_limit4g)如果你想查看某个模型支持哪些服务端工具可以用llm tools -m gpt-5.6-luna或者用--json拿到结构化信息llm models --json --options代码意图服务端工具让你不用在本地实现搜索引擎或沙箱解释器就能让模型获得联网检索或执行代码的能力。这对快速验证想法、写 demo、做研究特别友好。⚠️ 注意-T WebSearch等服务端工具需要模型和 API 同时支持费用由模型供应商按实际调用计费。不要把它当成免费的通用搜索接口。五、实战 3用llm.PauseChain插入人工审批点服务端工具很香但很多操作不能交给模型自动完成。比如删除文件、修改数据库、对外发送请求前必须让人点一下「同意」。0.32 给出的解决方案是llm.PauseChain。设计一个带审批的工具import llm APPROVED set() def delete_files(path: str) - str: 删除指定路径的文件或目录。 if path not in APPROVED: # 干净地暂停等待调用方处理 raise llm.PauseChain(等待审批删除 path) # 审批通过后才会执行到这里 import shutil shutil.rmtree(path, ignore_errorsTrue) return f已删除 {path}调用方捕获异常展示审批 UI用户同意后恢复model llm.get_model(gpt-5.6-luna) try: response model.prompt( 帮我清空 /tmp/old-cache 目录, tools[delete_files], ) print(response.text()) except llm.PauseChain as pause: # pause.tool_call 是当前被暂停的工具调用 print(需要审批的工具, pause.tool_call.name) print(参数, pause.tool_call.arguments) print(已完成的兄弟调用结果, pause.tool_results) # 假设用户在 UI 上点了「同意」 path pause.tool_call.arguments[path] APPROVED.add(path) # 用 response.messages() 拿到当前消息历史恢复执行 persisted_messages list(pause.tool_call.response.messages()) chain model.chain( messagespersisted_messages, tools[delete_files], ) print(chain.text())代码意图llm.PauseChain让工具链在危险操作前停下来而不是用占位结果继续调用模型。暂停异常里保留了当前工具调用和已完成的兄弟结果恢复时不会重复执行已经跑完的工具。图2llm.PauseChain 的工作流程。工具内部 raise 暂停后调用方捕获异常并展示审批 UI审批通过后通过 messages 恢复链式调用已完成的结果不会重复执行。流程示意图非运行截图。从架构角度看这个设计把「审批状态机」从 Agent 框架内部拆出来了。你的 Web UI、命令行确认、企业审批系统都可以接入同一个PauseChain异常。六、实战 4内容寻址的 SQLite 日志最后一个重要变化是日志。0.32 之前llm把每次 prompt 和 response 存在 SQLite 的responses表里每一轮都存一份完整历史。长对话越到后面重复数据越多。0.32 引入了新的日志模式threads表保存对话线程turns表保存每一轮但只存对消息哈希的引用消息本身存在内容寻址的 message store 中按内容哈希去重。官方文档给出的备份命令升级前可以先备份旧日志llm logs backup logs-backup.db查看日志状态llm logs status关闭或开启日志llm logs off llm logs on如果你用 Python API 写日志可以用Response.log_to_db()import llm model llm.get_model(gpt-5.6-luna) response model.prompt(写一段快速排序 Python 代码) # 把这次交互写入日志库 response.log_to_db()用--json输出结构化日志即使全局日志关闭也可用临时库llm 写一段快速排序 Python 代码 --json--json会输出与llm logs --json相同的结构化格式即使你把日志关了它也会用临时内存库构造结果。图3旧 responses 表每轮都写完整历史新 threads/turns/message store 只按内容哈希存一次消息。结构示意图非运行截图。代码意图把消息当成不可变对象按哈希去重长对话场景下能显著降低存储冗余同时也让「同一段系统提示在多轮里复用」变得更自然。七、避坑清单与迁移建议0.32 虽然向后兼容但生产环境里仍有几个容易踩的坑默认模型变了。没设置过默认模型的用户会突然从gpt-4o mini切到gpt-5.6-luna价格和速度都不一样。如果你想保持原行为手动设置回去llm models default gpt-4o-mini日志库结构变了。如果你之前直接读 SQLite 的responses表做分析新数据不会再写到这张表里。官方建议升级前用llm logs backup做备份分析脚本应改用llm logs --json或LogStoreAPI。插件可能需要升级。0.32 的模型插件接口加入了supported_server_side_tools、ServerSideTool、json_replacements等新概念。自定义模型插件的作者需要对照官方 Advanced Model Plugins 文档更新。服务端工具不是本地工具。-T WebSearch的调用费用由 OpenAI 收取且不是所有模型都支持。本地自定义工具仍然用llm.hookimpl注册和-T服务端工具不要混淆。PauseChain 不是超时或重试。它用于「等待外部事件」的语义暂停如果你的工具只是想重试应该用普通的异常处理不要滥用PauseChain。Reasoning 默认打印到 stderr。CLI 上llm prompt会自动把 reasoning 摘要流式输出到标准错误。如果你不想看到用-R/--hide-reasoning。八、总结LLM 0.32 到底变了什么从实战角度看LLM 0.32 不是简单加了几个 API而是把整个工具的抽象层次抬了一层输出层字符串 → 结构化事件 类型化 Part工具层本地函数 → 本地函数 服务端工具 可暂停/可恢复链日志层每轮完整落库 → threads/turns 内容寻址消息存储默认体验gpt-4o mini → gpt-5.6-lunaOpenAI 推理模型默认走 Responses API。这些变化让它不再只是「命令行 LLM 客户端」而更像一个可以嵌入 Agent 工作流的轻量运行时。对于已经在用llm做日常脚本和数据分析的人来说0.32 值得升级对于想自研 Agent 又不想引入 LangChain、Pydantic AI 等重型框架的人来说0.32 提供了一个更克制、更 Pythonic 的选择。九、延伸阅读官方 ChangelogChangelog - LLMGitHub Release 0.32Release 0.32 · simonw/llm · GitHubPython API 文档stream_events / PauseChain / messagesPython API - LLM日志新架构说明Logging to SQLite - LLM安装与密钥管理Setup - LLM