翻訳待ち:New release of LLM adds support for reasoning traces, OpenAI Responses, server-side tools, and smarter logging
AI サービスが一時的に利用できないため、復旧後に翻訳を補完します。ソース概要:<p>I released <a href="https://llm.datasette.io/en/stable/changelog.html#v0-32">LLM 0.32</a> this morning, the most significant new version of LLM since the initial launch of the project. The new version includes support for visible reasoning traces, server-side provider tools, redesigned content-addressable SQLite logs, new models, and new features enabled by the OpenAI Responses API. I also released new versions of the <code>llm-anthropic</code>, <code>llm-gemini</code>, and <code>llm-openrouter</code> plugins, each with substantial updates of their own.</p> <h4 id="headline-features-for-llm-cli-users">Headline features for LLM CLI users</h4> <p>Running LLM against reasoning models now <strong>displays their reasoning traces</strong> to standard error, so you can see what they are "thinking" without that information being included in the standard output that you might pipe to another tool. Add <code>-R/--hide-reasoning</code> to turn this off.</p> <p><img src="https://static.simonwillison.net/static/2026/best-pelicans.gif" alt="Running llm "think about the best thing about pelicans" in the macOS terminal window - grey text outputs saying Exploring pelican qualities, then after a paragraph of that a white paragraph of text comes out saying: 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." style="max-width: 100%;" /></p> <p>LLM includes support out-of-the-box for the <strong>GPT-5.6 model family</strong>, and the new default model used with <code>llm "prompt"</code> is now the inexpensive but capable <strong>GPT-5.6 Luna</strong>.</p> <p>LLM calls can now use <strong>server-side tools</strong> from various providers. OpenAI provide <a href="https://llm.datasette.io/en/stable/openai-models.html#code-interpreter">a code execution environment</a> as a server-side tool; LLM can now run prompts that benefit from that like so:</p> <div class="highlight highlight-source-shell"><pre>llm --tool CodeInterpreter <span class="pl-s"><span class="pl-pds">'</span>Show current python and SQLite versions<span class="pl-pds">'</span></span></pre></div> <p>OpenAI also gets a <a href="https://llm.datasette.io/en/stable/openai-models.html#web-search">WebSearch</a> tool.</p> <p>The <a href="https://github.com/simonw/llm-anthropic">llm-anthropic</a> plugin adds <a href="https://github.com/simonw/llm-anthropic/blob/0.26/README.md#web-search">WebSearch</a>, <a href="https://github.com/simonw/llm-anthropic/blob/0.26/README.md#web-fetch">WebFetch</a>, <a href="https://github.com/simonw/llm-anthropic/blob/0.26/README.md#code-execution">CodeExecution</a>, and <a href="https://github.com/simonw/llm-anthropic/blob/0.26/README.md#mcp-connector">AnthropicMCP</a>, which looks like this:</p> <div class="highlight highlight-source-shell"><pre>llm -m claude-sonnet-5 -T <span class="pl-s"><span class="pl-pds">'</span>AnthropicMCP("https://datasette.simonwillison.net/-/mcp")<span class="pl-pds">'</span></span> \ <span class="pl-s"><span class="pl-pds">'</span>how many rows in the blog_blogmark table?<span class="pl-pds">'</span></span></pre></div> <p>That causes Anthropic to execute MCP calls against my new <a href="https://simonwillison.net/2026/Jul/31/stateless-mcp/#datasette-mcp">datasette-mcp</a> plugin as part of a single request/response interaction with their API.</p> <p>The new <strong>llm openai endpoint</strong> command provides a tool for <a href="https://llm.datasette.io/en/stable/other-models.html#run-against-an-endpoint-without-configuring-it">executing prompts against <em>any</em> OpenAI compatible endpoint</a> as a one-liner. These aren't logged, which makes this a handy tool for running one-off prompts against anything that speaks the lingua franca of the LLM API world.</p> <p>Here's how I use that to run prompts against Gemma 4 12B running in my localhost <a href="https://lmstudio.ai">LM Studio</a> API, via <code>uvx</code> (no LLM installation required) and mixing in the <a href="https://github.com/simonw/llm-tools-quickjs">llm-tools-quickjs</a> tool plugin for good measure:</p> <div class="highlight highlight-source-shell"><pre>uvx --with llm-tools-quickjs \ llm openai endpoint http://localhost:1234/v1 -m google/gemma-4-12b \ -T QuickJS <span class="pl-s"><span class="pl-pds">'</span>Use QuickJS to multiply 3434 * 2434<span class="pl-pds">'</span></span> --td</pre></div> <p><img src="https://static.simonwillison.net/static/2026/openai-endpoint-gemma.webp" alt="Output reads Tool call: QuickJS_execute_javascript({'javascript': '3434 * 2434'}) 8358356 The result of 3434 * 2434 is 8,358,356." style="max-width: 100%;" /></p> <h4 id="new-features-in-the-python-api">New features in the Python API</h4> <p>LLM's Python API previously required you to create a conversation and then send messages to it one at a time. This was an abstraction over the true nature of LLMs, where each request carries a complete history of the messages that came before it. That abstraction started to get in the way for some more advanced cases, so the new release introduces a <code>model.prompt(messages=[])</code> parameter that can be used like this:</p> <pre><span class="pl-k">import</span> <span class="pl-s1">llm</span> <span class="pl-k">from</span> <span class="pl-s1">llm</span> <span class="pl-k">import</span> <span class="pl-s1">user</span>, <span class="pl-s1">assistant</span>, <span class="pl-s1">system</span> <span class="pl-s1">model</span> <span class="pl-c1">=</span> <span class="pl-s1">llm</span>.<span class="pl-c1">get_model</span>(<span class="pl-s">"gpt-5.6-luna"</span>) <span class="pl-s1">response</span> <span class="pl-c1">=</span> <span class="pl-s1">model</span>.<span class="pl-c1">prompt</span>(<span class="pl-s1">messages</span><span class="pl-c1">=</span>[ <span class="pl-en">system</span>(<span class="pl-s">"You are a helpful pirate."</span>), <span class="pl-en">user</span>(<span class="pl-s">"What is the capital of France?"</span>), <span class="pl-en">assistant</span>(<span class="pl-s">"Paris, matey."</span>), <span class="pl-en">user</span>(<span class="pl-s">"And Germany?"</span>), ]) <span class="pl-en">print</span>(<span class="pl-s1">response</span>.<span class="pl-c1">text</span>())</pre> <p>LLM previously returned an iterable sequence of strings from each prompt. This worked great when models returned a string response, but failed to predict the weird shape that models would evolve towards. Today many models return a mix of reasoning text, output strings, tool calls, and even image attachments. With LLM 0.32 you can <a href="https://llm.datasette.io/en/stable/python-api.html#structured-messages-and-streaming-events">do this instead</a>:</p> <pre><span class="pl-k">for</span> <span class="pl-s1">event</span> <span class="pl-c1">in</span> <span class="pl-s1">model</span>.<span class="pl-c1">prompt</span>(<span class="pl-s">"Explain cats"</span>).<span class="pl-c1">stream_events</span>(): <span class="pl-k">if</span> <span class="pl-s1">event</span>.<span class="pl-c1">type</span> <span class="pl-c1">==</span> <span class="pl-s">"reasoning"</span>: <span class="pl-en">print</span>(<span class="pl-s">f"[thinking] <span class="pl-s1"><span class="pl-kos">{</span><span class="pl-s1">event</span>.<span class="pl-c1">chunk</span><span class="pl-kos">}</span></span>"</span>, <span class="pl-s1">end</span><span class="pl-c1">=</span><span class="pl-s">""</span>, <span class="pl-s1">flush</span><span class="pl-c1">=</span><span class="pl-c1">True</span>) <span class="pl-k">elif</span> <span class="pl-s1">event</span>.<span class="pl-c1">type</span> <span class="pl-c1">==</span> <span class="pl-s">"text"</span>: <span class="pl-en">print</span>(<span class="pl-s1">event</span>.<span class="pl-c1">chunk</span>, <span class="pl-s1">end</span><span class="pl-c1">=</span><span class="pl-s">""</span>, <span class="pl-s1">flush</span><span class="pl-c1">=</span><span class="pl-c1">True</span>) <span class="pl-k">else</span>: <span class="pl-en">print</span>(<span class="pl-s">f"Other event: <span class="pl-s1"><span class="pl-kos">{</span><span class="pl-s1">event</span><span class="pl-kos">}</span></span>"</span>)</pre> <p>Combine these features and we can <em>finally</em> provide a robust implementation of the semi-standard OpenAI chat completions API, which I've now released as the <a href="https://github.com/simonw/llm-chat-completions-server">llm-chat-completions-server</a> plugin:</p> <div class="highlight highlight-source-shell"><pre>llm install llm-chat-completions-server llm chat-completions-server --port 9000 <span class="pl-c"><span class="pl-c">#</span> Server is now running on http://127.0.0.1:9000/v1</span></pre></div> <p>Now you can run prompts against LLM via that server, using the new <code>llm openai endpoint</code> command!</p> <div class="highlight highlight-source-shell"><pre>llm openai endpoint http://127.0.0.1:9000/v1 <span class="pl-s"><span class="pl-pds">'</span>hello<span class="pl-pds">'</span></span> -m gpt-5.4-mini</pre></div> <p>The bigger challenge with that kind of API concerns logging. If we're going to support the pattern where the message sequence is appended to on every request, ideally we can avoid logging all of that duplicate JSON for every turn.</p> <p>The solution is the new <a href="https://llm.datasette.io/en/stable/logging.html#the-message-store">content-addressable message store</a>, modeled after Git. You can see the new schema for that <a href="https://llm.datasette.io/en/stable/logging.html#sql-schema">in the documentation</a>, but the <code>llm logs</code> and <code>llm logs --json</code> commands have both been upgraded to convert that format back into something that's easy to consume.</p> <h4 id="and-the-rest">And the rest</h4> <p>There is a whole lot more in this release. The <a href="https://llm.datasette.io/en/stable/changelog.html#v0-32">0.32 release notes</a> are pretty comprehensive, and the notes for <a href="https://llm.datasette.io/en/stable/changelog.html#rc2-2026-07-30">0.32rc2</a>, <a href="https://llm.datasette.io/en/stable/changelog.html#rc1-2026-07-30">0.32rc</a>, <a href="https://llm.datasette.io/en/stable/changelog.html#a3-2026-06-09">0.32a3</a>, <a href="https://llm.datasette.io/en/stable/changelog.html#a2-2026-05-12">0.32a2</a>, and <a href="https://llm.datasette.io/en/stable/changelog.html#a0-2026-04-28">0.32a0</a> should fill in any gaps.</p> <p>Existing LLM plugins should all continue to work, but plugins that provide extra models will need to be upgraded to 0.32 in order to participate fully in the new streaming events system. There's a guide to implementing plugins with <a href="https://llm.datasette.io/en/stable/plugins/advanced-model-plugins.html#structured-messages-and-streaming-events">Structured messages and streaming events</a> in the documentation.</p> <p>I've updated some of my own plugins:</p> <ul> <li> <a href="https://github.com/simonw/llm-anthropic/releases/tag/0.26">llm-anthropic 0.26</a> adds support for the Claude 5 family of models, plus <code>WebSearch</code>, <code>WebFetch</code>, <code>CodeExecution</code>, and <code>AnthropicMCP</code> server-side tools.</li> <li> <a href="https://github.com/simonw/llm-gemini">llm-gemini</a> and <a href="https://github.com/simonw/llm-openrouter">llm-openrouter</a> and <a href="https://github.com/simonw/llm-mistral">llm-mistral</a> are nearly there, releases coming soon.</li> </ul> <h4 id="i-guess-llm-is-an-agent-framework-now">I guess LLM is an agent framework now</h4> <p>Quite a few of the lower-level tools changes in this release were driven by the needs of <a href="https://agent.datasette.io/">Datasette Agent</a>. When I started work on LLM, the term "agent" had such a vague definition that I refused to use it. In <a href="https://simonwillison.net/2025/Sep/18/agents/">September 2025</a> I came around to the idea that "<strong>An LLM agent runs tools in a loop to achieve a goal</strong>" is well established enough now that I could stop avoiding the term entirely.</p> <p>Tool chains can now <a href="https://llm.datasette.io/en/stable/python-api.html#python-api-tools-pause">pause for human approval</a> and <a href="https://llm.datasette.io/en/stable/python-api.html#python-api-tools-resume">resume from a stored message history</a> - both needed by Datasette Agent.</p> <p>Looking at LLM today it's beginning to look very agent-shaped to me. There's something neat about having a CLI utility that can mix and match different tools from different sources with different models all as a one-liner, and that includes a Python library powerful enough to build systems like <a href="https://agent.datasette.io/">Datasette Agent</a> and <a href="https://github.com/simonw/llm-coding-agent">llm-coding-agent</a>.</p> <p>Maybe the next version of LLM will bake the concept of an "agent" into the core library. I'm still trying to figure out what that would look like.</p> <p>Tags: <a href="https://simonwillison.net/tags/projects">projects</a>, <a href="https://simonwillison.net/tags/releases">releases</a>, <a href="https://simonwillison.net/tags/ai">ai</a>, <a href="https://simonwillison.net/tags/openai">openai</a>, <a href="https://simonwillison.net/tags/generative-ai">generative-ai</a>, <a href="https://simonwillison.net/tags/llms">llms</a>, <a href="https://simonwillison.net/tags/llm">llm</a>, <a href="https://simonwillison.net/tags/anthropic">anthropic</a></p>
AI サービスが一時的に利用できないため、復旧後に翻訳を補完します。
New release of LLM adds support for reasoning traces, OpenAI Responses, server-side tools, and smarter logging Simon Willison’s Weblog Subscribe New release of LLM adds support for reasoning traces, OpenAI Responses, server-side tools, and smarter logging 4th August 2026 I released LLM 0.32 this morning, the most significant new version of LLM since the initial launch of the project. The new version includes support for visible reasoning traces, server-side provider tools, redesigned content-addressable SQLite logs, new models, and new features enabled by the OpenAI Responses API. I also released new versions of the llm-anthropic, llm-gemini, and llm-openrouter plugins, each with substantial updates of their own. Headline features for LLM CLI users Running LLM against reasoning models now displays their reasoning traces to standard error, so you can see what they are “thinking” without that information being included in the standard output that you might pipe to another tool. Add -R/--hide-reasoning to turn this off. LLM includes support out-of-the-box for the GPT-5.6 model family, and the new default model used with llm "prompt" is now the inexpensive but capable GPT-5.6 Luna. LLM calls can now use server-side tools from various providers. OpenAI provide a code execution environment as a server-side tool; LLM can now run prompts that benefit from that like so: llm --tool CodeInterpreter 'Show current python and SQLite versions' OpenAI also gets a WebSearch tool. The llm-anthropic plugin adds WebSearch, WebFetch, CodeExecution, and AnthropicMCP, which looks like this: llm -m claude-sonnet-5 -T 'AnthropicMCP("https://datasette.simonwillison.net/-/mcp")' \ 'how many rows in the blog_blogmark table?' That causes Anthropic to execute MCP calls against my new datasette-mcp plugin as part of a single request/response interaction with their API. The new llm openai endpoint command provides a tool for executing prompts against any OpenAI compatible endpoint as a one-liner. These aren’t logged, which makes this a handy tool for running one-off prompts against anything that speaks the lingua franca of the LLM API world. Here’s how I use that to run prompts against Gemma 4 12B running in my localhost LM Studio API, via uvx (no LLM installation required) and mixing in the llm-tools-quickjs tool plugin for good measure: 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 New features in the Python API LLM’s Python API previously required you to create a conversation and then send messages to it one at a time. This was an abstraction over the true nature of LLMs, where each request carries a complete history of the messages that came before it. That abstraction started to get in the way for some more advanced cases, so the new release introduces a model.prompt(messages=[]) parameter that can be used like this: 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 previously returned an iterable sequence of strings from each prompt. This worked great when models returned a string response, but failed to predict the weird shape that models would evolve towards. Today many models return a mix of reasoning text, output strings, tool calls, and even image attachments. With LLM 0.32 you can do this instead: 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}") Combine these features and we can finally provide a robust implementation of the semi-standard OpenAI chat completions API, which I’ve now released as the llm-chat-completions-server plugin: llm install llm-chat-completions-server llm chat-completions-server --port 9000 # Server is now running on http://127.0.0.1:9000/v1 Now you can run prompts against LLM via that server, using the new llm openai endpoint command! llm openai endpoint http://127.0.0.1:9000/v1 'hello' -m gpt-5.4-mini The bigger challenge with that kind of API concerns logging. If we’re going to support the pattern where the message sequence is appended to on every request, ideally we can avoid logging all of that duplicate JSON for every turn. The solution is the new content-addressable message store, modeled after Git. You can see the new schema for that in the documentation, but the llm logs and llm logs --json commands have both been upgraded to convert that format back into something that’s easy to consume. And the rest There is a whole lot more in this release. The 0.32 release notes are pretty comprehensive, and the notes for 0.32rc2, 0.32rc, 0.32a3, 0.32a2, and 0.32a0 should fill in any gaps. Existing LLM plugins should all continue to work, but plugins that provide extra models will need to be upgraded to 0.32 in order to participate fully in the new streaming events system. There’s a guide to implementing plugins with Structured messages and streaming events in the documentation. I’ve updated some of my own plugins: llm-anthropic 0.26 adds support for the Claude 5 family of models, plus WebSearch, WebFetch, CodeExecution, and AnthropicMCP server-side tools. llm-gemini and llm-openrouter and llm-mistral are nearly there, releases coming soon. I guess LLM is an agent framework now Quite a few of the lower-level tools changes in this release were driven by the needs of Datasette Agent. When I started work on LLM, the term “agent” had such a vague definition that I refused to use it. In September 2025 I came around to the idea that "An LLM agent runs tools in a loop to achieve a goal" is well established enough now that I could stop avoiding the term entirely. Tool chains can now pause for human approval and resume from a stored message history—both needed by Datasette Agent. Looking at LLM today it’s beginning to look very agent-shaped to me. There’s something neat about having a CLI utility that can mix and match different tools from different sources with different models all as a one-liner, and that includes a Python library powerful enough to build systems like Datasette Agent and llm-coding-agent. Maybe the next version of LLM will bake the concept of an “agent” into the core library. I’m still trying to figure out what that would look like. More recent articles Stateless MCP has recaptured my interest (and inspired mcp-explorer and datasette-mcp) - 31st July 2026 OpenAI’s accidental cyberattack against Hugging Face is science fiction that happened - 22nd July 2026 This is New release of LLM adds support for reasoning traces, OpenAI Responses, server-side tools, and smarter logging by Simon Willison, posted on 4th August 2026. Part of series New releases of LLM Large Language Models can run tools in your terminal with LLM 0.26 - May 27, 2025, 8:35 p.m. LLM 0.27, the annotated release notes: GPT-5 and improved tool calling - Aug. 11, 2025, 11:57 p.m. LLM 0.32a0 is a major backwards-compatible refactor - April 29, 2026, 7:01 p.m. New release of LLM adds support for reasoning traces, OpenAI Responses, server-side tools, and smarter logging - Aug. 4, 2026, 11:58 p.m. projects 551 releases 28 ai 2,166 openai 442 generative-ai 1,918 llms 1,884 llm 618 anthropic 322 Previous: Stateless MCP has recaptured my interest (and inspired mcp-explorer and datasette-mcp) Monthly briefing Sponsor me for $10/month and get a curated email digest of the month's most important LLM developments. Pay me to send you less! Sponsor & subscribe Disclosures Colophon © 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026