Skip to content

Commit 1f1776e

Browse files
ericleepi314claude
andauthored
chore(release): v1.4.0 — fusion models (#788)
Headline: fusion models (#771) — pair a text-only reasoning model with a vision-capable one so it can read screenshots, diagrams and code images. `deepseek-v4-pro` rejects an image content block outright, so a pasted screenshot used to end the turn; a fusion model describes the image with the second model first and hands the base model text. Verified end to end on Terminal-Bench 2.1's `code-from-image` — transcribe handwritten pseudocode from a PNG and reproduce its output — with `deepseek-v4-flash` + `openai:gpt-5.6-luna` (#787). The base model alone returns a 400 on the same image, so the pass is attributable to the fusion path rather than the base coping. Also in 1.4.0: GPT-5.6 Sol/Terra/Luna (#773); groq, cerebras, baseten and xai take the provider registry to 30 (#784); `/mode` becomes `/permissions` with a three-level picker (#768); `AskUserQuestion` renders a real picker instead of returning JSON to the model (#774); the OpenAI provider picks its wire protocol from the model rather than the auth mode (#783); cached prompt tokens bill at the cache rate (#785, #786); headless runs stop reporting a cut-short run as success (#777#782). Version bumped in all five spots (pyproject, install.sh INSTALLER_VERSION, gatewayClient CLAWCODEX_VERSION, src/__init__.py fallback, uv.lock). CHANGELOG `[Unreleased]` covered only through #773 and was backfilled with #774#787; PR citations added to the pre-existing entries so coverage is checkable. #766 is docs-only and deliberately uncited. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
1 parent 78c0055 commit 1f1776e

9 files changed

Lines changed: 70 additions & 14 deletions

File tree

CHANGELOG.md

Lines changed: 62 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [1.4.0] - 2026-08-02
11+
1012
### Added
1113

1214
- **Fusion models — give a text-only model vision.** Some strong reasoning
@@ -49,11 +51,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
4951
refers to. `deepseek-v4-pro`, `deepseek-v4-flash`, `glm-5.2`, and `glm-5.1`
5052
are now marked vision-less in the model table.
5153

52-
[claude-code-router]: https://ccrdesk.top/en/configuration/fusion-models/
54+
Fusion models, the `/fusion` command and the shared persisted-model
55+
resolution below all land in #771.
5356

54-
### Added
57+
[claude-code-router]: https://ccrdesk.top/en/configuration/fusion-models/
5558

56-
- **GPT-5.6 (Sol / Terra / Luna).** OpenAI's current frontier generation is
59+
- **GPT-5.6 (Sol / Terra / Luna)** (#773). OpenAI's current frontier generation is
5760
three durable capability tiers on one generation rather than a size ladder:
5861
Sol is the flagship, Terra balances capability against cost, Luna is the
5962
cheap high-volume tier, and `gpt-5.6` is OpenAI's alias for Sol. All four are
@@ -74,9 +77,61 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7477
(`SUBSCRIPTION_MODELS`) is also untouched, since which models that backend
7578
serves is a wire fact that has to be observed rather than assumed.
7679

80+
- **`AskUserQuestion` actually asks.** The tool was advertised but never
81+
wired: its raw JSON payload was returned to the model as the tool result,
82+
so the model saw a blob instead of the user seeing a picker. The TUI now
83+
renders a real multiple-choice dialog and sends the choice back (#774).
84+
85+
- **Four more OpenAI-compatible providers**`groq`, `cerebras`, `baseten`
86+
and `xai` — bringing the registry to 30. Each ships a curated model list
87+
that live `/models` discovery extends rather than replaces (#784).
88+
89+
- **Fusion models are runnable under the Terminal-Bench harness.** A fusion
90+
model lives in global config and is selected by name, so a fresh eval
91+
container could not resolve one; `--ak fusion=<base>+<vision>` seeds the
92+
record and the base provider (#787).
93+
7794
### Fixed
7895

79-
- **OpenRouter's curated model list offered ids OpenRouter had delisted.** The
96+
- **Reasoning effort never reached the wire for any OpenAI-compatible
97+
provider.** `--effort` was emitted only on the Anthropic branch, so every
98+
DeepSeek/OpenRouter/GLM run silently ignored it — including benchmark runs
99+
that reported an effort setting in their config and sent nothing (#776).
100+
101+
- **The first-party OpenAI provider chose its wire protocol from the auth
102+
mode**, not the model: an API key meant Chat Completions, which rejects
103+
tools outright for some reasoning models (`gpt-5.6-luna` 400s even with no
104+
effort set). Protocol now follows the model and auth only picks the route,
105+
which is what makes those models usable on an API key at all (#783).
106+
107+
- **Cached prompt tokens were billed at the full input rate.** `prompt_tokens`
108+
includes tokens served from the cache, and the cached count was dropped, so
109+
a heavily-cached turn over-reported its cost several-fold. Both wires now
110+
split cache reads out. The same change surfaced that OpenRouter's streamed
111+
reasoning was discarded entirely — it sends `delta.reasoning`, and only
112+
`reasoning_content` was read (#785).
113+
114+
- **`result.usage` omitted cumulative cache tokens**, so anything pricing it
115+
billed the cached portion at nothing, and `/goal`'s token budget saw a
116+
fraction of what had been spent. Turn cost is now read from the cost
117+
tracker, which prices each response individually — pricing the aggregate
118+
crosses a per-request tier boundary no single request came near (#786).
119+
120+
- **Headless runs reported success after stopping early.** A cut-short run,
121+
a loop-guard kill, and a plan-mode trap all surfaced as
122+
`subtype: "success"`; `/goal` then treated the result as evidence of
123+
progress and re-ran on cancels and errors (#777, #778, #779, #780).
124+
125+
- **A rejected image ended the turn instead of being recovered.** The
126+
"too many images" path is now classified and retried, and the reactive
127+
recovery lane — dead since a typed error stopped matching a string-only
128+
gate — runs again (#781, #782).
129+
130+
- **TUI:** the header box lost its right border and could lose the border
131+
entirely on first paint (#769, #770); the scrollbar stretched its sibling
132+
and blanked the transcript on terminal resize (#775).
133+
134+
- **OpenRouter's curated model list offered ids OpenRouter had delisted** (#773). The
80135
OpenAI section still led with `openai/gpt-5` / `openai/gpt-4o` / `openai/o1`
81136
while the gateway had moved on to the `gpt-5.6` family, and
82137
`openai/o1-mini` had been removed upstream entirely — so the /model picker
@@ -101,7 +156,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
101156
drift reads as a model one surface offers and the other drops, so the
102157
provider now reads the registry.
103158

104-
- **`/model` listed one provider instead of every configured one.** Step 1 of
159+
- **`/model` listed one provider instead of every configured one** (#772). Step 1 of
105160
the picker showed a single row — `anthropic · 22 models` — no matter how many
106161
providers were set up. `model.options` was a stub: it called the
107162
`get_settings` control, which describes only the provider the session is
@@ -142,7 +197,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
142197
reports that reason instead of inventing a provider row.
143198

144199
- **`--model`/`/model` selection is now resolved from one rule at every
145-
entrypoint.** The persisted `/model` choice was applied only in the
200+
entrypoint** (#771). The persisted `/model` choice was applied only in the
146201
interactive agent-server, and only *after* the provider was constructed
147202
(`_build_runtime`'s post-construction `provider.model = ...`). Headless
148203
(`-p`) ignored it entirely, so a `/model` switch had to be re-stated with
@@ -160,7 +215,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
160215

161216
### Changed
162217

163-
- **Permissions are now loose by default and easy to change.** `/mode` is
218+
- **Permissions are now loose by default and easy to change** (#768). `/mode` is
164219
renamed `/permissions` (the old name still works as an alias) and bare
165220
`/permissions` opens a three-option picker — *Ask for approval*, *Approve for
166221
me*, *Full Access* — instead of requiring a raw mode name. A bare interactive

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ The `session`, `settings`, and `env` blocks are optional — sensible defaults a
135135

136136
## 📰 News
137137

138+
- **2026-08-02 (v1.4.0):** **Fusion models — give a text-only model vision (#771, #787)** — several strong reasoning models cannot see images at all: `deepseek-v4-pro` rejects an image content block outright (`400 unknown variant \`image_url\``), so pasting a screenshot, `@`-mentioning one, or letting `Read` return one ended the turn. A **fusion model** pairs that base model with a second, vision-capable one — every image is described by the vision model first, and the base model reads the description. `/fusion create <name> <base> <vision>` saves one; it then behaves like a normal model in the `/model` picker, as `--model <name>`, in `-p`, and across restarts. Ported from [claude-code-router](https://ccrdesk.top/en/configuration/fusion-models/)'s Fusion Model concept, with one deliberate difference: CCR is a proxy, so it can only offer vision as a *tool* the model may choose to call — which cannot help a pasted image, already on the wire before the model gets a turn. ClawCodex owns the agent loop, so it substitutes images in place, covering paste, `@file.png`, `Read`, and Bash image output at once. Verified end to end on Terminal-Bench 2.1's `code-from-image` task — transcribing handwritten pseudocode from a PNG and reproducing its output — with `deepseek-v4-flash` + `openai:gpt-5.6-luna` (#787); the base model alone returns a 400 on the same image. **Also in v1.4.0:** GPT-5.6 Sol/Terra/Luna (#773); four more OpenAI-compatible providers — groq, cerebras, baseten, xai — taking the registry to 30 (#784); `/mode` becomes `/permissions` with a three-level picker and Full Access by default (#768); `AskUserQuestion` finally renders a real picker instead of returning JSON to the model (#774); the OpenAI provider now picks its wire protocol from the model rather than the auth mode, which is what makes `gpt-5.6-luna` usable on an API key (#783); cached prompt tokens are billed at the cache rate instead of the full input rate, and OpenRouter's streamed reasoning is no longer discarded (#785, #786); and headless runs stop reporting a cut-short run as a success (#777–#782).
138139
- **2026-07-29 (v1.3.0):** **ClawCodex scores 80.9% on Terminal-Bench 2.1 — a top-tier open-source result on Opus 5 (#720–#725, #747–#754)** — running headless on `claude-opus-5` at `effort=xhigh`, ClawCodex solved **72 of 89** Terminal-Bench 2.1 tasks: **80.9% pass@1** on a single run. On the [public 2.1 leaderboard](https://www.tbench.ai/leaderboard/terminal-bench/2.1) (k=5 averages) that would slot **around third** — behind Claude Code / Fable 5 (83.8%) and Codex / GPT-5.5 (83.1%), statistically level with the 79–80% cluster, and **ahead of Claude Code on Opus 4.8 (78.9%) and Sonnet 5 (74.6%)**. Getting there was open, unglamorous parity work: a Harbor eval adapter (`eval/harbor/`) for three-way ClawCodex-vs-openclaude-vs-Claude-Code runs (#720, #724, #725), then a run of prompt- and reliability-parity fixes — restored task-tool skip conditions and parallel-tool guidance, deferred nonessential initial tools, and recovery of trials lost to empty turns and transport drops (#747–#754). **Also in v1.3.0:** `claude-opus-5` support with an interactive `/effort` fix (#746), bounded persistent memory with a background self-improvement review (#731), a VS Code extension driving the agent-server over stdio (#727), image-paste input with an `[Image #N]` un-attach chip (#761, #762), the `CLAUDE.md → CLAWCODEX.md` context-file rebrand (#732), and transport-retry hardening (#757, #760). Stated plainly: this is a single k=1 pass (binomial 1σ ±4.2pp) against the board's k=5 ± ~1.2pp averages, benchmarked on `main` at #756 (before the v1.3.0 tag), so read it as directional rather than a ranked submission.
139140
- **2026-07-13:** **`/eco` token compression — -80% Bash-output tokens, measured, now a headline (#708, #712)** — a new session toggle compresses the model-bound rendering of every Bash result with deterministic filters ported from [RTK](https://github.com/rtk-ai/rtk)'s method set: failure-focused test summaries (kept error lines are never rewritten), `git`/`pip`/`npm` ceremony stripping, log dedup with `[×N]` counts, and a recoverable head-cap — all behind a **never-worse** guard, with every lossy compression teeing the full output to disk behind a runnable recovery hint (#708). A reproducible benchmark (`eval/eco/`) replays 27 real command outputs through the exact production pipeline and counts real tokenizer tokens: **92,989 → 17,767 (-80%)** corpus-wide, -88% on filter hits, plus an honestly conservative recompute of RTK's own 30-minute-session model (-19% under their averaged assumptions — real sessions are fat-tailed) (#712). Full tables: the [`/eco` section](#eco-benchmark) and [`eval/eco/results/`](eval/eco/results/results.md).
140141
- **2026-07-12 (v1.1.0):** **ClawCodex v1.1.0 — run OpenAI *and* Claude models on your subscription, not metered API billing** — the headline of 1.1.0 is **subscription auth for the two biggest model families**, so you can point ClawCodex at a plan you already pay for. **Sign in with ChatGPT (#698):** `clawcodex login → openai → subscription` (browser, device-code, or import from an existing Codex CLI login) routes requests through the ChatGPT Codex backend's Responses API — `gpt-5.5`, `gpt-5.4`, `gpt-5.4-mini`, and `gpt-5.3-codex-spark` on your Plus/Pro allowance, with encrypted-reasoning replay across turns and **$0** metered cost. **Claude Pro/Max (#697):** `clawcodex login → anthropic → subscription` connects a Claude subscription via OAuth (PKCE) with automatic token refresh and the same $0 accounting; follow-ups repaired the login after Anthropic moved its OAuth endpoints to `platform.claude.com` (#702) and stopped sending adaptive thinking to models that don't support it (#699). A configured API key always wins, and subscription usage reports `billing_mode: subscription`. **More models:** a Meta (`api.meta.ai`) provider with the 1M-context `muse-spark-1.1` reasoning model (#692) and refreshed MiniMax parameters (#696). **Workflow & TUI:** `/plan` mode with implicit plan-mode entry/exit (#676), `--worktree/-w` session isolation for parallel runs in separate git worktrees (#672), the `/memory` picker + `$EDITOR` spawn (#693), config/state directories rebranded `.claude → .clawcodex` with a one-time migration (#678), `/logo` startup color schemes (#677), plus TUI polish — Tab accepts the suggested placeholder (#690), past inputs get the Claude-Code highlight band (#691), clickable agent URLs (#694), and a per-terminal link-open affordance (#701). **Quality:** semantic tool-input coercion with parity validation errors (#700) and looser, Claude-Code-faithful permission granting (#673).
@@ -144,7 +145,6 @@ The `session`, `settings`, and `env` blocks are optional — sensible defaults a
144145
- **2026-06-30 (v0.7.0):** **ClawCodex v0.7.0 — TUI auto-theming, faithful inline rendering & a Claude-Code-style tool trail** — the Ink TUI now detects your terminal's background color (OSC 11) on startup and selects the light/dark theme to match, so text stays readable on any terminal with no env var needed (#577). Inline mode renders *truly* inline like Claude Code: no screen wipe on launch, and no overlap with prior terminal output on startup or with the returning shell prompt on exit (#573, #575). The tool trail reads Claude-style — workspace-relative paths (`Read(src/foo.ts)`), `Grep(pattern)` labels, and a `Read N lines` result collapse (#574) — and the banner gains a 🦞 mascot with brighter secondary text on dark themes (#576).
145146
- **2026-06-24 (v0.6.0):** **ClawCodex v0.6.0 — interactive TUI REPL parity** — a batch of input ports brings the Python REPL to parity with the ink reference: a working slash-command menu (execute / complete / filter like the ink REPL), the sparkle spinner with a live token + elapsed busy row, context-aware prompt footer hints (interrupt / bash / grammar), the `?` shortcuts help panel, an `@` file-mention dropdown with in-place splice, double-press Ctrl+C / Ctrl+D to exit, Ctrl+R history search + double-Esc clear-draft, a `[Pasted text #N +K lines]` large-paste placeholder, and the completed command queue (drain queued prompts + dim preview). Login docs now list all 25 providers (#383).
146147
- **2026-06-23:** **One-click installer**`curl -fsSL https://clawcodex.app/install.sh | bash` installs uv (no sudo), provisions Python 3.10+, clones to `~/.clawcodex`, creates a lock-pinned venv, and registers `clawcodex` on PATH; ships status / doctor / verify / update / uninstall subcommands, is safe to re-run, and works on macOS / Linux / WSL.
147-
- **2026-06-21:** **18 new LLM providers — the registry grows 7 → 25 (#377)** — a data-driven `ProviderSpec` registry adds 18 OpenAI-compatible backends (nvidia-nim, fireworks, together, moonshot/Kimi, novita, siliconflow, deepinfra, stepfun, arcee, huggingface, volcengine, xiaomi-mimo, atlascloud, wanjie-ark, plus local ollama / vllm / sglang) alongside the hand-written providers; alias-aware config resolution, standard env-var key fallback (e.g. `TOGETHER_API_KEY`), and keyless local servers.
148148
📚 Older items have moved to the full **[News archive](docs/NEWS.md)**.
149149

150150
***

0 commit comments

Comments
 (0)