Skip to content

[🐞 BUG] Edit Mode (βŒ₯R) fails silently when provider is Fluid Intelligence β€” "coming soon" error is never shown to the userΒ #706

Description

@matejcermak

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

  1. Use local Fluid Intelligence as the (global) provider, Edit Mode linked to global.
  2. Select text in any app, press βŒ₯R, speak e.g. "Simplify the text", press βŒ₯R again.
  3. 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:

  1. 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.
  2. 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.
  3. Longer term, obviously: Fluid-1 support for Edit Mode πŸ™‚

Related: #705 (separate report about first-dictation cold start).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions