diff --git a/CHANGELOG.md b/CHANGELOG.md index 827b45e..25053c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + +### Changed + +- **Default `sonnet` alias → `claude-sonnet-5`.** The `sonnet` alias (the model used for every `/v1/chat/completions` request that omits `model`, and OpenClaw's OCP primary via `ocp-connect`) now resolves to `claude-sonnet-5` instead of `claude-sonnet-4-6`. `claude-sonnet-4-6` remains available by full ID for pinning. This is a behavior change for clients relying on the default — pin `claude-sonnet-4-6` explicitly to retain the previous model. Split out from the additive `claude-sonnet-5` model entry (#152) per Iron Rule 11. + ## v3.22.1 — 2026-07-17 Minor release: TUI-mode latency and streaming features — **all opt-in and off by default**, so the default request path (`-p` / `--output-format stream-json`) is byte-for-byte unchanged — plus hardening from an independent (Codex) re-review of the streaming work, Windows `claude.exe` startup resolution, and the Claude Sonnet 5 model entry. No new `cli.js` wire behavior and no new endpoint; the new surface is entirely OCP-owned TUI-mode configuration (env vars), startup binary discovery, model metadata, and `/health` observation. Every code PR carried a fresh-context reviewer (Iron Rule 10). (Version note: v3.22.0 was prepared but never tagged; its contents ship here as v3.22.1 together with the additions below.) diff --git a/README.md b/README.md index 7752cc0..c4c1e54 100644 --- a/README.md +++ b/README.md @@ -716,8 +716,8 @@ Any tool use happens server-side, under the `--allowedTools` set configured on t | `claude-opus-4-8` | Most capable (default for `opus` alias) | | `claude-opus-4-7` | Previous Opus, retained for pinning | | `claude-opus-4-6` | Older Opus, retained for pinning | -| `claude-sonnet-5` | Latest Sonnet (available by full ID; `sonnet` alias repoint tracked separately) | -| `claude-sonnet-4-6` | Good balance of speed/quality (default for `sonnet` alias) | +| `claude-sonnet-5` | Latest Sonnet (default for `sonnet` alias) | +| `claude-sonnet-4-6` | Previous Sonnet, retained for pinning | | `claude-haiku-4-5-20251001` | Fastest, lightweight (default for `haiku` alias) | The canonical list lives in [`models.json`](./models.json) — the single source of truth as of v3.11.0. Both `server.mjs` (the `/v1/models` endpoint) and `setup.mjs` (the OpenClaw registration) derive from it. Adding a new model is now a one-file edit: diff --git a/models.json b/models.json index 0f417f1..c311585 100644 --- a/models.json +++ b/models.json @@ -53,7 +53,7 @@ ], "aliases": { "opus": "claude-opus-4-8", - "sonnet": "claude-sonnet-4-6", + "sonnet": "claude-sonnet-5", "haiku": "claude-haiku-4-5-20251001" }, "legacyAliases": { diff --git a/ocp-connect b/ocp-connect index 1cc31d7..0722806 100755 --- a/ocp-connect +++ b/ocp-connect @@ -202,8 +202,13 @@ for mid in model_ids: # Handle primary/backup if priority == "1": - # OCP as primary — pick the best model (prefer sonnet for daily use) - primary_model = provider_name + "/claude-sonnet-4-6" if "claude-sonnet-4-6" in model_ids else provider_name + "/" + model_ids[0] + # OCP as primary — pick the best model (prefer the latest Sonnet for daily use, + # tracking the `sonnet` alias default in models.json; fall back across versions). + _sonnet_pref = ["claude-sonnet-5", "claude-sonnet-4-6"] + primary_model = next( + (provider_name + "/" + m for m in _sonnet_pref if m in model_ids), + provider_name + "/" + model_ids[0], + ) config["agents"]["defaults"].setdefault("model", {}) config["agents"]["defaults"]["model"]["primary"] = primary_model # Keep existing fallbacks diff --git a/test-features.mjs b/test-features.mjs index 0571b74..e9d5ca6 100644 --- a/test-features.mjs +++ b/test-features.mjs @@ -3322,8 +3322,8 @@ test("models.json aliases.haiku === 'claude-haiku-4-5-20251001' (usage-probe SPO assert.equal(_spotModels.aliases.haiku, "claude-haiku-4-5-20251001"); }); -test("models.json aliases.sonnet === 'claude-sonnet-4-6' (default-request-model SPOT)", () => { - assert.equal(_spotModels.aliases.sonnet, "claude-sonnet-4-6"); +test("models.json aliases.sonnet === 'claude-sonnet-5' (default-request-model SPOT)", () => { + assert.equal(_spotModels.aliases.sonnet, "claude-sonnet-5"); }); // ── Referential integrity (PR #152 review) ──────────────────────────────────