LLM 0.37: GPT-6.1 Sol and Terra, Endpoint Add and a Cheaper Default Simon Willison released LLM 0.37 on November 2, 2026, adding support for OpenAI's GPT-6.1 Sol and GPT-6.1 Terra models plus a `chat-latest` alias, and switching the tool's default model to GPT-6 Luna, which Willison says costs about half as much. The release also introduces `llm openai endpoint add`, `list`, `remove` and `path` commands for registering OpenAI-compatible servers without hand-editing YAML, a typed-attachment API that lets embedding plugins handle images, audio and video, a `llm chat -u/--usage` flag that prints token usage to standard error, and a `chain.on_response(callback)` Python hook. LLM 0.37 supports Python 3.15 and drops Python 3.10, and removes retired OpenAI models, so scripts naming `gpt-4` or `o1` will fail. 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 https://simonwillison.net/2026/Nov/2/llm/?ref=explainx summarizes the release, and the full list is in the GitHub release notes https://github.com/simonw/llm/releases/tag/0.37?ref=explainx . 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 https://explainx.ai/blog/gpt-6-1-sol-launch-pricing-benchmarks-2026 and the GPT-6.1 Terra launch https://explainx.ai/blog/gpt-6-1-terra-launch-1-5-dollar-pricing-computer-use-benchmarks-2026 . 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 https://explainx.ai/blog/battle-drones-simon-willison-vibe-coded-rts-audio-multiplayer-claude-code-321-commits-2026 , 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 https://developers.openai.com/api/docs/models/gpt-6.1-sol?ref=explainx , gpt-6.1-terra maps to GPT-6.1 Terra https://developers.openai.com/api/docs/models/gpt-6.1-terra?ref=explainx , 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 https://explainx.ai/blog/gpt-6-1-sol-launch-pricing-benchmarks-2026 , the cost angle is in Sol and Astra cost efficiency https://explainx.ai/blog/gpt-6-1-sol-astra-cost-efficiency-2026 , and Terra's computer-use positioning is in the Terra post https://explainx.ai/blog/gpt-6-1-terra-launch-1-5-dollar-pricing-computer-use-benchmarks-2026 . 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 https://developers.openai.com/api/docs/models/gpt-6-luna?ref=explainx , 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 add registers a model that uses an OpenAI-compatible endpoint - llm openai endpoint list shows the registered entries - llm openai endpoint remove deletes one - llm openai endpoint path prints the location of the YAML file The LLM documentation on configuring an OpenAI-compatible model https://llm.datasette.io/en/stable/other-models.html?ref=explainx configure-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 https://explainx.ai/blog/meituan-longcat-2-5-launch-api-1m-context-10-million-free-tokens-anthropic-compatible-endpoint-2026 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 call and after call are kept when Response.reply runs tool calls automatically. The old behavior let a tool that before call rejected still run. This was a real safety bug, and it is worth knowing about if you use before call as an approval gate. - Errors no longer discard logs. llm prompt and llm chat now 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 raising ValueError , matching the async version. For background on why tools matter, see our explainer on the Model Context Protocol https://explainx.ai/blog/what-is-mcp-model-context-protocol-guide and the July 2026 stateless MCP spec update https://explainx.ai/blog/mcp-2026-07-28-stateless-spec-july-2026 . For a wider view of agent loops, our loop engineering guide https://explainx.ai/blog/loop-engineering-coding-agents-claude-code-guide-2026 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 1. Run llm --version and note your current version. 2. Search your scripts for the removed model names. 3. Upgrade with the tool you installed with, such as pip install -U llm , uv tool upgrade llm or brew upgrade llm . 4. Set an explicit default with llm models default