Model Updates
Opt in to the signed model lists Weave publishes for its builtin agents, and get new lists without upgrading Weave
Weave’s builtin agents (Loom, Tapestry, Shuttle, Pattern, Thread, Spindle, Weft and Warp) each come with a list of preferred models. The maintainers choose those lists with evals and change them as better models arrive. Normally a new list reaches you only when you upgrade Weave.
With model updates turned on, Weave fetches the latest list from tryweave.io instead, checks its signature, and uses it for the builtin agents. You get the new models without upgrading.
Turn it on
Section titled “Turn it on”Model updates are off unless you turn them on. Add a model_updates block to settings, in your global config (~/.weave/config.weave) to use it everywhere, or in a project’s .weave/config.weave:
settings { model_updates { mode notify # off | notify | auto channel stable # stable | next }}mode |
Checks for new lists | Uses a new list |
|---|---|---|
off |
Never | Never. This is the same as having no block. |
notify |
Yes | When you run weave models apply. |
auto |
Yes | As soon as it is downloaded and verified. |
notify is the recommended mode: you see what would change before it does. auto suits the next channel, where you have already chosen to take changes early.
channel picks which list you follow, and defaults to stable:
stablefollows Weave’s stable releases.nextgets lists first, before they reachstable.
A project’s block overrides the global one, field by field. A project can turn updates off for itself with model_updates { mode off }, and a project block that sets only mode keeps the global channel.
What changes and what doesn’t
Section titled “What changes and what doesn’t”A list can change one thing: the models of Weave’s builtin agents. Your prompts, tool policies, disabled agents, categories, workflows and your own agents stay exactly as you wrote them, and Weave never edits your .weave files to apply a list.
Your own preferences still come first. For each builtin agent, the models Weave tries are, in order:
- the
modelsyou set in your project config, then your global config; - the models from the list you applied;
- the builtin models that came with your version of Weave.
Duplicates are dropped. If none of the recommended models is available to you, the builtin ones behind them still are. To fix one agent’s model regardless of any list, set its models yourself:
agent shuttle { models ["anthropic/claude-sonnet-5-5"]}Category shuttles (shuttle-backend and so on) inherit Shuttle’s models, so they follow Shuttle’s list.
If an applied list can’t be used, for example because it has expired or its file is damaged, Weave ignores it and the agents run on their builtin lists. It is never a config error, and weave models status tells you why.
The first published lists repeat the builtin lists of Weave 0.3.0-next.0, so turning model updates on changes nothing until the maintainers publish a new list. A list changes an agent’s models only after that agent’s evals show the new model does at least as well as the current one.
How each harness uses a list
Section titled “How each harness uses a list”Every supported harness checks for a new list on its own, at most once a day (or an hour after a failed check), and they all share one cache under ~/.weave/cache/model-recommendations/. Whichever checks first updates it for all of them, and the weave models commands use it too.
| Harness | When a new list takes effect |
|---|---|
| OpenCode 2 | Without a restart. The plugin checks when you send a prompt or start a plan, never on a timer. A list it fetches takes effect on a later prompt, after the one whose check found it. A running session keeps its model; new sessions, and later turns whose model Weave picks, use the new list. |
| Claude Code | At the next session. When a session starts, Weave composes the agents from the list already applied, then checks for a newer one, waiting at most two seconds. A list found then is used from the following session. |
| OpenCode 1.x | Not supported. The setting is accepted and has no effect. |
| Copilot CLI | Not supported: Weave doesn’t set agent models on Copilot CLI. |
| Pi | Not yet. |
A list has a section per harness, because the same model is named differently in each. Claude Code’s section uses the tiers opus, sonnet and haiku, and Claude Code maps each tier to its current model, so a new Anthropic model reaches your agents through Claude Code itself.
Commands
Section titled “Commands”The Weave CLI shows and manages the lists. The commands report for OpenCode 2 unless you pass --harness claude-code.
weave models status # mode, channel, the applied list, and where each agent's models come fromweave models update # check tryweave.io now, and print what would changeweave models apply # use the downloaded list (notify mode)weave models pin # copy the applied lists into ~/.weave/config.weavestatusprints your mode and channel, when the applied list was issued and when it expires, a link to the eval run behind it, any newer list waiting forapply, the last check and its error, and each builtin agent’s models with where each one comes from:project,global,recommendedorbuiltin.updatechecks now instead of waiting for the daily check. Inautomode it applies a newer list at once; innotifymode it shows the change and leaves it forapply.applyapplies the listupdate(or a harness) downloaded, and prints the change.pinwrites the applied lists into your global config as explicitmodelslines, after showing you the diff and asking. Your models then stay put whatever is published next, and you can setmode off. It leaves out entries that name a provider (provider/model), because OpenCode 1.x would use them without checking that the provider is connected;--include-qualifiedkeeps them.--yesskips the question.
weave validate also reports your mode and the applied list, and says why a list was not used. Every flag and exit code is in the weave models reference in the Weave repository.
What the check sends
Section titled “What the check sends”Nothing that identifies you or your project. A check is one HTTPS request:
GET https://tryweave.io/models/stable.v1.json(or next.v1.json), with the If-None-Match header from the previous answer so an unchanged list is not downloaded again. It carries no query parameters, account, config, project names or model usage, and Weave adds no other headers. The site sees what any web request reveals: your IP address and the HTTP client Weave runs on. There is no telemetry.
With mode off, or no model_updates block, Weave makes no request at all.
Lists are signed
Section titled “Lists are signed”Each list is signed with an Ed25519 key that the maintainers keep offline. The public keys are built into Weave, and Weave uses a list only after its signature verifies, so a list changed on its way to you, or on the website itself, is rejected and your agents keep the models they had.
Weave also rejects a list that:
- is older than, or the same as, the one you already applied, so an old list can’t be replayed to roll you back;
- was issued before the builtin lists of your version of Weave, or is dated more than a day in the future;
- has expired. Every list expires at most 90 days after it is issued; once yours has, the agents return to their builtin lists until a new one arrives;
- names a different channel, carries anything besides model lists, or is larger than 64 KiB.
Each list links to the eval run that supports it, and weave models status shows that link.
The published lists are at tryweave.io/models/stable.v1.json and tryweave.io/models/next.v1.json. To check one yourself:
curl -sO https://tryweave.io/models/stable.v1.jsonbunx @weaveio/weave-cli@0.3.0-next.0 models check stable.v1.json --envelope