Nexus model updates
Each provider keeps a static model catalog at
src/services/llm/adapters/<provider>/<Provider>Models.ts: an array of
ModelSpec literals plus a *_DEFAULT_MODEL export. Two aggregators read those
arrays, and between them they decide what the model picker offers, what a call
costs, and which UI affordances appear.
Nothing here holds model ids, prices, context windows or provider lists — the
registries are the truth and they change weekly. This skill holds the procedure
and the checks. To see what the tree currently declares:
python3 .claude/skills/nexus-model-updates/scripts/check_model_registry.py \
--repo-root . --list
Workflow
- A model in a provider that already has a registry — follow
protocols/add-model.md. Get every number from the provider's own source;
values carried over from another gateway's entry are wrong more often than
they are right.
- Moving a provider's default — follow
protocols/change-default.md. The
default is written in several independent places and TypeScript checks none of
them against each other, so you MUST work that protocol rather than editing
the one you happened to find.
- A provider with no registry yet — follow
protocols/add-provider-registry.md. Adapter wiring belongs to
nexus-llm-adapters; only the catalog and its aggregator entries are yours.
- An image generation model — follow
protocols/add-image-model.md. Image
models live in the image adapters' own catalogs, not in <Provider>Models.ts,
the structural gate does not see them, and the committed tool catalogs embed
their enum.
- Before calling any of the above done — run
protocols/verify-model.md. You
MUST get a zero exit from
scripts/check_model_registry.py --repo-root . <provider>, and you MUST NOT
report a model as working on the strength of a registry entry: the entry is a
claim about an id, and only a live call tests it.
- End of a session that used this skill — run
protocols/self-refine.md.
Map
protocols/ the procedures: add-model, add-image-model, change-default,
add-provider-registry, verify-model, self-refine.
references/ mechanism, read on demand: registry-anatomy.md (what a
ModelSpec field means and how to fill it), consumers.md (who reads the
registries and what silently breaks when metadata is wrong),
smoke-harness.md (the live provider smoke lane in detail).
scripts/check_model_registry.py — the structural gate: required fields,
provider/directory agreement, unreachable duplicate ids, defaults that point at
nothing, adapter literals that drifted from the registry, and registries wired
into one aggregator but not the other. Run it; do not re-derive it by reading
source.
Siblings — do not duplicate them here
nexus-llm-adapters owns adapter wiring: transport, streaming, reasoning
rendering, and the provider registration points outside the model catalog.
nexus-model-eval owns grading a model on Nexus tool use. A smoke test
proves the id returns text; it proves nothing about tool calling, and a model
that passes smoke can still be unusable in chat.
nexus-eval-harness owns running and changing the eval harness itself.
nexus-testing owns which Jest lane to use and what a mock can prove.
Refine
At the end of a session that used this skill, run protocols/self-refine.md and
append to refinement-log.md.
1---2name: nexus-model-updates3description: Add, change or verify a Nexus LLM model definition — the registry entry, the provider default, and proof the model id actually works against the live endpoint. Use when adding a newly released model, editing model metadata such as pricing, context window or capability flags, promoting a provider default, standing up a model registry for a new provider, or checking whether a model id resolves through the live provider smoke lane.4---56# Nexus model updates78Each provider keeps a static model catalog at9`src/services/llm/adapters/<provider>/<Provider>Models.ts`: an array of10`ModelSpec` literals plus a `*_DEFAULT_MODEL` export. Two aggregators read those11arrays, and between them they decide what the model picker offers, what a call12costs, and which UI affordances appear.1314Nothing here holds model ids, prices, context windows or provider lists — the15registries are the truth and they change weekly. This skill holds the procedure16and the checks. To see what the tree currently declares:1718```bash19python3 .claude/skills/nexus-model-updates/scripts/check_model_registry.py \20 --repo-root . --list21```2223## Workflow241. **A model in a provider that already has a registry** — follow25 `protocols/add-model.md`. Get every number from the provider's own source;26 values carried over from another gateway's entry are wrong more often than27 they are right.282. **Moving a provider's default** — follow `protocols/change-default.md`. The29 default is written in several independent places and TypeScript checks none of30 them against each other, so you MUST work that protocol rather than editing31 the one you happened to find.323. **A provider with no registry yet** — follow33 `protocols/add-provider-registry.md`. Adapter wiring belongs to34 `nexus-llm-adapters`; only the catalog and its aggregator entries are yours.354. **An image generation model** — follow `protocols/add-image-model.md`. Image36 models live in the image adapters' own catalogs, not in `<Provider>Models.ts`,37 the structural gate does not see them, and the committed tool catalogs embed38 their enum.395. **Before calling any of the above done** — run `protocols/verify-model.md`. You40 MUST get a zero exit from41 `scripts/check_model_registry.py --repo-root . <provider>`, and you MUST NOT42 report a model as working on the strength of a registry entry: the entry is a43 claim about an id, and only a live call tests it.446. **End of a session that used this skill** — run `protocols/self-refine.md`.4546## Map47- `protocols/` the procedures: add-model, add-image-model, change-default,48 add-provider-registry, verify-model, self-refine.49- `references/` mechanism, read on demand: `registry-anatomy.md` (what a50 `ModelSpec` field means and how to fill it), `consumers.md` (who reads the51 registries and what silently breaks when metadata is wrong),52 `smoke-harness.md` (the live provider smoke lane in detail).53- `scripts/check_model_registry.py` — the structural gate: required fields,54 provider/directory agreement, unreachable duplicate ids, defaults that point at55 nothing, adapter literals that drifted from the registry, and registries wired56 into one aggregator but not the other. Run it; do not re-derive it by reading57 source.5859## Siblings — do not duplicate them here60- **`nexus-llm-adapters`** owns adapter wiring: transport, streaming, reasoning61 rendering, and the provider registration points outside the model catalog.62- **`nexus-model-eval`** owns grading a model on Nexus tool use. A smoke test63 proves the id returns text; it proves nothing about tool calling, and a model64 that passes smoke can still be unusable in chat.65- **`nexus-eval-harness`** owns running and changing the eval harness itself.66- **`nexus-testing`** owns which Jest lane to use and what a mock can prove.6768## Refine69At the end of a session that used this skill, run `protocols/self-refine.md` and70append to `refinement-log.md`.