Description
When the selected AI provider is the local Fluid Intelligence (fluid-1), Edit Mode (β₯R) fails completely silently. The full interaction works β selection is captured, the instruction is transcribed, the second hotkey press confirms β and then the overlay just closes. No toast, no error, no hint. From the user's perspective it looks like Edit Mode is broken or their setup is wrong.
It took reading the source to discover the intended behavior: Edit Mode deliberately rejects the Private AI provider with "β¦ for Edit Mode is coming soon. Choose a verified chat provider or turn Sync off." β but that message never reaches the user.
Environment
- FluidVoice 1.6.5 (16), MLX backend,
fluid-1-nvfp4-mlx, "Sync" (rewrite linked to global) ON, global provider = Fluid Intelligence
- macOS 26.5.2, MacBook Pro M1 Pro 16 GB
Steps to reproduce
- Use local Fluid Intelligence as the (global) provider, Edit Mode linked to global.
- Select text in any app, press β₯R, speak e.g. "Simplify the text", press β₯R again.
- Overlay shows Transcribing β closes. Nothing else happens.
Log evidence
[11:28:48.543] [INFO] [ContentView] Routing decision snapshot | activeMode=edit | rewrite=true | command=false | overlay=Edit
[11:28:48.909] [INFO] [ContentView] Processing rewrite with instruction: Simplify the text.
[11:28:48.909] [INFO] [ContentView] Processing rewrite - instruction: 'Simplify the text.', originalText length: 1509
[11:28:49.019] [ERROR] [ContentView] Rewrite failed - no result
(~110 ms failure β the guard throws before any model call.)
Cause (from source)
callLLM guards throw for the Private AI provider / model, but processRewriteRequest's catch block only appends the error to the (already dismissed) conversation history; nothing is surfaced:
|
userInfo: [NSLocalizedDescriptionKey: "No verified AI provider selected"] |
|
) |
|
} |
|
guard !self.isPrivateAIProviderID(providerID) else { |
|
throw NSError( |
|
domain: "RewriteMode", |
|
code: -5, |
|
userInfo: [NSLocalizedDescriptionKey: "\(PrivateAIProviderFeature.displayName) for Edit Mode is coming soon. Choose a verified chat provider or turn Sync off."] |
|
) |
|
} |
|
guard self.isProviderVerified(providerID, settings: settings) else { |
|
throw NSError( |
|
domain: "RewriteMode", |
|
code: -3, |
|
userInfo: [NSLocalizedDescriptionKey: "Selected AI provider is not verified"] |
(guards with the "coming soon" message)
|
self.conversationHistory.append(Message(role: .assistant, content: "Error: \(error.localizedDescription)")) |
|
self.isProcessing = false |
|
self.appendDiagnosticLog( |
|
"processRewriteRequest failure | writeMode=\(self.isWriteMode) | error=\(error.localizedDescription)" |
|
) |
|
|
|
AnalyticsService.shared.capture( |
|
.rewriteRunCompleted, |
(catch: error goes to conversationHistory only)
Command Mode has the same pattern.
Expected behavior
Any of these would fix the confusion:
- Show the existing error text in the overlay/notification when a rewrite fails ("Fluid Intelligence for Edit Mode is coming soon β choose a chat provider or turn Sync off"). It's a perfectly actionable message; it just never gets displayed.
- Even better: detect the unsupported provider at β₯R press and show the hint immediately, instead of letting the user record an instruction that can't be processed.
- Longer term, obviously: Fluid-1 support for Edit Mode π
Related: #705 (separate report about first-dictation cold start).
Description
When the selected AI provider is the local Fluid Intelligence (
fluid-1), Edit Mode (β₯R) fails completely silently. The full interaction works β selection is captured, the instruction is transcribed, the second hotkey press confirms β and then the overlay just closes. No toast, no error, no hint. From the user's perspective it looks like Edit Mode is broken or their setup is wrong.It took reading the source to discover the intended behavior: Edit Mode deliberately rejects the Private AI provider with "β¦ for Edit Mode is coming soon. Choose a verified chat provider or turn Sync off." β but that message never reaches the user.
Environment
fluid-1-nvfp4-mlx, "Sync" (rewrite linked to global) ON, global provider = Fluid IntelligenceSteps to reproduce
Log evidence
(~110 ms failure β the guard throws before any model call.)
Cause (from source)
callLLMguards throw for the Private AI provider / model, butprocessRewriteRequest's catch block only appends the error to the (already dismissed) conversation history; nothing is surfaced:FluidVoice/Sources/Fluid/Services/RewriteModeService.swift
Lines 219 to 233 in 1b070a8
FluidVoice/Sources/Fluid/Services/RewriteModeService.swift
Lines 145 to 152 in 1b070a8
conversationHistoryonly)Command Mode has the same pattern.
Expected behavior
Any of these would fix the confusion:
Related: #705 (separate report about first-dictation cold start).