Simon Willison released LLM 0.37 on November 2, 2026. It is the first release of his command-line tool and Python library for language models in about two months, and the changelog is long. The headline items are support for OpenAI's GPT-6.1 Sol and Terra models, a new llm openai endpoint add command for registering OpenAI-compatible servers, a cheaper default model, and a typed-attachment API for multimodal embeddings. The author's own announcement post summarizes the release, and the full list is in the GitHub release notes.
This post is a practical upgrade guide. It explains what each change does, what could break in your scripts, and how it fits with the OpenAI models we have already covered, including the GPT-6.1 Sol launch and the GPT-6.1 Terra launch.
TL;DR: what changed in LLM 0.37
| Change | What it means for you |
|---|---|
New models: gpt-6.1-sol, gpt-6.1-terra, chat-latest | Run the newest OpenAI models from the command line with a model ID |
New llm openai endpoint add, list, remove, path | Register OpenAI-compatible servers without editing YAML by hand |
| Default model is now GPT-6 Luna | New installs and users without a set default pay about half as much, per the author |
| Embedding models accept typed attachments | Plugins can embed images, audio or video, not only text |
llm chat -u/--usage | See token usage on standard error after every turn |
chain.on_response(callback) | Python hook that runs after each response in a tool chain |
| Python 3.15 supported, 3.10 dropped | Check your environment before upgrading |
| Retired OpenAI models removed | Old scripts naming gpt-4 or o1 will fail |
What is LLM, and who is it for?
LLM is an open-source command-line tool and Python library by Simon Willison, built around plugins. You install it, add a plugin for a provider or a local runtime, and then run prompts, chat sessions, tool calls, structured-output schemas and embeddings from the shell. Every prompt and response is logged to a local SQLite database, which makes it easy to search what you asked a model last week.
That logging is why developers use it. You can pipe a file into a model, save the result, and later query the database with SQL. We cover a related example of Willison's tooling in our post on his vibe-coded real-time strategy game, which shows the same preference for small, inspectable tools.
New models: GPT-6.1 Sol, Terra and chat-latest
The release adds three OpenAI model IDs. gpt-6.1-sol maps to GPT-6.1 Sol, gpt-6.1-terra maps to GPT-6.1 Terra, and chat-latest maps to OpenAI's Chat Latest alias.
You can try them as soon as you upgrade and have an OpenAI API key set:
llm install -U llm
llm keys set openai
llm -m gpt-6.1-terra "Explain this error in one paragraph" < error.log
llm -m gpt-6.1-sol "Review this diff for bugs" < change.diff
If you are choosing between the two, our earlier posts have the pricing and benchmark details. The Sol launch is covered in GPT-6.1 Sol at DevDay, the cost angle is in Sol and Astra cost efficiency, and Terra's computer-use positioning is in the Terra post. Check OpenAI's model pages for current prices before you run large batches, because prices can change.
The default model is now GPT-6 Luna
If you never set a default model, LLM picks one for you. In 0.37 that default changes to GPT-6 Luna, the model that replaces GPT-5.6 Luna. Willison writes in his announcement that the new default costs half as much as the old one.
This matters because a default is the model you use when you type a quick prompt without thinking. A cheaper default lowers the cost of casual use. It also changes results, since a different model answers the same question.
To keep the old behavior, run:
llm models default gpt-5.6-luna
To see which default you have now, run llm models default. If you want a stable default across upgrades, set it explicitly once. That protects you from the next default change.
llm openai endpoint add: OpenAI-compatible servers without YAML
Many servers speak the OpenAI API format: local runtimes, gateways, and hosted open-weight model providers. LLM has supported them through a file called extra-openai-models.yaml. Before 0.37 you edited that file by hand.
The new commands manage it:
llm openai endpoint addregisters a model that uses an OpenAI-compatible endpointllm openai endpoint listshows the registered entriesllm openai endpoint removedeletes onellm openai endpoint pathprints the location of the YAML file
The LLM documentation on configuring an OpenAI-compatible model has the full options. The change fits a wider trend. Many services now offer an OpenAI-compatible endpoint, and some, such as Meituan's LongCat-2.5 API, also offer an Anthropic-compatible one. See our LongCat-2.5 launch post for that example. A tool that can point at any compatible server in one command makes it cheap to compare providers on your own prompts.
A practical tip: after adding an endpoint, give the model a short alias and run the same prompt against two providers. Because LLM logs every response, you can compare answers and token counts later with a SQL query.
Multimodal embeddings: typed attachments
LLM can embed text and store the vectors in collections. In 0.37, embedding models can now accept typed attachments. An attachment carries a MIME type and the path or URL it came from. Plugins declare the types they support through attachment_types and receive matching inputs as llm.Attachment objects.
The CLI gains new options. llm embed, llm embed-multi and llm similar accept -a/--attachment and --at/--attachment-type. Collections now store the MIME type in a new content_type column, exposed as Entry.content_type in Python.
Willison's announcement says the point is to support models such as Gemini Embedding 2 that embed text, audio, images and video. The core library does not ship such a model, so you still need a plugin for it. The change gives plugin authors a standard way to pass binary input.
If you build search over mixed media, this is the useful part. You can embed screenshots, audio clips and documents into one collection, then run llm similar with a query. Test on a small sample first, since embedding quality differs a lot between models.
Tool-chain changes for agent builders
LLM supports tools: Python functions or toolboxes that a model can call. When a model calls several tools in a row, that sequence is a chain. Several changes in 0.37 affect chains.
chain.on_response(callback)runs a callback for each completed response in a chain. It fires before the chain limit is checked and before that response's tool calls run. That makes it a good place for logging, cost tracking or a safety check.- Chain limit fix. A chain that finishes within its limit no longer raises
Chain limit of N exceeded. The limit now only applies when the last allowed response asks for another round of tool calls. - Schemas apply to every request in a chain, including the final one. Before, a schema was dropped after the first round of tool calls.
before_callandafter_callare kept whenResponse.reply()runs tool calls automatically. The old behavior let a tool thatbefore_callrejected still run. This was a real safety bug, and it is worth knowing about if you usebefore_callas an approval gate.- Errors no longer discard logs.
llm promptandllm chatnow log each response as soon as it completes, so an error or hitting the chain limit keeps the earlier responses. - Missing tools return errors.
Response.execute_tool_calls()now returns an error result for a tool with no implementation instead of raisingValueError, matching the async version.
For background on why tools matter, see our explainer on the Model Context Protocol and the July 2026 stateless MCP spec update. For a wider view of agent loops, our loop engineering guide covers the patterns that tool chains implement.
Bug fixes worth reading before you upgrade
A sealed evidence bag with linked dots, showing how the LLM 0.37 CLI now logs each tool-chain response as it completes
The release contains many fixes. These are the ones most likely to change something you see.
| Fix | Why it matters |
|---|---|
llm chat respects llm logs off | Before, chat logged responses even with logging turned off. If you turned logging off for privacy, earlier chats may have been stored |
llm embed-multi --files stopped corrupting non-ASCII text | Non-ASCII UTF-8 files were mangled. Run the command again; per the notes it re-embeds only the affected files |
SQLITE_BUSY errors fixed | Multiple processes logging to one database no longer collide |
embed_multi() raises ValueError on a wrong embedding count | Before, rows could be lost or vectors stored against wrong IDs |
Collection.embed() no longer skips a new ID with duplicate content | Matches embed_multi() |
llm logs -s truncates tool arguments | Short log output stays short |
llm schemas list handles boolean property definitions | No crash on schemas such as a property set to true |
log_to_db() on an unread sync response runs it first | The logged turn now includes output and token usage |
The logging fix deserves a note. If you ran llm logs off and still used llm chat, check your database. You can find the file with llm logs path and delete rows you did not intend to keep.
What breaks: removed models and Python 3.10
Two changes can break existing setups.
First, 0.37 removes OpenAI models that have been shut down. The release notes list gpt-3.5-turbo, gpt-3.5-turbo-16k, gpt-3.5-turbo-instruct, gpt-4, gpt-4-turbo, gpt-4-turbo-2024-04-09, gpt-4.1-nano, gpt-5.2-chat-latest, o1, o1-2024-12-17, o3-mini and o4-mini, along with aliases such as 3.5, chatgpt, 4 and 4t. Search your shell scripts, cron jobs and notebooks for those names before you upgrade.
grep -rnE "gpt-4|gpt-3.5|o1|o3-mini|o4-mini|chatgpt" ~/scripts
Second, Python 3.10 is no longer supported, and Python 3.15 now is. If your environment uses 3.10, pin the older LLM version or upgrade Python.
A note on AI-assisted contributions
Willison's announcement says the release includes fixes from 12 contributors, almost all of them AI-assisted. He says he treats these as bug reports with attached examples, and that the review burden was smaller than he expected. The changelog credits contributors by name for the bug fixes, which is a good model for open-source projects that now receive many machine-assisted pull requests.
For readers who maintain a project, the takeaway is practical. A report with a reproducing example is valuable whether a person or a model wrote it. The maintainer still decides what to merge.
How to upgrade safely
A blank terminal window with a green block cursor, ready for the upgrade commands to LLM 0.37
- Run
llm --versionand note your current version. - Search your scripts for the removed model names.
- Upgrade with the tool you installed with, such as
pip install -U llm,uv tool upgrade llmorbrew upgrade llm. - Set an explicit default with
llm models default <model>so future default changes do not surprise you. - If you use embeddings with non-ASCII text, rerun
llm embed-multi --fileson the affected collections to repair them. - If you use
before_callas an approval gate, retest your tool chains. - Try
llm openai endpoint listto confirm your existing YAML entries still load.
What this means for what you build or pay
For solo developers, the cheaper default lowers the cost of throwaway prompts, and the endpoint commands make it easier to try a second provider. For teams that script LLM in pipelines, the removed models and the Python version change are the items to check first. For agent builders, the tool-chain fixes close real gaps, and on_response gives a clean place to add monitoring.
If you run agents that can take real actions, a hook is not a guardrail on its own. Treat any approval gate as something to test. AgentBeam, the agent security platform from the explainx.ai team, is built to stop agents before they take dangerous actions, and is one option for teams that need more than a callback.
Related reading
- GPT-6.1 Sol launch, pricing and benchmarks
- GPT-6.1 Terra: $1 / $5 computer-use model
- GPT-6.1 Sol and Astra cost efficiency
- Simon Willison's vibe-coded RTS, Battle Drones
- What is the Model Context Protocol?
- Stateless MCP spec, July 2026
- Loop engineering for coding agents
Version details are accurate as of November 3, 2026. Check the official release notes for later changes.
