New release of LLM adds support for reasoning traces, OpenAI Responses, server-side tools, and smarter logging

Simon Willison

LLM 新版本支援推理軌跡、OpenAI Responses、伺服器端工具與更智慧的日誌功能

原文由 Simon Willison 發布,訂閱此部落格

今天早上我發布了LLM 0.32,這是自專案最初發布以來最重要的一次改版。新版支援可視化的推理軌跡、由供應商提供的伺服器端工具、重新設計的內容定址 SQLite 日誌、新模型,以及透過 OpenAI Responses API 帶來的新功能。我也同步發布了llm-anthropic 外掛的新版本,本身也有大幅更新。

給 LLM CLI 使用者的亮點功能

現在用 LLM 執行推理模型時,會將其推理軌跡顯示到 standard error,讓你能看到模型在「思考」什麼,而這些資訊不會混入你可能會導向(pipe)到其他工具的標準輸出。加上 -R/--hide-reasoning 即可關閉此功能。

在 macOS 終端機視窗中執行 llm 「think about the best thing about pelicans」——灰色文字輸出顯示 Exploring pelican qualities,接著一段推理過程後,出現一段白色文字:「The best thing about pelicans is their wonderfully oversized, practical design: that enormous bill and pouch look comical, but they make pelicans remarkably skilled fishers. Even better, many species cooperate—working together to herd fish before scooping them up. They’re a great mix of goofy, graceful, and surprisingly clever.」

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 世界共通語言的服務執行一次性提示。

以下是我如何透過 uvx(無需安裝 LLM)搭配 llm-tools-quickjs 工具外掛,來對在本機 LM Studio API 上執行的 Gemma 4 12B 下提示的範例:

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

輸出顯示工具呼叫:QuickJS_execute_javascript({'javascript': '3434 * 2434'})  8358356 The result of 3434 * 2434 is 8,358,356.

Python API 的新功能

LLM 的 Python API 過去需要你先建立一個對話,然後一次發送一則訊息。這是對 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 chat completions API 提供一個穩健的實作,我已將其作為 llm-chat-completions-server 外掛發布:

llm install llm-chat-completions-server
llm chat-completions-server --port 9000
# Server is now running on 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 現在也算是一個 Agent 框架了

這次版本中不少底層工具的變更,都是為了滿足 Datasette Agent 的需求。當初開始開發 LLM 時,「agent」這個詞的定義還非常模糊,所以我刻意避免使用。在2025 年 9 月,我逐漸接受了「An LLM agent runs tools in a loop to achieve a goal」(LLM Agent 會在迴圈中執行工具以達成目標)這個說法已經足夠普及,讓我可以不再迴避這個詞彙。

工具鏈現在可以暫停以等待人工核准,並從已儲存的訊息歷史中恢復——這兩項都是 Datasette Agent 所需要的。

以今天的 LLM 來看,它在我眼中已經越來越像一個 Agent 框架了。能有一個 CLI 工具,用一行指令就能混合搭配來自不同來源、不同模型的多種工具,同時還包含一個強大到足以打造 Datasette Agentllm-coding-agent 這類系統的 Python 函式庫,確實很有意思。

或許下一個版本的 LLM 會直接把「agent」的概念內建到核心函式庫中。我還在思考那會是什麼樣子。

本文章由 muse-spark-1.2-contributor 進行翻譯

留言