Add transcription model selection and lifecycle management - #21
Merged
Conversation
Contributor
There was a problem hiding this comment.
Pull request overview
This PR introduces an explicit transcription model manager (local Nemotron/Whisper discovery + external server option) and adds lifecycle controls (start/stop/restart) with richer runtime status reporting, aligning the Settings UI and runtime behavior with the new model-selection semantics.
Changes:
- Add backend model inventory, persisted selection (
stt_engine), lifecycle APIs, and expanded runtime status (stopped/loading/ready/configured/error). - Update frontend Settings UI to select/test/manage transcription models and display live runtime state.
- Update README and regenerate Wails TypeScript bindings for the new APIs and models.
Reviewed changes
Copilot reviewed 11 out of 11 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| README.md | Updates documentation to reflect model selection UI and lifecycle semantics. |
| meeting_service.go | Implements model selection, validation, lifecycle management, and expanded runtime info. |
| meeting_service_test.go | Adds tests covering explicit selection semantics, lifecycle controls, and external reachability. |
| internal/store/store.go | Adds stt_engine, migration logic, and SaveTranscriptionSettings for atomic transcription persistence. |
| internal/store/store_test.go | Extends settings persistence tests and adds a legacy migration test. |
| frontend/src/components/SettingsDialog.tsx | Replaces legacy fields with model selector, test, lifecycle actions, and runtime-status panel. |
| frontend/src/App.tsx | Enhances footer status display and passes meeting/runtime state into SettingsDialog. |
| frontend/bindings/** | Regenerated bindings to expose new types and MeetingService methods. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+312
to
319
| if settings.SttEngine == "external" { | ||
| remote := strings.TrimSpace(settings.SttBaseURL) | ||
| if remote == "" { | ||
| return m.fail("The external transcription URL is empty. Choose a local model or configure the server URL in Settings.", errors.New("external transcription URL is empty")) | ||
| } | ||
| log.Printf("[stt] using remote transcription server: %s", remote) | ||
| sttURL = strings.TrimRight(remote, "/") | ||
| } else { |
Comment on lines
+307
to
+309
| // Transcription endpoint: the explicitly configured remote server or a | ||
| // supervised local engine. Automatic local selection retains the original | ||
| // Nemotron-first, Whisper-fallback behavior. |
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
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
This PR turns the transcription settings from two loosely coupled text fields into an explicit transcription model manager. Users can discover and select installed local models or an external server, see the current runtime state, and control local model memory/process lifecycle without starting a meeting.
The feature branch has been brought fully up to date with
mainat708f7df, including the dashboard/export work, shared Nemotron storage and provisioning changes, Windows process-tree cleanup, installer upgrade fix, and Wails/dependency updates.User experience
Model selection
Settings → Transcription now presents a model selector containing:
.binmodel underresources/whisper/modelsand expose each as a separate choice./inferenceendpoint.Unavailable choices remain visible with a concrete reason, and a previously selected Whisper file that has since been removed is represented as a missing selection rather than silently changing the saved configuration.
Runtime lifecycle
For local models, users can:
Changing models or using lifecycle controls is blocked while a meeting is active. Starting a meeting automatically loads a selected local model if it was previously stopped, so releasing memory between meetings does not make the next meeting fail unexpectedly.
External servers expose a Test action that verifies URL validity and HTTP reachability. Parley intentionally does not attempt to start, stop, or restart remote processes.
Status visibility
The settings panel and application footer now distinguish:
loadingreadystoppedconfigurederrorStatus messages show the configured/actual model and useful startup failure details. Runtime changes are emitted to the frontend so model state updates without reopening Settings.
Selection and fallback semantics
This distinction lets users choose between resilience and strict control rather than having every selection silently resolve to a different backend.
Persistence and compatibility
settings.stt_enginewithauto,nemotron,whisper, andexternalvalues.external;auto.whisper_modelandstt_base_urlvalues.Integration with current main
The branch was merged with current
mainand conflicts were resolved in README documentation and generated settings bindings. The combined implementation also received a semantic integration fix: Nemotron inventory now recognizes the shared LocalAppData installation and.source-rootredirects introduced by the newer provisioning flow, in addition to legacy beside-the-executable installations.The existing Windows kill-on-close process supervision remains in the local STT server, so Stop, Restart, model changes, application shutdown, and installer upgrades clean up child process trees rather than leaving Python/CUDA descendants behind.
Backend/API changes
New Wails service methods:
ListTranscriptionModelsConfigureTranscriptionStartTranscriptionModelStopTranscriptionModelRestartTranscriptionModelTestExternalTranscriptionRuntimeInfonow includes the selected model ID, local/external kind, lifecycle status, and a human-readable status message.Validation
origin/mainwith conflicts resolved and no remaining conflict markers.v3.0.0-alpha2.117.go test -count=1 ./...go vet ./...npx tsc --noEmitnpm run buildwith Vite 8.1.5git diff --checkCoverage includes legacy settings migration, explicit-selection fallback behavior, external reachability, local Stop/Start reuse, active-meeting lifecycle guards, runtime reporting, and recognition of the shared Nemotron installation.