8月4日、Simon Willisonが「New release of LLM adds support for reasoning traces, OpenAI Responses, server-side tools, and smarter logging」と題した記事を公開した。この記事では、LLMコマンドラインツール「LLM」のバージョン0.32(以下、v0.32)リリースにおける推論トレース表示やサーバーサイドツール対応など、実装者に直結する主要な新機能について詳しく紹介されている。
LLMは、Simon Willisonが開発するオープンソースのCLI&Pythonライブラリで、OpenAI、Anthropic、Geminiなど多数のLLMを統一インターフェースで操作できるツールだ。なお、Willisonはデータ探索・公開ツールのDatasetteの作者としても知られており、LLMはそのエコシステムと深く結びついている。v0.32は「プロジェクト初期リリース以来、最も大きな更新」と位置づけられている。
推論トレースをstderrに流す設計が秀逸
エンジニアにとって最も実用的なのが、推論モデルの「思考過程」をstderrに分離して表示する機能だ。

グレーで表示される「思考テキスト」はstderrに、最終的な回答はstdoutに分離して出力される。これにより、| jqや| grepなどのパイプ処理に推論ノイズが混入しない。-R/--hide-reasoningオプションで非表示にもできる。
推論モデルの出力をパイプで扱う際に思考テキストが邪魔になるという問題は多くのユーザーが抱えていた課題だ。stdout/stderrの役割分担を利用したこの設計はシンプルながら実用的な解決策であり、既存のシェルスクリプトやパイプラインをほぼ変更なしに活用できる点で評価が高い。
Python APIの刷新——メッセージ列を直接渡せるように
v0.32では、Python APIにも大きな変更が加わった。従来のPython APIは「会話を作ってメッセージを順番に送る」という抽象化を強制していた。v0.32ではmodel.prompt(messages=[])パラメータが追加され、完全なメッセージ履歴をそのまま渡せるようになった。これにより、OpenAIやAnthropicなどの公式SDKに慣れた開発者が直感的に扱えるインターフェースが実現している。
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())
ここで使われているgpt-5.6-luna(コード上の識別子はgpt-5.6-luna)は、GPT-5.6 Lunaと呼ばれるモデルだ。OpenAIが提供する推論対応モデル群「GPT-5.6ファミリー」の一つで、低コスト寄りに位置づけられている。
さらに、ストリーミングAPIがイベントベースに刷新された。推論テキスト、通常テキスト、ツール呼び出し、画像などをイベント種別で分岐して処理できる。これにより、たとえば「思考テキストはグレーで表示し、最終回答だけをファイルに保存する」といった細かい制御がアプリケーション側で容易に実装できるようになった。
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}")
サーバーサイドツールをCLIから直接呼び出せる
OpenAIのコード実行環境(Code Interpreter)やWeb検索を、CLIから-Tフラグ一発で呼び出せるようになった。
llm --tool CodeInterpreter 'Show current python and SQLite versions'
Anthropicプラグイン(llm-anthropic)ではWebSearch、WebFetch、CodeExecution、AnthropicMCPの4種類のサーバーサイドツールに対応した。MCPコネクタを使うと、以下のように外部MCPサーバーへのアクセスをAnthropicのAPIに委ねることができる。
llm -m claude-sonnet-5 -T 'AnthropicMCP("https://datasette.simonwillison.net/-/mcp")' \
'how many rows in the blog_blogmark table?'
OpenAI互換エンドポイントへのワンライナー実行
新コマンドllm openai endpointを使うと、設定不要でOpenAI互換の任意のエンドポイントにプロンプトを投げられる。uvxと組み合わせれば、LLMのインストールすら不要だ。以下はローカルのLM Studioで動かすGemma 4 12Bに対してプロンプトを送り、JavaScriptツールも合わせて使う例だ。
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

このコマンドはログに記録されない仕様のため、使い捨てのプロンプト実行に向いている。
コンテンツアドレッサブルなSQLiteログ
マルチターンの会話ログを素朴に保存すると、各ターンのたびに直前までの全メッセージがJSON重複して記録される問題があった。v0.32ではGitのオブジェクトストアを模したコンテンツアドレッサブルなメッセージストアを採用している。コンテンツアドレッサブルとは「同一内容のデータを重複保存しない仕組み」のことで、内容のハッシュ値をキーとして使うため、同じメッセージが何度登場しても実体は一つしか保存されない。これにより、長い会話履歴でもストレージの肥大化を抑えられる。llm logsコマンドは引き続き従来通りの形式で出力するため、既存のワークフローへの影響は最小限だ。
デフォルトモデルはGPT-5.6 Lunaに/既存プラグインの互換性
GPT-5.6ファミリー(OpenAIが提供する推論対応モデル群)がビルトインでサポートされ、引数なしでllm "prompt"を実行した際のデフォルトモデルがGPT-5.6 Luna(低コストモデル)になった。
既存プラグインはそのまま動作する。ただし、新しいストリーミングイベントシステムをフル活用するには各プラグインのv0.32対応アップデートが必要だ。対応方法は公式ドキュメントに記載されている。llm-anthropic、llm-gemini、llm-openrouterは今回同時にアップデートされた。
エージェントフレームワークへの布石
Willisonは「LLMはエージェントフレームワークになりつつある」と率直に認めている。ツールチェーンが人間の承認待ちで一時停止し、保存済みメッセージ履歴から再開できる機能が追加された。これは彼が開発中のDatasette Agent(Datasetteのデータを自然言語で探索するエージェント)から要件として逆輸入された機能だ。Datasetteとの連携を念頭に設計された経緯もあり、LLMはCLIツールという枠を超えてエージェントのランタイム基盤としての性格を強めつつある。
次期バージョンでは「エージェント」の概念をコアライブラリに取り込むことを検討中とのことだが、具体的な形はまだ模索中だという。
詳細はNew release of LLM adds support for reasoning traces, OpenAI Responses, server-side tools, and smarter loggingを参照していただきたい。