Repository navigation
Conversation
Read the current model independently of the provider catalogue and preserve session bindings and staged picks. Show loading and retry states, and reject responses superseded by navigation or a local selection. Add regression coverage for cold starts, delayed catalogues and failed reads. Use the shared path helper so the CSS regression gate also runs on Windows. Co-authored-by: Codex <noreply@openai.com>
gloryfromca
left a comment
There was a problem hiding this comment.
Blocking: preserve model initialization when the page connects to an older gateway.
I reviewed the full github/main...HEAD diff and the relevant model RPC, boot, composer-send, session-switch, staged-selection, retry, fixture, and schema paths. I also checked AGENTS.md, CONTEXT-MAP.md, the Web UI architecture vocabulary, commit history, backward compatibility, and whether the tests were weakened; I found one blocking compatibility regression inline.
Verification: PYTHONPATH=plugins-dist/everos-memory uv run pytest tests/test_rpc_model.py -x (228 passed); npm test (215 files, 3198 tests passed); npm run type-check and npm run gen:check passed; npm run lint exited successfully with four pre-existing warnings in untouched files.
| return | ||
| } | ||
| try { | ||
| const mo = await readOptions({ ...(target ? { session_id: target } : {}), include_providers: false }) |
There was a problem hiding this comment.
Blocking: preserve model initialization when the page connects to an older gateway.
The pre-change gateway validates ModelOptionsParams with extra="forbid", so it rejects include_providers with config_validation_error. This catch then marks the selection failed, while the parallel legacy {session_id} catalogue response no longer calls showModel. The chip therefore remains Model unavailable, beforeSend blocks every message, and clicking retry only repeats the incompatible request. The Web UI explicitly supports older gateways, so this needs a legacy fallback that reads the model from a request the older server accepts (or equivalent capability negotiation).
There was a problem hiding this comment.
Thanks for catching this. The UI now sends include_providers: false only when the gateway advertises support; older gateways use the original parameters and share the full catalogue request. Regression tests for both paths pass.
Advertise selection-only model options during the gateway handshake and use legacy request parameters when the connected gateway lacks support. Share the catalogue read on older gateways and refresh capabilities on reconnect. Cover legacy initialization, retries, navigation, staged picks, and the composer send path. Keep fixture handshakes and test gateways aligned. Co-authored-by: Codex <noreply@openai.com>
Keep an already-ready selection usable during refreshes of the same view, while navigation, initial loads and failed reads retain readiness checks. Limit the shared catalogue loading guard to composer picker openings. Separate send readiness from provider setup redirects so loading a model does not block New Task, and clear catalogue state on synchronous RPC errors. Cover background sending, navigation, retry and settings role picks on both modern and strict legacy gateways. Co-authored-by: Codex <noreply@openai.com>
Summary
The web composer initially displayed hardcoded
minimax-m3until a full provider catalogue finished loading, even when another model was configured. Read the actual model/provider selection immediately after the gateway handshake, independently of catalogue building and provider probes when the gateway supports it.model.options.include_providerswith its existing full-catalogue behavior as the default. Advertise selection-only support throughsystem.hello.server_capabilities; older strict gateways receive their original parameters and share one full catalogue request.Type
Verification
Commands below were run on Windows against the updated branch. Python tests used
PYTHONUTF8=1.At repository root:
uv run --no-sync pytest tests/test_rpc_model.py tests/test_rpc_schema_match.py -x -q -n 0: 646 passed.uv run --no-sync pytest tests/test_rpc_system.py -k 'hello or ping or version or dispatcher' -x -q -n 0: 26 passed, 14 deselected.uv run --no-sync python ui-web/build.py: passed both boot snapshots, with 343 stub nodes and 342 live nodes matching the goldens.uv run --no-sync python scripts/check_source_language.py origin/main..HEAD: passed.uv run --no-sync python scripts/check_large_files.py origin/main..HEAD: passed.uv run --no-sync python scripts/check_commit_messages.py HEAD^..HEAD: passed.git diff --check: passed.In
ui-web:npm.cmd test -- --maxWorkers=2 --testTimeout=20000: 3,231 passed across 215 suites. Includes real composer sends during background refreshes on current and strict legacy gateways, navigation/readiness, stale responses, retry, handshake changes, and settings role selection during catalogue loading.npm.cmd run gen:check: 205 methods matched the wire contract.npm.cmd run type-check,npm.cmd run build: passed.npm.cmd run lint: 0 errors, 4 existing React hook warnings.In
ui-tui:npm.cmd run lint:rpc,npm.cmd run lint:i18n: generated files matched their contracts.Open Code Review also completed a focused re-review of all five selected files with the configured LLM: no critical, high or medium findings, and one optional documentation suggestion.
Risk
The new read mode is read-only and returns no provider credentials. Existing RPC callers retain full catalogue responses by default; web clients negotiate support before sending the new parameter. A failed selection read still requires retry, while a pending refresh of a known selection allows sending. Settings role pickers and task navigation no longer inherit the composer's loading restriction. Roll back by reverting this change and rebuilding the served web page; no configuration migration is required.
Related Issues
Fixes #819