cd /news/ai-tools/llm-0-37-gpt-6-1-sol-and-terra-endpo… · home › topics › ai-tools › article
[ARTICLE · art-162857] src=explainx.ai ↗ pub= topic=ai-tools verified=true sentiment=↑ positive

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.

by read10 min views3 publishedNov 3, 2026
LLM 0.37: GPT-6.1 Sol and Terra, Endpoint Add and a Cheaper Default
Image: Explainx (auto-discovered)

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 oro1 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 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 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 raisesChain 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 whenResponse.reply() runs tool calls automatically. The old behavior let a tool thatbefore_call rejected still run. This was a real safety bug, and it is worth knowing about if you usebefore_call as an approval gate.
  • Errors no longer discard logs.llm prompt andllm 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 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 respectsllm 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() raisesValueError 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 orbrew upgrade llm .
  4. Set an explicit default with llm models default <model> so future default changes do not surprise you.
  5. If you use embeddings with non-ASCII text, rerun llm embed-multi --files on the affected collections to repair them.
  6. If you use before_call as an approval gate, retest your tool chains.
  7. Try llm openai endpoint list to 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.

Version details are accurate as of November 3, 2026. Check the official release notes for later changes.

── more in #ai-tools 4 stories · sorted by recency
── more on @simon willison 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
→ Live at https://your-agent.zahid.host ✓
Get free account → Pricing
from €0/mo · no card required
LIVE [news/llm-0-37-gpt-6-1-sol…] indexed:0 read:10min 2026-11-03 · —