Reed's News
← 返回精选

LLM 0.32 发布:支持推理轨迹、OpenAI Responses 与服务器端工具

AI 64 2026/8/4 956 字 原文 ↗

2026年8月4日

今日上午,我发布了LLM 0.32——这是项目启动以来最重要的一次版本更新。新版本新增了可见推理轨迹、服务商端工具、重构后的内容可寻址SQLite日志,支持更多模型,还通过OpenAI Responses API解锁了多项新功能。同时,我也发布了llm-anthropic插件的重大更新版本。

LLM命令行用户核心特性

现在,调用推理模型运行LLM时,会将推理轨迹输出至标准错误流,这样你就能查看模型的"思考过程",且该内容不会混入可能被管道传输至其他工具的标准输出。添加-R/--hide-reasoning参数即可关闭此功能。

macOS终端中运行指令llm "think about the best thing about pelicans"的界面——灰色文本显示"正在梳理鹈鹕的特质",随后输出一段白色文本:鹈鹕最棒的地方在于其夸张却实用的外形:巨大的喙和喉囊看起来滑稽可笑,却让它们成为技艺高超的捕鱼能手。更妙的是,许多鹈鹕种类会协作捕猎——它们会一起将鱼群驱赶到一处,再一口兜住。憨态、优雅与机敏,在它们身上完美融合。

LLM原生支持GPT-5.6模型家族,且llm "prompt"指令默认使用的模型已更换为性价比极高的GPT-5.6 Luna

LLM调用现在可接入多家服务商的服务端工具。OpenAI提供了代码执行环境作为服务端工具,LLM可通过以下方式运行需要该工具的指令:

llm --tool CodeInterpreter 'Show current python and SQLite versions' OpenAI还新增了WebSearch工具。

llm-anthropic插件则新增了WebSearchWebFetchCodeExecutionAnthropicMCP工具,示例用法如下:

llm -m claude-sonnet-5 -T 'AnthropicMCP("https://datasette.simonwillison.net/-/mcp")' \
'how many rows in the blog_blogmark table?'

该指令会让Anthropic在与API的单次请求/响应交互中,调用我的新插件datasette-mcp执行MCP操作。

新增的llm openai endpoint命令,可作为单行工具向任何兼容OpenAI的端点发送指令。此类调用不会被记录,非常适合针对LLM API通用标准兼容的服务执行一次性指令。

我通过以下方式,在本地LM StudioAPI运行的Gemma 4 12B模型上执行指令——使用uvx(无需安装LLM),同时搭配llm-tools-quickjs工具插件:

uvx --with llm-tools-quickjs \
llm openai endpoint http://localhost:1234/v1 -m google/gemma-4-12b \
-T QuickJS 'Use QuickJS to multiply 3434 * 2434' --td

输出内容:Tool call: QuickJS_execute_javascript({'javascript': '3434 * 2434'}) 8358356 The result of 3434 * 2434 is 8,358,356.

Python API新特性

此前,LLM的Python API要求用户先创建对话,再逐条发送消息。这种设计是对LLM本质的抽象——实际上LLM的每次请求都需携带完整的历史消息记录。但在一些高级场景中,这种抽象开始成为阻碍。因此,新版本新增了model.prompt(messages=[])参数,用法如下:

import llm
from llm import user, assistant, system
model = llm.get_model("gpt-5.6-luna")
response = model.prompt(messages=[
    system("You are a helpful pirate."),
    user("What is the capital of France?"),
    assistant("Paris, matey."),
    user("And Germany?"),
])
print(response.text())

此前,LLM每次调用会返回一个字符串序列。这种设计在模型仅返回文本时运行良好,但无法适配模型后续演化出的复杂输出形式。如今,许多模型会同时返回推理文本、输出内容、工具调用指令甚至图片附件。在LLM 0.32中,你可以改用这种方式处理:

for event in model.prompt("Explain cats").stream_events():
    if event.type == "reasoning":
        print(f"[thinking] {event.chunk}", end="", flush=True)
    elif event.type == "text":
        print(event.chunk, end="", flush=True)
    else:
        print(f"Other event: {event}")

结合上述特性,我们终于可以实现一套稳健的半标准OpenAI聊天补全API。我已将其作为llm-chat-completions-server插件发布:

llm install llm-chat-completions-server
llm chat-completions-server --port 9000
# 服务器已在 http://127.0.0.1:9000/v1 启动

现在,你可以通过新的llm openai endpoint命令,向该服务器发送LLM指令:

llm openai endpoint http://127.0.0.1:9000/v1 'hello' -m gpt-5.4-mini

这类API面临的一大挑战是日志记录问题。如果每次请求都要追加消息序列,我们最好能避免为每一轮对话重复记录大量相同的JSON数据。

解决方案是新增的内容可寻址消息存储,其设计灵感源自Git。你可以在文档中查看新的数据结构,llm logsllm logs --json命令也已升级,可将该格式转换为更易读取的形式。

其他更新

本次版本更新内容繁多,0.32版本说明已涵盖大部分细节,0.32rc20.32rc0.32a30.32a20.32a0的说明文档可补充遗漏信息。

现有LLM插件均可正常使用,但提供额外模型的插件需升级至0.32版本,才能完全适配新的流式事件系统。文档中提供了一份关于结构化消息与流式事件的插件开发指南。

我已更新了几款自研插件:

或许LLM现在已是一个智能体框架

本次版本中不少底层工具的更新,都是为了满足Datasette Agent的需求。我最初开发LLM时,"智能体(agent)"的定义非常模糊,因此一直刻意回避这个术语。直到2025年9月,我才接受了"LLM智能体通过循环调用工具达成目标"这一已被广泛认可的定义,不再刻意回避该术语。

如今,工具链已支持暂停并等待人工确认,以及从存储的消息记录中恢复——这两项功能都是Datasette Agent所需的。

现在看来,LLM的形态越来越接近智能体框架。作为一款命令行工具,它能通过单行指令灵活组合不同来源的工具与模型;同时,其Python库功能强大,足以支撑Datasette Agentllm-coding-agent这类系统的开发,这一点让我觉得很有意思。

或许在下一个版本中,我会将"智能体"的概念纳入LLM核心库——不过具体该如何实现,我还在思考。