{"slug": "llm-0-37-gpt-6-1-sol-and-terra-endpoint-add-and-a-cheaper-default", "title": "LLM 0.37: GPT-6.1 Sol and Terra, Endpoint Add and a Cheaper Default", "summary": "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.", "body_md": "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).\n\nThis 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).\n\n## TL;DR: what changed in LLM 0.37\n\n| Change | What it means for you | \n|---|---|\n| 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 | \n| New `llm openai endpoint add` ,`list` ,`remove` ,`path` | Register OpenAI-compatible servers without editing YAML by hand | \n| Default model is now GPT-6 Luna | New installs and users without a set default pay about half as much, per the author | \n| Embedding models accept typed attachments | Plugins can embed images, audio or video, not only text | \n| `llm chat -u/--usage` | See token usage on standard error after every turn | \n| `chain.on_response(callback)` | Python hook that runs after each response in a tool chain | \n| Python 3.15 supported, 3.10 dropped | Check your environment before upgrading | \n| Retired OpenAI models removed | Old scripts naming `gpt-4` or`o1` will fail | \n\n## What is LLM, and who is it for?\n\nLLM 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.\n\nThat 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.\n\n## New models: GPT-6.1 Sol, Terra and chat-latest\n\nThe 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.\n\nYou can try them as soon as you upgrade and have an OpenAI API key set:\n\n```\nllm install -U llm\nllm keys set openai\nllm -m gpt-6.1-terra \"Explain this error in one paragraph\" < error.log\nllm -m gpt-6.1-sol \"Review this diff for bugs\" < change.diff\n```\n\nIf 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.\n\n## The default model is now GPT-6 Luna\n\nIf 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.\n\nThis 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.\n\nTo keep the old behavior, run:\n\n```\nllm models default gpt-5.6-luna\n```\n\nTo 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.\n\n## `llm openai endpoint add`: OpenAI-compatible servers without YAML\n\nMany 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.\n\nThe new commands manage it:\n\n- `llm openai endpoint add` registers a model that uses an OpenAI-compatible endpoint\n- `llm openai endpoint list` shows the registered entries\n- `llm openai endpoint remove` deletes one\n- `llm openai endpoint path` prints the location of the YAML file\n\nThe [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.\n\nA 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.\n\n## Multimodal embeddings: typed attachments\n\nLLM 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.\n\nThe 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.\n\nWillison'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.\n\nIf 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.\n\n## Tool-chain changes for agent builders\n\nLLM 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.\n\n- **`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.\n- **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.\n- **Schemas apply to every request in a chain** , including the final one. Before, a schema was dropped after the first round of tool calls.\n- **`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.\n- **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.\n- **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.\n\nFor 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.\n\n## Bug fixes worth reading before you upgrade\n\nA sealed evidence bag with linked dots, showing how the LLM 0.37 CLI now logs each tool-chain response as it completes\n\nThe release contains many fixes. These are the ones most likely to change something you see.\n\n| Fix | Why it matters | \n|---|---|\n| `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 | \n| `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 | \n| `SQLITE_BUSY` errors fixed | Multiple processes logging to one database no longer collide | \n| `embed_multi()` raises`ValueError` on a wrong embedding count | Before, rows could be lost or vectors stored against wrong IDs | \n| `Collection.embed()` no longer skips a new ID with duplicate content | Matches `embed_multi()` | \n| `llm logs -s` truncates tool arguments | Short log output stays short | \n| `llm schemas list` handles boolean property definitions | No crash on schemas such as a property set to true | \n| `log_to_db()` on an unread sync response runs it first | The logged turn now includes output and token usage | \n\nThe 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.\n\n## What breaks: removed models and Python 3.10\n\nTwo changes can break existing setups.\n\nFirst, 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.\n\n```\ngrep -rnE \"gpt-4|gpt-3.5|o1|o3-mini|o4-mini|chatgpt\" ~/scripts\n```\n\nSecond, 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.\n\n## A note on AI-assisted contributions\n\nWillison'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.\n\nFor 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.\n\n## How to upgrade safely\n\nA blank terminal window with a green block cursor, ready for the upgrade commands to LLM 0.37\n\n1. Run `llm --version` and note your current version.\n2. Search your scripts for the removed model names.\n3. Upgrade with the tool you installed with, such as `pip install -U llm` ,`uv tool upgrade llm` or`brew upgrade llm` .\n4. Set an explicit default with `llm models default <model>` so future default changes do not surprise you.\n5. If you use embeddings with non-ASCII text, rerun `llm embed-multi --files` on the affected collections to repair them.\n6. If you use `before_call` as an approval gate, retest your tool chains.\n7. Try `llm openai endpoint list` to confirm your existing YAML entries still load.\n\n## What this means for what you build or pay\n\nFor 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.\n\nIf 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](https://agentbeam.com/?ref=explainx), 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.\n\n## Related reading\n\n*Version details are accurate as of November 3, 2026. Check the official release notes for later changes.*", "url": "https://wpnews.pro/news/llm-0-37-gpt-6-1-sol-and-terra-endpoint-add-and-a-cheaper-default", "canonical_source": "https://explainx.ai/blog/llm-0-37-simon-willison-gpt-6-1-sol-terra-openai-compatible-endpoint-add-guide-2026?utm_source=rss&utm_medium=feed&utm_campaign=blog", "published_at": "2026-11-03 00:00:00+00:00", "updated_at": "2026-11-03 01:51:21.125795+00:00", "lang": "en", "topics": ["ai-tools", "developer-tools", "large-language-models", "ai-products"], "entities": ["Simon Willison", "LLM", "OpenAI", "GPT-6.1 Sol", "GPT-6.1 Terra", "GPT-6 Luna", "chat-latest"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/llm-0-37-gpt-6-1-sol-and-terra-endpoint-add-and-a-cheaper-default", "markdown": "https://wpnews.pro/news/llm-0-37-gpt-6-1-sol-and-terra-endpoint-add-and-a-cheaper-default.md", "text": "https://wpnews.pro/news/llm-0-37-gpt-6-1-sol-and-terra-endpoint-add-and-a-cheaper-default.txt", "jsonld": "https://wpnews.pro/news/llm-0-37-gpt-6-1-sol-and-terra-endpoint-add-and-a-cheaper-default.jsonld"}}