Unified provider layout with four inference modes#570
Merged
gabrielste1n merged 6 commits intomainfrom Apr 12, 2026
Merged
Conversation
Replace the confusing two-level provider hierarchy (OpenWhispr Cloud / Custom Setup with nested Cloud/Local toggle) with four explicit modes: OpenWhispr Cloud, Cloud Providers, On Device, and Self-Hosted. Settings model: add transcriptionMode/reasoningMode (InferenceMode union), remoteTranscriptionType/remoteReasoningType (SelfHostedType union), and remote URL fields. One-time migration maps existing settings to new modes. UI: ModeSelector segmented control (reuses ProviderTabs sliding-indicator pattern), SelfHostedPanel with OpenAI Compatible / LAN sub-tabs. TranscriptionModelPicker and ReasoningModelSelector accept optional mode prop to hide internal mode toggles and Custom tab when parent controls mode. Backend: whisperServer.js gains connectRemote(url) for LAN whisper-server connections with health checks and automatic hostname routing. ReasoningService.ts adds processWithLan() for LAN llama.cpp endpoints. New transcribe-lan-whisper IPC channel with preload bridge. i18n: mode labels, toast messages, and self-hosted strings added to all 10 locale files.
… selector Use the existing radio button card pattern (icon + label + description + radio circle) instead of a horizontal segmented control. This matches the original OpenWhispr Cloud / Custom Setup design and gives each mode a plain-English description so users immediately understand what it does. Delete ModeSelector.tsx — no longer used. Add mode description i18n keys (openwhisprDesc, providersDesc, localDesc, selfHostedDesc) across all 10 locale files.
…-Hosted is LAN-only Move Custom/OpenAI-Compatible endpoints back under Cloud Providers tab where they belong (Together AI, Fireworks, etc. are cloud services, not self-hosted). Self-Hosted mode is now purely LAN — just a server URL field, no sub-tabs. Rename mode labels: "Providers" → "Cloud Providers", "On Device" → "Local" (description carries "on-device" phrasing). Simplify SelfHostedPanel from 107 to 33 lines. Remove unused SelfHostedType props from SettingsPage section components.
…, DRY radio cards
- Fix self-hosted mode bug: default remoteTranscriptionType and
remoteReasoningType to "lan" so new users selecting Self-Hosted
actually route through the LAN whisper-server pipeline
- Extract InferenceModeSelector component to deduplicate ~100 lines of
identical radio card JSX between TranscriptionSection and AiModelsSection
- Extract isLanReasoningMode() helper in ReasoningService to replace 5
identical inline settings checks
- Remove dead transcribeLanWhisper IPC channel (preload, types, handler)
that was never called from renderer code
- Use stable noop reference instead of inline () => {} in render
- Move InferenceModeSelector to shared SettingsSection.tsx for reuse across SettingsPage, AgentModeSettings, and future consumers - Replace old two-card Cloud/Custom agent selector with the same four-mode pattern (OpenWhispr, Cloud Providers, Local, Self-Hosted) - Add agentInferenceMode and remoteAgentUrl store fields with migration from cloudAgentMode - Add lanUrl override to ReasoningConfig so agent self-hosted mode can pass its own URL independently of the global reasoning settings - Thread lanUrl through processTextStreaming and processTextStreamingAI - Update useChatStreaming to detect agent self-hosted mode and pass remoteAgentUrl to the reasoning pipeline - Add agent mode translation keys to all 10 locales
Main re-introduced showTranscriptionPreview in useSettings, settingsStore, and SettingsPage — removed again since the preview feature was replaced by the unified provider layout in this branch.
gabrielste1n
added a commit
that referenced
this pull request
Apr 12, 2026
Resolve conflicts with unified provider layout (PR #570): - ReasoningModelSelector: keep hoisted CLOUD_PROVIDER_IDS, add effectiveMode - SettingsPage: keep extracted useSettingsLayout import, add InferenceModeSelector - SettingsSection: keep extracted useSettingsLayout import, add useTranslation and InferenceMode
|
I don't see this implementation in 1.6.8 or 1.6.9 |
Collaborator
Author
|
@rearwindowvertigo you should see this? |
Collaborator
Author
|
what the... @rearwindowvertigo are you logged in with or without an account? |
|
I'm not logged in with an account |
|
I am the edge case... I find them all I become one with the edges... ... |
Collaborator
Author
|
@rearwindowvertigo are you in the discord? https://discord.gg/yZWC9WTtX7 I will fix this in 1.6.10 thanks for flagging |
|
Yeah, I'm in the Discord! |
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
Replaces the old two-option Cloud / Custom Setup selector across all three settings sections (Speech to Text, AI Text Enhancement, Agent Mode) with a unified four-mode inference selector:
Self-Hosted mode closes #561 — users can now point OpenWhispr at a remote whisper-server or LLM endpoint on their LAN without spawning a local process. Audio and text stay on the network.
What changed
New unified UI — a shared
InferenceModeSelectorcomponent renders the four-mode radio card group identically across Speech to Text, AI Text Enhancement, and Agent Mode settings. Each mode conditionally shows the relevant sub-panel (cloud provider picker, local model picker, or self-hosted URL input).Self-hosted transcription — when selected, the app connects to a remote whisper-server via
whisperServer.connectRemote(), health-checks it, then sends audio to its/inferenceendpoint. Falls back to local/cloud if unreachable. TheSelfHostedPanelcomponent provides the URL input.Self-hosted reasoning & agent chat — routes through the existing
ReasoningServicepipeline with a newlanUrloverride inReasoningConfig. The agent's self-hosted URL is independent from the intelligence section's URL, so they can point at different servers.Backwards-compatible migration —
migrateProviderSettings()andmigrateAgentMode()map old localStorage values (cloudTranscriptionMode,cloudReasoningMode,cloudAgentMode,useLocalWhisper) to the newInferenceModetype. Existing settings are preserved. Old BYOK fallback paths still work for migrated custom-provider users.Preview feature removed — the
TranscriptionPreviewOverlayfloating window, all its IPC channels, audio worklet plumbing, and window management code have been removed in favor of the new architecture.Key files
src/components/ui/SettingsSection.tsx— sharedInferenceModeSelectorsrc/components/SelfHostedPanel.tsx— URL input for self-hosted modesrc/components/SettingsPage.tsx— unified Speech to Text & AI Models sectionssrc/components/settings/AgentModeSettings.tsx— unified Agent Mode sectionsrc/stores/settingsStore.ts— new mode fields + migrationssrc/services/ReasoningService.ts—isLanReasoningMode()helper +lanUrlconfig overridesrc/helpers/whisperServer.js—connectRemote()for LAN whisper-serversrc/helpers/ipcHandlers.js— LAN transcription routing intranscribe-audioCloses #561