Skip to content

2026.10.7: write each model's specs into the clients that list models, core v0.64.0 - #289

Merged
fylorn merged 9 commits into
devfrom
feat/model-capabilities
Oct 6, 2026
Merged

fylorn merged 9 commits into
devfrom
feat/model-capabilities

Conversation

@fylorn

@fylorn fylorn commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Taking over opencode, Pi, oh-my-pi, Qwen Code or Grok Build now writes each model's specs next to its name: the context window, and where the client uses them, the output limit, reasoning and image input. Before, only model IDs were written, so these clients ran on their defaults. In Pi, for example, every model got a 128K context and no reasoning levels (#288).

  • Model cards. The specs come from the gateway's /v1/models (core v0.64.0: context_window, max_output_tokens, supports_reasoning, input_modalities). Whatever the gateway doesn't know is left out, so the client falls back to its own default.
  • Per client:
    • Pi / oh-my-pi: contextWindow, maxTokens, reasoning, input.
    • opencode v1: limit, reasoning, modalities. Native v2: limit, capabilities.input.
    • Qwen Code: contextWindowSize, modalities. No output limit and no reasoning, because both change every request.
    • Grok Build: context_window, supports_reasoning_effort. No output limit, because it is sent verbatim.
  • Staleness. The Clients page compares what each client can hold (Client::as_written), so a changed spec asks for an update.
  • Upstreams page. "Specs…" can now set reasoning and image input (price table / yes / no).
  • Core. Pinned to v0.64.0 (protocol 40). The generated types are regenerated, and the zh translation is added for config.model_spec_nothing_set.
  • Version. 2026.10.7, with release notes in release-notes/2026.10.7.md.

Checked locally against the new core: cargo fmt, clippy -D warnings, cargo test (including the control-plane handshake), pnpm typecheck, pnpm test (872) and pnpm build.

🤖 Generated with Claude Code

fylorn and others added 9 commits October 6, 2026 10:00
Groundwork for writing context window, max output, reasoning and image
input into the clients that list models in their own config. Each client
module still writes only the ID; staleness now compares what a client can
hold (Client::as_written).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Specs dialog gains two segmented choices next to context window and
max output: Price table / Yes / No for reasoning and image input. The line
under each says what the price table has (or that it has nothing). Saving
with all four left to the price table removes the manual spec. The model
row's "Manual specs" mark and its tooltip cover the two new specs.

Generated types hand-edited to control API v40 (ModelRow reasoning /
image_input with their sources, ModelSpecSave reasoning / image_input);
to be regenerated from core.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pi and omp get contextWindow, maxTokens, reasoning and input per model;
opencode gets limit, reasoning, attachment and modalities in the v1 shape,
and limit and capabilities.input in the native v2 shape. Only what the
gateway reports is written, and every field is read back so a changed spec
makes the client page offer an update.

The YAML write-back check now reads nested numbers and booleans as strings,
as the YAML reader does, so omp's model list verifies.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Qwen Code gets generationConfig.contextWindowSize and modalities.image.
Grok Build gets context_window and supports_reasoning_effort. Unknown
fields are left out so each client's own catalog and defaults apply.

Max output is written to neither: Qwen's samplingParams.max_tokens and
Grok's max_completion_tokens are sent verbatim on every request, not
capability ceilings. Qwen has no reasoning field that does not change
every request (capabilities.reasoning needs an effort menu and sends its
default; reasoning: false turns /effort off), so reasoning is left out
there; /effort already offers every tier for undeclared models. Grok has
no image field. as_written drops what each client does not hold, and
models_in reads the written specs back so a changed spec shows as stale.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…easoning and image input

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@fylorn
fylorn merged commit 9034d49 into dev Oct 6, 2026
4 checks passed
@fylorn
fylorn deleted the feat/model-capabilities branch October 6, 2026 04:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant