RSS Amplifier

andrew.ooo · Aug 5, 2026

LLM 0.32 Review: Simon Willison's CLI Becomes an Agent

0
Sign in to vote or save

Andrew · andrew.ooo

Key highlights:

• Reasoning traces are now visible on standard error, so you can watch a model "think" without polluting the stdout you pipe into other tools.

• Server-side provider tools land as first-class flags: OpenAI's `CodeInterpreter` and `WebSearch`, plus Anthropic's `WebSearch`, `WebFetch`, `CodeExecution`, and a full `AnthropicMCP` connector.

• The Python API got structured messages and streaming events — you can now iterate over `reasoning`, `text`, tool-call, and attachment events instead of a flat string.

• Tool loops can pause for human approval and resume from stored history — the plumbing behind [Datasette Agent](https://agent.datasette.io/).

• A new Git-style, content-addressed SQLite log store deduplicates the giant repeated JSON blobs that agent conversations produce.

If you have followed the open-source AI tooling scene at all, you have probably run into LLM. It started as a thin CLI wrapper for the OpenAI API and grew, over dozens of releases, into a plugin-driven hub that talks to essentially every model provider that matters — OpenAI, Anthropic, Gemini, Mistral, OpenRouter, and any OpenAI-compatible endpoint you can point it at, including local servers like LM Studio and Ollama.

The pitch has always been Unix-y: LLM is a program that takes text on stdin, sends it to a model, and prints text on stdout. That makes it trivially composable with the rest of your shell. Every prompt and response is logged to a local SQLite database, which turns your entire LLM history into something you can query with SQL.

Version 0.32 is a big deal because it reworks the shape of that data — prompts, responses, tools, and logs — to match what models have actually evolved into. Two years ago a model returned a string. Today it returns a mix of reasoning tokens, output text, tool calls, and image attachments. LLM 0.32 is Willison catching the abstraction up to reality.

The most immediately useful change for daily CLI users. When you run LLM against a reasoning-capable model, the reasoning tokens now stream to standard error, while the actual answer goes to standard output:

llm -m gpt-5.6 "What's a clean way to dedupe a list preserving order?"

You see the model's thinking scroll past in your terminal, but if you pipe the command, only the final answer flows downstream:

This is the release's biggest conceptual jump. Providers increasingly host their own tools — a sandboxed code interpreter, a web search, a fetch — and run them inside a single API round-trip. LLM 0.32 exposes them directly.

llm --tool CodeInterpreter 'Show current python and SQLite versions'

llm --tool WebSearch 'What shipped in Python 3.14 this week?'

This is a condensed version. The full article includes architecture diagrams, code examples, comparison tables, and practical use cases.

👉 Read the complete analysis on andrew.ooo

Topics: llm-cli, simon-willison, datasette, reasoning-traces, server-side-tools

No posts

Read the original on andrewdotooo.substack.com

Comments

Nothing yet. Say the first thing.

    Sign in to join the conversation.