Fixed Open Router model issues with Power Mode

This commit is contained in:
Beingpax 2025-06-30 12:55:24 +05:45
parent 8c44efad64
commit abe5972d1e
3 changed files with 73 additions and 52 deletions

View File

@ -5,7 +5,6 @@ struct ConfigurationView: View {
let powerModeManager: PowerModeManager
@EnvironmentObject var enhancementService: AIEnhancementService
@EnvironmentObject var aiService: AIService
@Environment(\.dismiss) private var dismiss
@Environment(\.presentationMode) private var presentationMode
@FocusState private var isNameFieldFocused: Bool
@ -225,8 +224,7 @@ struct ConfigurationView: View {
Spacer()
}
.padding()
.background(Color(.windowBackgroundColor).opacity(0.2))
.cornerRadius(8)
.background(CardBackground(isSelected: false))
} else {
// Grid of selected apps that wraps to next line
LazyVGrid(columns: [GridItem(.adaptive(minimum: 50, maximum: 55), spacing: 10)], spacing: 10) {
@ -302,8 +300,7 @@ struct ConfigurationView: View {
Spacer()
}
.padding()
.background(Color(.windowBackgroundColor).opacity(0.2))
.cornerRadius(8)
.background(CardBackground(isSelected: false))
} else {
// Grid of website tags that wraps to next line
LazyVGrid(columns: [GridItem(.adaptive(minimum: 100, maximum: 160), spacing: 10)], spacing: 10) {
@ -339,10 +336,7 @@ struct ConfigurationView: View {
}
}
.padding()
.background(
RoundedRectangle(cornerRadius: 12)
.fill(Color(.windowBackgroundColor).opacity(0.4))
)
.background(CardBackground(isSelected: false))
.padding(.horizontal)
}
@ -358,8 +352,7 @@ struct ConfigurationView: View {
.foregroundColor(.secondary)
.padding()
.frame(maxWidth: .infinity, alignment: .center)
.background(Color(.windowBackgroundColor).opacity(0.2))
.cornerRadius(8)
.background(CardBackground(isSelected: false))
} else {
// Create a simple binding that uses current model if nil
let modelBinding = Binding<String?>(
@ -420,17 +413,11 @@ struct ConfigurationView: View {
let modelInfo = whisperState.allAvailableModels.first(where: { $0.name == selectedModel }),
!modelInfo.isMultilingualModel {
// Silently set to English without showing UI
EmptyView()
.onAppear {
selectedLanguage = "en"
}
let _ = { selectedLanguage = "en" }()
}
}
.padding()
.background(
RoundedRectangle(cornerRadius: 12)
.fill(Color(.windowBackgroundColor).opacity(0.4))
)
.background(CardBackground(isSelected: false))
.padding(.horizontal)
// SECTION 3: AI ENHANCEMENT
@ -515,8 +502,8 @@ struct ConfigurationView: View {
.font(.subheadline)
.foregroundColor(.secondary)
if provider == .ollama && aiService.availableModels.isEmpty {
Text("No models available")
if aiService.availableModels.isEmpty {
Text(provider == .openRouter ? "No models loaded" : "No models available")
.foregroundColor(.secondary)
.italic()
.frame(maxWidth: .infinity, alignment: .leading)
@ -537,7 +524,7 @@ struct ConfigurationView: View {
}
)
let models = provider == .ollama ? aiService.availableModels : provider.availableModels
let models = provider == .openRouter ? aiService.availableModels : (provider == .ollama ? aiService.availableModels : provider.availableModels)
Picker("", selection: modelBinding) {
ForEach(models, id: \.self) { model in
@ -545,7 +532,19 @@ struct ConfigurationView: View {
}
}
.labelsHidden()
if provider == .openRouter {
Button(action: {
Task {
await aiService.fetchOpenRouterModels()
}
}) {
Image(systemName: "arrow.clockwise")
}
.buttonStyle(.borderless)
.help("Refresh models")
}
Spacer()
}
}
@ -586,10 +585,7 @@ struct ConfigurationView: View {
}
}
.padding()
.background(
RoundedRectangle(cornerRadius: 12)
.fill(Color(.windowBackgroundColor).opacity(0.4))
)
.background(CardBackground(isSelected: false))
.padding(.horizontal)
// Save Button

View File

@ -174,7 +174,7 @@ class AIService: ObservableObject {
private let userDefaults = UserDefaults.standard
private lazy var ollamaService = OllamaService()
private var openRouterModels: [String] = []
@Published private var openRouterModels: [String] = []
var connectedProviders: [AIProvider] {
AIProvider.allCases.filter { provider in
@ -223,6 +223,7 @@ class AIService: ObservableObject {
}
loadSavedModelSelections()
loadSavedOpenRouterModels()
}
private func loadSavedModelSelections() {
@ -234,6 +235,16 @@ class AIService: ObservableObject {
}
}
private func loadSavedOpenRouterModels() {
if let savedModels = userDefaults.array(forKey: "openRouterModels") as? [String] {
openRouterModels = savedModels
}
}
private func saveOpenRouterModels() {
userDefaults.set(openRouterModels, forKey: "openRouterModels")
}
func selectModel(_ model: String) {
guard !model.isEmpty else { return }
@ -499,6 +510,7 @@ class AIService: ObservableObject {
logger.error("Failed to fetch OpenRouter models: Invalid HTTP response")
await MainActor.run {
self.openRouterModels = []
self.saveOpenRouterModels()
self.objectWillChange.send()
}
return
@ -509,6 +521,7 @@ class AIService: ObservableObject {
logger.error("Failed to parse OpenRouter models JSON")
await MainActor.run {
self.openRouterModels = []
self.saveOpenRouterModels()
self.objectWillChange.send()
}
return
@ -517,6 +530,7 @@ class AIService: ObservableObject {
let models = dataArray.compactMap { $0["id"] as? String }
await MainActor.run {
self.openRouterModels = models.sorted()
self.saveOpenRouterModels() // Save to UserDefaults
if self.selectedProvider == .openRouter && self.currentModel == self.selectedProvider.defaultModel && !models.isEmpty {
self.selectModel(models.sorted().first!)
}
@ -528,12 +542,15 @@ class AIService: ObservableObject {
logger.error("Error fetching OpenRouter models: \(error.localizedDescription)")
await MainActor.run {
self.openRouterModels = []
self.saveOpenRouterModels()
self.objectWillChange.send()
}
}
}
}
extension Notification.Name {
static let aiProviderKeyChanged = Notification.Name("aiProviderKeyChanged")
}

View File

@ -52,17 +52,41 @@ struct APIKeyManagementView: View {
.onChange(of: aiService.selectedProvider) { oldValue, newValue in
if aiService.selectedProvider == .ollama {
checkOllamaConnection()
} else if aiService.selectedProvider == .openRouter {
Task {
await aiService.fetchOpenRouterModels()
}
}
}
// Model Selection - only show for standard providers with available models
if !aiService.availableModels.isEmpty &&
aiService.selectedProvider != .ollama &&
aiService.selectedProvider != .custom {
// Model Selection
if aiService.selectedProvider == .openRouter {
HStack {
if aiService.availableModels.isEmpty {
Text("No models loaded")
.foregroundColor(.secondary)
} else {
Picker("Model", selection: Binding(
get: { aiService.currentModel },
set: { aiService.selectModel($0) }
)) {
ForEach(aiService.availableModels, id: \.self) { model in
Text(model).tag(model)
}
}
}
Button(action: {
Task {
await aiService.fetchOpenRouterModels()
}
}) {
Image(systemName: "arrow.clockwise")
}
.buttonStyle(.borderless)
.help("Refresh models")
}
} else if !aiService.availableModels.isEmpty &&
aiService.selectedProvider != .ollama &&
aiService.selectedProvider != .custom {
HStack {
Picker("Model", selection: Binding(
get: { aiService.currentModel },
@ -72,18 +96,6 @@ struct APIKeyManagementView: View {
Text(model).tag(model)
}
}
if aiService.selectedProvider == .openRouter {
Button(action: {
Task {
await aiService.fetchOpenRouterModels()
}
}) {
Image(systemName: "arrow.clockwise")
}
.buttonStyle(.borderless)
.help("Refresh models")
}
}
}
@ -440,10 +452,6 @@ struct APIKeyManagementView: View {
.onAppear {
if aiService.selectedProvider == .ollama {
checkOllamaConnection()
} else if aiService.selectedProvider == .openRouter {
Task {
await aiService.fetchOpenRouterModels()
}
}
}
}