Remove enhancement opacity, update Gemini models, add AI reasoning filter
This commit is contained in:
parent
d08cac5a3a
commit
2bd2c96be2
25
VoiceInk/Services/AIEnhancementOutputFilter.swift
Normal file
25
VoiceInk/Services/AIEnhancementOutputFilter.swift
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import Foundation
|
||||||
|
|
||||||
|
struct AIEnhancementOutputFilter {
|
||||||
|
private static let reasoningPatterns = [
|
||||||
|
#"(?s)<think>.*?</think>"#,
|
||||||
|
#"(?s)<reasoning>.*?</reasoning>"#,
|
||||||
|
#"(?s)<analysis>.*?</analysis>"#,
|
||||||
|
]
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -181,7 +181,8 @@ class AIEnhancementService: ObservableObject {
|
|||||||
if aiService.selectedProvider == .ollama {
|
if aiService.selectedProvider == .ollama {
|
||||||
do {
|
do {
|
||||||
let result = try await aiService.enhanceWithOllama(text: formattedText, systemPrompt: systemMessage)
|
let result = try await aiService.enhanceWithOllama(text: formattedText, systemPrompt: systemMessage)
|
||||||
return result
|
let filteredResult = AIEnhancementOutputFilter.filter(result)
|
||||||
|
return filteredResult
|
||||||
} catch let error as LocalAIError {
|
} catch let error as LocalAIError {
|
||||||
switch error {
|
switch error {
|
||||||
case .serviceUnavailable:
|
case .serviceUnavailable:
|
||||||
@ -251,7 +252,8 @@ class AIEnhancementService: ObservableObject {
|
|||||||
throw EnhancementError.enhancementFailed
|
throw EnhancementError.enhancementFailed
|
||||||
}
|
}
|
||||||
|
|
||||||
return enhancedText.trimmingCharacters(in: .whitespacesAndNewlines)
|
let filteredText = AIEnhancementOutputFilter.filter(enhancedText.trimmingCharacters(in: .whitespacesAndNewlines))
|
||||||
|
return filteredText
|
||||||
|
|
||||||
case 401:
|
case 401:
|
||||||
throw EnhancementError.authenticationFailed
|
throw EnhancementError.authenticationFailed
|
||||||
@ -306,7 +308,8 @@ class AIEnhancementService: ObservableObject {
|
|||||||
throw EnhancementError.enhancementFailed
|
throw EnhancementError.enhancementFailed
|
||||||
}
|
}
|
||||||
|
|
||||||
return enhancedText.trimmingCharacters(in: .whitespacesAndNewlines)
|
let filteredText = AIEnhancementOutputFilter.filter(enhancedText.trimmingCharacters(in: .whitespacesAndNewlines))
|
||||||
|
return filteredText
|
||||||
|
|
||||||
case 401:
|
case 401:
|
||||||
throw EnhancementError.authenticationFailed
|
throw EnhancementError.authenticationFailed
|
||||||
@ -368,7 +371,8 @@ class AIEnhancementService: ObservableObject {
|
|||||||
throw EnhancementError.enhancementFailed
|
throw EnhancementError.enhancementFailed
|
||||||
}
|
}
|
||||||
|
|
||||||
return enhancedText.trimmingCharacters(in: .whitespacesAndNewlines)
|
let filteredText = AIEnhancementOutputFilter.filter(enhancedText.trimmingCharacters(in: .whitespacesAndNewlines))
|
||||||
|
return filteredText
|
||||||
|
|
||||||
case 401:
|
case 401:
|
||||||
throw EnhancementError.authenticationFailed
|
throw EnhancementError.authenticationFailed
|
||||||
|
|||||||
@ -52,7 +52,7 @@ enum AIProvider: String, CaseIterable {
|
|||||||
case .deepSeek:
|
case .deepSeek:
|
||||||
return "deepseek-chat"
|
return "deepseek-chat"
|
||||||
case .gemini:
|
case .gemini:
|
||||||
return "gemini-2.5-pro"
|
return "gemini-2.0-flash-lite"
|
||||||
case .anthropic:
|
case .anthropic:
|
||||||
return "claude-sonnet-4-0"
|
return "claude-sonnet-4-0"
|
||||||
case .mistral:
|
case .mistral:
|
||||||
@ -75,7 +75,8 @@ enum AIProvider: String, CaseIterable {
|
|||||||
case .groq:
|
case .groq:
|
||||||
return [
|
return [
|
||||||
"llama-3.3-70b-versatile",
|
"llama-3.3-70b-versatile",
|
||||||
"llama-3.1-8b-instant"
|
"llama-3.1-8b-instant",
|
||||||
|
"qwen/qwen3-32b"
|
||||||
]
|
]
|
||||||
case .openAI:
|
case .openAI:
|
||||||
return [
|
return [
|
||||||
|
|||||||
@ -73,7 +73,6 @@ struct EnhancementSettingsView: View {
|
|||||||
.padding()
|
.padding()
|
||||||
.background(Color(.windowBackgroundColor).opacity(0.4))
|
.background(Color(.windowBackgroundColor).opacity(0.4))
|
||||||
.cornerRadius(10)
|
.cornerRadius(10)
|
||||||
.opacity(enhancementService.isEnhancementEnabled ? 1.0 : 0.6)
|
|
||||||
|
|
||||||
// 3. Enhancement Modes & Assistant Section
|
// 3. Enhancement Modes & Assistant Section
|
||||||
VStack(alignment: .leading, spacing: 16) {
|
VStack(alignment: .leading, spacing: 16) {
|
||||||
@ -102,7 +101,6 @@ struct EnhancementSettingsView: View {
|
|||||||
}
|
}
|
||||||
.padding()
|
.padding()
|
||||||
.background(CardBackground(isSelected: false))
|
.background(CardBackground(isSelected: false))
|
||||||
.opacity(enhancementService.isEnhancementEnabled ? 1.0 : 0.6)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.padding(24)
|
.padding(24)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user