feat: Provider UI consolidation — two-level selector, multi-provider support, skill UX fixes#20
Merged
MarcelRoozekrans merged 43 commits intomainfrom Mar 26, 2026
Merged
Conversation
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
lucent-code | 399247f | Commit Preview URL Branch Preview URL |
Mar 26 2026, 05:40 PM |
Covers ILLMProvider interface, OpenRouter/Anthropic/NVIDIA NIM providers, provider registry with auto-detect, settings, error normalization, and Anthropic tool format translation details. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
13-task TDD plan covering ILLMProvider interface, OpenRouter/Anthropic/NVIDIA NIM providers, ProviderRegistry with auto-detect, settings, MessageHandler wiring, and provider badge UI. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…nRouterProvider Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…l accumulator behavior
…ation Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace direct OpenRouterClient dependency in MessageHandler with the ILLMProvider abstraction. Updates chatStream, listModels, and getAccountBalance call sites; rewrites chat() usages for compaction and auto-title to use chatStream; maps ProviderModel to OpenRouterModel shape for backward-compat webview serialization; updates error handling to LLMError with string codes. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace OpenRouterClient dependency in InlineCompletionProvider with ILLMProvider interface, switching from chat() to chatStream() to accumulate delta content. Update message-handler.test.ts and inline-provider.test.ts to mock ILLMProvider instead of OpenRouterClient, fix mockModels to use ProviderModel shape (contextLength), and update compactConversation/autoTitle tests to use chatStream mocks. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…c proxy Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… provider Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Resolves the active provider (Anthropic, OpenRouter, NVIDIA NIM) via ProviderRegistry.resolve() and displays it as a subtle muted badge next to the model name in the ModelSelector toggle button. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fix type errors across source and test files: - remove unknown definitions field from CodeContext mock - cast mock.calls for filter callbacks - add non-null assertions for .find() results - type mock functions with correct return types - cast response.json() returns and use FileSystemWatcher type - cast proposed-API onDidWriteTerminalData - add tsconfig.test.json with esnext module for top-level await Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…s message types Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…lity Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…stry Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…allback Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ider item Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… providersLoaded on ready Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…tchProvider Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…gs; wire in App.tsx Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces the single-level ModelSelector with a two-level dropdown: Level 1 shows providers with ●/○ active indicator, ✓/! config status, and a gear icon to open provider settings. Level 2 shows a searchable model list with pricing, selected check, warning banner, and back button. ChatInput and App.tsx updated to wire all new props from the chat store. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…dModelProvider prop Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ame allowlist Use the model's explicit supported_parameters metadata to determine tool-use capability, with a name-based allowlist as fallback for providers that don't expose this field (e.g. local/custom models). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ector Raw per-token values (e.g. $0.000003) were displayed instead of the human-readable per-million-token format used in ModelSelector. Free models now show "free" instead of "$0.00 · $0.00 /1M". Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…l-2 list height - Model names like "NVIDIA: Nemotron 3 Nano (free)" had "(free)" in both the name and the pricing row. Strip the suffix from the display name since the pricing row already shows "free". - Add overflow:hidden to .model-list-level2 and reduce inner list max-height to 220px so the dropdown is more compact on small viewports. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Marketing: - CoreFeaturesGrid: "Any model via OpenRouter" → "Any model, any provider" (mentions OpenRouter, Anthropic native, NVIDIA NIM) - AdvancedFeaturesGrid: add "Native provider support" card Docs: - getting-started: restructured around provider choice; table comparing OpenRouter / Anthropic / NVIDIA NIM with setup instructions for each - model-selection: full rewrite for two-level ProviderModelSelector; explains all three providers; adds native-provider tip (Anthropic for full Claude features, NIM for Nemotron without a proxy hop) - openrouter-integration → LLM Providers: expanded to cover all three providers, ILLMProvider interface, error normalisation, tool-use capability detection, and provider switching flow Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Marketing AdvancedFeaturesGrid referenced "TDD" (not a builtin) and omitted most of the actual skills. Updated to list the real set. Skills doc now opens with a quick-reference table of all 10 built-in slash commands, including a note about tool-use model filtering. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ll models - ChatMessage.ChatMessage: add skills?: string[] field (display-only) - sendMessage: record skill names alongside the user message so the YOU bubble always shows which skills were active - ChatMessage: render ⚡ /skill-name chips above message text for user messages that had skills attached - ChatInput: remove isWorkflowCapableModel() guard from skill-only send check — skills always need a body message (the workflow needs user intent to kick off), regardless of model capability - Send button disabled state updated to match the guard change Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- .vscode/launch.json + tasks.json: F5 launches Extension Development Host - .vscodeignore: exclude docs-site/ from packaged extension - src/markdown.d.ts: type declaration for markdown imports Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
666ec10 to
399247f
Compare
3 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
ProviderModelSelector: Level 1 lists providers (●/○ dot, ✓/! config status, ⚙ gear), Level 2 shows that provider's models with search and per-million pricingProviderRegistrygainssetOverride(),getProvider(),isConfigured()supported_parameters.includes('tools')instead of a model-name allowlist to decide whether to show workflow skillsProviderModelSelectornow shows per-million-token rates ($3.00 · $15.00 /1M) matching the oldModelSelector⚡ /skill-namechips so sent skills are visible in history(free)suffix stripped from model names (pricing row already saysfree); model list height tightened; thinking badge stays visible on hover/selected rows.vscode/launch.json+tasks.jsonso F5 launches Extension Development HostTest plan
npm run build— no TypeScript errorsclaude/marketplaceskills in picker⚡ /skill-namebadge in YOU message after sending$X.XX · $Y.YY /1M(not raw per-token values)freelabel, not(free)in the namenpm test🤖 Generated with Claude Code