feat: add VITE_ENABLED_PROVIDERS to control available AI providers#351
feat: add VITE_ENABLED_PROVIDERS to control available AI providers#351feraudet wants to merge 3 commits intositeboon:mainfrom
Conversation
WalkthroughAdds a providers utility that reads VITE_ENABLED_PROVIDERS and exposes getEnabledProviders / isProviderEnabled / getDefaultProvider. ChatInterface and Settings use these utilities to hide disabled providers, ensure the selected/default provider is valid, and sync localStorage when falling back to a default. Changes
Sequence Diagram(s)sequenceDiagram
participant Browser as Browser (localStorage)
participant Chat as ChatInterface
participant Utils as providers.js
Browser->>Chat: app loads / read("selectedProvider")
Chat->>Utils: isProviderEnabled(savedProvider)
alt savedProvider enabled
Utils-->>Chat: true
Chat->>Browser: use(savedProvider)
else savedProvider missing/disabled
Utils-->>Chat: false
Chat->>Utils: getDefaultProvider()
Utils-->>Chat: defaultProvider
Chat->>Browser: write("selectedProvider", defaultProvider)
end
Chat->>Chat: render provider buttons gated by isProviderEnabled(...)
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
🧪 Generate unit tests (beta)
No actionable comments were generated in the recent review. 🎉 Tip Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord. 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 |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Fix all issues with AI agents
In `@src/components/ChatInterface.jsx`:
- Around line 1937-1940: The saved localStorage value 'selected-provider' can
remain disabled while the component state uses the fallback from
getDefaultProvider(), causing mismatches; update localStorage when initializing
provider fallback so it matches state. In the useState initializer for provider
(where saved is read and checked with isProviderEnabled), if saved is falsy or
not enabled, compute const fallback = getDefaultProvider(), call
setItem('selected-provider', fallback) and return fallback (or otherwise ensure
localStorage is written to the chosen provider) so other code reading
localStorage (headers, session loader) sees the same provider as provider state.
In `@src/utils/providers.js`:
- Around line 42-43: The isProviderEnabled function currently calls
provider.toLowerCase() unconditionally which will throw for
null/undefined/non-string inputs; update isProviderEnabled to first verify
provider is a non-empty string (e.g., typeof provider === 'string' and
provider.trim() !== '') and only then call provider.toLowerCase() before
checking getEnabledProviders().includes(...); for all other cases return false
so non-string inputs are safely handled.
🧹 Nitpick comments (1)
src/components/Settings.jsx (1)
62-62: Use a lazy initializer for the default provider.Avoid recomputing
getDefaultProvider()on every render.♻️ Proposed change
- const [selectedAgent, setSelectedAgent] = useState(getDefaultProvider()); // Only enabled providers + const [selectedAgent, setSelectedAgent] = useState(() => getDefaultProvider()); // Only enabled providers
Implements environment-based provider selection with the following: - Add src/utils/providers.js with helper functions: - getEnabledProviders() - returns array of enabled providers - isProviderEnabled(provider) - safely checks if provider is enabled - getDefaultProvider() - returns first enabled provider - Update ChatInterface.jsx: - Import providers utility - Conditionally render provider buttons based on enabled status - Sync localStorage when falling back to default provider - Update Settings.jsx: - Import providers utility - Use lazy initializer for selectedAgent state - Conditionally render agent list items Configuration examples: VITE_ENABLED_PROVIDERS=claude # Only Claude VITE_ENABLED_PROVIDERS=claude,cursor # Claude and Cursor (not set) = all providers enabled Closes siteboon#349 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
0326d8b to
349e5bb
Compare
Summary
Implements #349 - Add
VITE_ENABLED_PROVIDERSenvironment variable to control which AI providers are shown in the UI.Changes
src/utils/providers.jswith helper functions:getEnabledProviders()- returns array of enabled providersisProviderEnabled(provider)- checks if a provider is enabledgetDefaultProvider()- returns first enabled providerChatInterface.jsxto conditionally render provider buttonsSettings.jsxto conditionally render agent list itemsConfiguration
Test plan
VITE_ENABLED_PROVIDERS=claude- only Claude appearsVITE_ENABLED_PROVIDERS=claude,cursor- both appearCloses #349
🤖 Generated with Claude Code
Summary by CodeRabbit