feat: redesign model picker with provider grouping and visibility controls#46
feat: redesign model picker with provider grouping and visibility controls#46
Conversation
…trols - Add Recommended and DefaultEnabled fields to RegistryModel - Add recommendedModels map with curated recommended models per provider - Add ModelState with EnabledModels/DisabledModels persistence (model_state.go) - Add model validate.go for model validation helpers - Redesign TUI model picker: provider-grouped sections, current model section, favorites, recommended badges, Manage Models action - Add TUI Manage Models view with per-model visibility toggles (manage_models.go) - Fix BubbleTea list filter: add FilterState guard so enter/esc pass through during active filtering; forward FilterMatchesMsg to active pickers - Add ResetFilter() on all picker exit paths to clear stale filter state - Apply same filter fixes to setup TUI (Add New Provider) providerList/modelList - Web UI: update model picker with provider sections, recommended badges, enabled/disabled state, Manage Models dialog with filter - Web API: add /api/model-state and /api/model-state/enabled endpoints - Web: add SetupView.vue component for provider setup flow
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (17)
📝 WalkthroughWalkthroughThis PR introduces a comprehensive model and provider management system with initial setup flows. It adds persistent model state tracking (favorites, recent selections, enabled/disabled status), restructures model selection UI with filtering and action items across CLI and web interfaces, implements setup-mode gating for both TUI and web servers, and provides new API endpoints and provider validation for managing multiple providers and their models. Changes
Sequence Diagram(s)sequenceDiagram
participant Client
participant WebServer as Web Server
participant Config
participant ModelState
participant Registry
Client->>WebServer: GET /api/health
WebServer->>Config: Check NeedsSetup()
alt Setup Required
WebServer-->>Client: {"needs_setup": true}
Client->>WebServer: POST /api/setup/providers
WebServer->>Registry: List available providers
Registry-->>WebServer: Provider list
WebServer-->>Client: SetupProvider[]
Client->>WebServer: POST /api/setup/validate<br/>(provider, api_key, base_url)
WebServer->>WebServer: ValidateProvider(api_key, baseURL)
WebServer-->>Client: {valid, error?}
Client->>WebServer: POST /api/setup/complete<br/>(provider, model, api_key)
WebServer->>Config: Save provider config
Config->>ModelState: InitializeModelState()
WebServer->>Registry: Resolve provider/model
WebServer-->>Client: {status: "complete"}
else Setup Complete
WebServer-->>Client: {"needs_setup": false}
Client->>WebServer: GET /api/chat
WebServer-->>Client: Chat service active
end
sequenceDiagram
participant User
participant ChatUI as Chat UI
participant ModelPicker
participant ManageModels
participant Store as Chat Store
participant API
User->>ChatUI: Click model selector
ChatUI->>Store: Fetch enabled providers<br/>and model state
Store->>API: GET /api/model-state
API-->>Store: {recent, favorites, enabled}
Store-->>ChatUI: Render picker
ChatUI->>ModelPicker: Show favorites section,<br/>current model, providers
alt User toggles model enabled state
User->>ChatUI: Click manage models
ChatUI->>ManageModels: Open manage dialog
ManageModels->>API: GET /api/models (all)
ManageModels->>Store: Subscribe to enabled state
User->>ManageModels: Toggle model checkbox
ManageModels->>API: POST /api/models/manage<br/>(provider, model, enabled)
API->>Store: Update enabled state
Store-->>ManageModels: Refresh display
else User selects model
User->>ModelPicker: Select model
ChatUI->>API: POST /api/chat/switch<br/>(provider, model)
API->>Store: AddRecent(model)
Store-->>ChatUI: Update picker display
end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~50 minutes Possibly related PRs
Poem
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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. Comment |
Summary
Redesigns the model picker in both TUI and Web UI to match an OpenCode-style provider-based layout with recommended models, visibility toggles, and robust filter support.
Changes
Backend
RecommendedandDefaultEnabledfields toRegistryModelrecommendedModelsmap per provider (zhipuai, deepseek, alibaba-cn, moonshotai, minimax, openai, anthropic, google)ModelStatewithEnabledModels/DisabledModelspersistence (internal/config/model_state.go)/api/model-stateand/api/model-state/enabledAPI endpointsTUI
internal/tui/manage_models.go)FilterState() == list.Filteringguard so Enter/Esc pass through during active filtering; forwardFilterMatchesMsgto active pickers so async filter results are appliedResetFilter()on all picker exit paths to clear stale filter stateproviderList/modelListWeb UI
SetupView.vuefor provider setup flowSummary by CodeRabbit