diff --git a/VoiceInk/Services/AIEnhancementOutputFilter.swift b/VoiceInk/Services/AIEnhancementOutputFilter.swift new file mode 100644 index 0000000..c1601ee --- /dev/null +++ b/VoiceInk/Services/AIEnhancementOutputFilter.swift @@ -0,0 +1,25 @@ +import Foundation + +struct AIEnhancementOutputFilter { + private static let reasoningPatterns = [ + #"(?s).*?"#, + #"(?s).*?"#, + #"(?s).*?"#, + ] + + static func filter(_ text: String) -> String { + var filteredText = text + + for pattern in reasoningPatterns { + if let regex = try? NSRegularExpression(pattern: pattern) { + let range = NSRange(filteredText.startIndex..., in: filteredText) + filteredText = regex.stringByReplacingMatches(in: filteredText, options: [], range: range, withTemplate: "") + } + } + + filteredText = filteredText.replacingOccurrences(of: #"\s{2,}"#, with: " ", options: .regularExpression) + filteredText = filteredText.trimmingCharacters(in: .whitespacesAndNewlines) + + return filteredText + } +} \ No newline at end of file diff --git a/VoiceInk/Services/AIEnhancementService.swift b/VoiceInk/Services/AIEnhancementService.swift index 30084cd..ce383ee 100644 --- a/VoiceInk/Services/AIEnhancementService.swift +++ b/VoiceInk/Services/AIEnhancementService.swift @@ -181,7 +181,8 @@ class AIEnhancementService: ObservableObject { if aiService.selectedProvider == .ollama { do { let result = try await aiService.enhanceWithOllama(text: formattedText, systemPrompt: systemMessage) - return result + let filteredResult = AIEnhancementOutputFilter.filter(result) + return filteredResult } catch let error as LocalAIError { switch error { case .serviceUnavailable: @@ -251,7 +252,8 @@ class AIEnhancementService: ObservableObject { throw EnhancementError.enhancementFailed } - return enhancedText.trimmingCharacters(in: .whitespacesAndNewlines) + let filteredText = AIEnhancementOutputFilter.filter(enhancedText.trimmingCharacters(in: .whitespacesAndNewlines)) + return filteredText case 401: throw EnhancementError.authenticationFailed @@ -306,7 +308,8 @@ class AIEnhancementService: ObservableObject { throw EnhancementError.enhancementFailed } - return enhancedText.trimmingCharacters(in: .whitespacesAndNewlines) + let filteredText = AIEnhancementOutputFilter.filter(enhancedText.trimmingCharacters(in: .whitespacesAndNewlines)) + return filteredText case 401: throw EnhancementError.authenticationFailed @@ -368,7 +371,8 @@ class AIEnhancementService: ObservableObject { throw EnhancementError.enhancementFailed } - return enhancedText.trimmingCharacters(in: .whitespacesAndNewlines) + let filteredText = AIEnhancementOutputFilter.filter(enhancedText.trimmingCharacters(in: .whitespacesAndNewlines)) + return filteredText case 401: throw EnhancementError.authenticationFailed diff --git a/VoiceInk/Services/AIService.swift b/VoiceInk/Services/AIService.swift index f06cf2e..042ef7b 100644 --- a/VoiceInk/Services/AIService.swift +++ b/VoiceInk/Services/AIService.swift @@ -52,7 +52,7 @@ enum AIProvider: String, CaseIterable { case .deepSeek: return "deepseek-chat" case .gemini: - return "gemini-2.5-pro" + return "gemini-2.0-flash-lite" case .anthropic: return "claude-sonnet-4-0" case .mistral: @@ -75,7 +75,8 @@ enum AIProvider: String, CaseIterable { case .groq: return [ "llama-3.3-70b-versatile", - "llama-3.1-8b-instant" + "llama-3.1-8b-instant", + "qwen/qwen3-32b" ] case .openAI: return [ diff --git a/VoiceInk/Views/EnhancementSettingsView.swift b/VoiceInk/Views/EnhancementSettingsView.swift index 7bd8ee2..714d677 100644 --- a/VoiceInk/Views/EnhancementSettingsView.swift +++ b/VoiceInk/Views/EnhancementSettingsView.swift @@ -73,7 +73,6 @@ struct EnhancementSettingsView: View { .padding() .background(Color(.windowBackgroundColor).opacity(0.4)) .cornerRadius(10) - .opacity(enhancementService.isEnhancementEnabled ? 1.0 : 0.6) // 3. Enhancement Modes & Assistant Section VStack(alignment: .leading, spacing: 16) { @@ -102,7 +101,6 @@ struct EnhancementSettingsView: View { } .padding() .background(CardBackground(isSelected: false)) - .opacity(enhancementService.isEnhancementEnabled ? 1.0 : 0.6) } } .padding(24)