Skip to content

fix(web): filter model picker by server provider health status#1378

Open
timmske wants to merge 1 commit intopingdotgg:mainfrom
timmske:fix/provider-model-picker-availability
Open

fix(web): filter model picker by server provider health status#1378
timmske wants to merge 1 commit intopingdotgg:mainfrom
timmske:fix/provider-model-picker-availability

Conversation

@timmske
Copy link

@timmske timmske commented Mar 24, 2026

Summary

  • Thread providerStatuses from the server config query into ProviderModelPicker so it can dynamically hide providers whose CLI binary is missing
  • Providers that fail the server health check (available: false) are shown as disabled with a "Not installed" label instead of remaining selectable
  • Static unavailable providers (Cursor) retain their "Coming soon" label
  • The providerStatuses prop is optional — when omitted the component falls back to the existing static lists, preserving backward compatibility

Context

When codex is not installed but Claude Code is, the model picker still showed Codex as a selectable provider. The server already performs health checks and sends ServerProviderStatus[] to the client, but this data was only used for the ProviderHealthBanner warning display — not for filtering the picker itself.

Changes

File Change
apps/web/src/components/chat/ProviderModelPicker.tsx Accept optional providerStatuses prop, compute dynamic available/unavailable lists via useMemo, show "Not installed" for health-unavailable providers
apps/web/src/components/ChatView.tsx Pass providerStatuses to ProviderModelPicker (1 line), move providerStatuses derivation earlier to keep variable ordering clean (move, not logic change)

Known limitation

If the user has a provider selected and it becomes unavailable mid-session (e.g. CLI uninstalled while t3code is open), the picker button still shows that provider's icon/model until the user manually switches. This is a pre-existing condition not introduced by this change. A follow-up could auto-switch to the first available provider.

Test plan

  • Verify bun fmt, bun lint, bun typecheck pass (confirmed locally — the @t3tools/scripts typecheck failure is pre-existing on main)
  • Open t3code without codex installed → Codex should appear disabled with "Not installed"
  • Open t3code without claude installed → Claude should appear disabled with "Not installed"
  • Open t3code with both CLIs installed → Both providers remain selectable (no regression)
  • Existing ProviderModelPicker.browser.tsx tests pass unchanged (prop is optional)

Fixes #1332


Note

Low Risk
Low risk UI behavior change that only affects which provider options are selectable in the model picker based on server-reported availability.

Overview
Provider/model picker options are now filtered using server-reported providerStatuses, hiding providers that fail health checks from the selectable list.

Health-unavailable providers are shown as disabled with a "Not installed" badge (while statically unsupported providers remain "Coming soon"), and ChatView now passes providerStatuses into ProviderModelPicker via an optional prop for backwards compatibility.

Written by Cursor Bugbot for commit ca34f5f. This will update automatically on new commits. Configure here.

Note

Filter model picker options by server provider health status

  • ProviderModelPicker now accepts an optional providerStatuses prop and uses useMemo to derive effective available/unavailable provider lists based on server-reported health.
  • Providers that fail server health checks are moved out of the selectable list and shown as disabled with a 'Not installed' label instead of 'Coming soon'.
  • ChatView derives providerStatuses from serverConfigQuery and passes it down to ProviderModelPicker.
  • When providerStatuses is not provided, behavior falls back to the previous static availability lists.

Macroscope summarized ca34f5f.

The model picker used hardcoded availability flags, ignoring server
health checks. When codex was missing, it still appeared selectable,
blocking users who only have Claude Code installed.

Thread providerStatuses from the server config query into
ProviderModelPicker. Providers that fail health checks (CLI not
installed or not on PATH) now appear as disabled with a "Not installed"
label instead of being selectable. Static unavailable providers (Cursor)
retain their "Coming soon" label.

The providerStatuses prop is optional—when omitted the component falls
back to the existing static lists, preserving backward compatibility.

Fixes pingdotgg#1332
@coderabbitai
Copy link

coderabbitai bot commented Mar 24, 2026

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 23d9b70f-3551-4015-9ee0-19d94cbdf184

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions github-actions bot added size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Missing codex blocks Claude Code selection and limits model picker to Codex models

1 participant