feat(tui): #3083 /provider readiness dashboard — capability/metadata badges#3555
Conversation
Add a ProviderReasoningSummary to /provider dashboard rows so the row projection can display reasoning support, accepted controls, stream visibility, and the selected configured control.\n\nSeed GLM reasoning controls in catalog-shaped provider+wire data and reuse the Codex effort labels so Codex displays its xhigh scale without model substring inference.\n\nAdd focused coverage for the GLM and Codex provider dashboard projections.\n\nRefs #3083
…3083) The reasoning readiness projection hand-seeded a single GLM-5.2 row in a OnceLock. main's bundled Models.dev snapshot already carries that row (reasoning + reasoning_options) plus every other provider's reasoning facts, so the seed was redundant and prone to drift. Source bundled_reasoning_catalog() from codewhale_config::catalog::bundled_catalog_offerings() instead. GLM-5.2 still resolves to high/max controls; all bundled providers with reasoning descriptors are now covered rather than just GLM.
#3083) Wire the existing resolved_capability_profile() projection into the /provider dashboard rows so each row surfaces, with no wire-id substring inference: - metadata badges: context window + max output (humanized; `?` when unknown); - capability badges: tools, structured/JSON, streaming, cache — tri-state so unknown stays distinct from unsupported and is never silently dropped; - model-origin: default / saved override / custom pass-through; - a self-hosted hint next to the base URL for local runtimes. Badges are computed in the row projection (testable without rendering) and ordered after route/base so provider identity survives narrow-width truncation. The live "test connection" probe is deferred to a follow-up to honor the no-I/O-on-open constraint.
|
Claude finished @Hmbown's task in 2m 39s —— View job PR Review — feat(tui): #3083 provider dashboard capability/metadata badgesTasks
SummarySolid, well-structured work. Capability/metadata badges are correctly wired through 1. Self-hosted hint misses SGLang and vLLM (bug)File: let self_hosted = if self.auth_status == ProviderAuthStatus::Local {
" (self-hosted)"
} else {
""
};
Fix: widen the predicate: let self_hosted = if matches!(
self.auth_status,
ProviderAuthStatus::Local | ProviderAuthStatus::Optional
) {
" (self-hosted)"
} else {
""
};Add a parallel test assertion for 2.
|
|
Status: CI green. Completes the remaining #3083 dashboard acceptance criteria.
Maintainer calls: (a) confirm it belongs in the v0.8.65 cleanup; (b) the live "test connection" probe is intentionally deferred to honor "opening /provider must not block on live I/O" — accept as a follow-up, or treat as a close-blocker for #3083? |
Address provider dashboard review feedback. - Treat Optional auth status as self-hosted in compact provider hints, covering SGLang and vLLM local runtimes. - Classify vLLM reasoning stream visibility consistently with SGLang. - Add regression coverage for both cases. Verification: - cargo fmt --all - cargo test -p codewhale-tui --bin codewhale-tui --locked provider_dashboard - cargo test -p codewhale-tui --bin codewhale-tui --locked self_hosted
|
Addressed the provider-dashboard review nits in dad6695:
Verification:
|
|
Claude finished @Hmbown's task in 1m 47s —— View job Follow-up Review — feat(tui): #3083 provider dashboardTasks
Verification of dad6695Both issues from the first review are correctly resolved. Issue 1 — Self-hosted hint for SGLang/vLLM: FIXED The predicate widening in let self_hosted = if matches!(
self.auth_status,
ProviderAuthStatus::Local | ProviderAuthStatus::Optional
) {Importantly, This is also internally consistent: the existing readiness check at line 773 already uses The test correctly exercises both the Issue 2 — vLLM reasoning stream visibility: FIXED
No new issues introduced. The fix commit is minimal (26 lines, single file, no behavioral changes beyond the two targeted paths). The earlier advisory note on PR looks clean. Both correctness issues from the first pass are resolved with appropriate tests. Ready to land when Hunter confirms the deferred "test connection" probe is acceptable as a follow-up. |
Closes #3083
Supersedes the draft #3504 (its reasoning-readiness commit is cherry-picked here with Hunter's authorship preserved) and completes the remaining
/providerdashboard acceptance criteria.What's included
ProviderReasoningSummary(support / controls / stream visibility / selected control) on each row, with the 4-regionprovider_picker.rsconflict resolved (struct now carries bothreasoningandmaturity;compact_hintcarries both).refactor): the reasoning projection no longer hand-seeds a single GLM-5.2 row. It sources fromcodewhale_config::catalog::bundled_catalog_offerings()(the single bundled Models.dev snapshot, same source v0.8.65: Provider-owned live catalogs and secret-free model cache #3385 uses), so every bundled provider with reasoning facts is covered and the row can't drift from the catalog.feat): wires the existingresolved_capability_profile()projection (no new capability logic, no wire-id substring inference) into each row:ctx:1M out:128K),?when unknown;tools / json / stream / cache— tri-state (y/n/?) so unknown stays distinct from unsupported and is never silently omitted;origin:default | saved | custom;Badges are computed in the row projection (testable without rendering — acceptance criterion) and ordered after route/base so provider identity survives narrow-width truncation.
Deferred (flagged, non-blocking)
/providermust not block on live network I/O" constraint — a clean backgrounded/cached probe is its own design. Question for Hunter: OK to land v0.8.65: /provider readiness dashboard from route/catalog projections #3083 with this deferred, or treat it as a close-blocker?live-catalog/staticsplit: not distinguishable until the v0.8.65: Provider-owned live catalogs and secret-free model cache #3385 live-fetch layer lands; the variant is reserved.Verification
cargo fmt;cargo clippy --workspace --all-targets --locked -- -D warnings— clean.cargo test -p codewhale-tui -- provider_dashboard provider_picker route_resolver pricing usage_meter— green.codewhale-tuibin suite: 5278 passed; only the known environmental/flaky papercuts failed (config_command_allow_shell_*,run_verifiers_background_*,run_tests_*), reproduced on pristinemain.New tests:
provider_dashboard_row_surfaces_capability_and_metadata_badges,provider_dashboard_row_classifies_model_origin,model_origin_classifier_covers_default_saved_custom,self_hosted_provider_row_marks_self_hosted_in_hint,humanize_token_count_is_compact_and_marks_unknown(plus #3504's reasoning tests, rebased).🤖 Generated with Claude Code