From 2bd9eaecb80bf227acd7f5297c8424f335acc658 Mon Sep 17 00:00:00 2001 From: GeorgeZudikhin Date: Sat, 18 Apr 2026 16:30:33 +0200 Subject: [PATCH] model --- leanring-buddy/AI/OpenAIAPI.swift | 18 +++++++++++++----- leanring-buddy/App/CompanionManager.swift | 15 ++++++++++++++- leanring-buddy/UI/CompanionPanelView.swift | 4 ++-- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/leanring-buddy/AI/OpenAIAPI.swift b/leanring-buddy/AI/OpenAIAPI.swift index 7426b2bca..410670878 100644 --- a/leanring-buddy/AI/OpenAIAPI.swift +++ b/leanring-buddy/AI/OpenAIAPI.swift @@ -15,7 +15,7 @@ class OpenAIAPI { var model: String private let session: URLSession - init(proxyURL: String, model: String = "gpt-4o") { + init(proxyURL: String, model: String = "gpt-5.4") { self.apiURL = URL(string: proxyURL)! self.model = model @@ -100,7 +100,8 @@ class OpenAIAPI { contentBlocks.append([ "type": "image_url", "image_url": [ - "url": "data:image/jpeg;base64,\(image.data.base64EncodedString())" + "url": "data:image/jpeg;base64,\(image.data.base64EncodedString())", + "detail": "high" ] ]) } @@ -110,12 +111,15 @@ class OpenAIAPI { ]) messages.append(["role": "user", "content": contentBlocks]) - let body: [String: Any] = [ + var body: [String: Any] = [ "model": model, "max_completion_tokens": 1024, "stream": true, "messages": messages ] + if model.hasPrefix("gpt-5") { + body["reasoning_effort"] = "high" + } let bodyData = try JSONSerialization.data(withJSONObject: body) request.httpBody = bodyData @@ -202,7 +206,8 @@ class OpenAIAPI { contentBlocks.append([ "type": "image_url", "image_url": [ - "url": "data:image/jpeg;base64,\(image.data.base64EncodedString())" + "url": "data:image/jpeg;base64,\(image.data.base64EncodedString())", + "detail": "high" ] ]) } @@ -212,11 +217,14 @@ class OpenAIAPI { ]) messages.append(["role": "user", "content": contentBlocks]) - let body: [String: Any] = [ + var body: [String: Any] = [ "model": model, "max_completion_tokens": 256, "messages": messages ] + if model.hasPrefix("gpt-5") { + body["reasoning_effort"] = "high" + } let bodyData = try JSONSerialization.data(withJSONObject: body) request.httpBody = bodyData diff --git a/leanring-buddy/App/CompanionManager.swift b/leanring-buddy/App/CompanionManager.swift index d30d0c2a3..aa643be07 100644 --- a/leanring-buddy/App/CompanionManager.swift +++ b/leanring-buddy/App/CompanionManager.swift @@ -130,8 +130,21 @@ final class CompanionManager: ObservableObject { /// Used by the panel to show accurate status text ("Active" vs "Ready"). @Published private(set) var isOverlayVisible: Bool = false + private static let defaultAIModel = "gpt-5.4" + /// The AI model used for voice responses. Persisted to UserDefaults. - @Published var selectedModel: String = UserDefaults.standard.string(forKey: "selectedAIModel") ?? "gpt-4o" + @Published var selectedModel: String = { + let selectedAIModelUserDefaultsKey = "selectedAIModel" + let legacyModelIDs = ["gpt-4o", "gpt-4o-mini", "gpt-4.1"] + + if let savedModel = UserDefaults.standard.string(forKey: selectedAIModelUserDefaultsKey), + !legacyModelIDs.contains(savedModel) { + return savedModel + } + + UserDefaults.standard.set(defaultAIModel, forKey: selectedAIModelUserDefaultsKey) + return defaultAIModel + }() func setSelectedModel(_ model: String) { selectedModel = model diff --git a/leanring-buddy/UI/CompanionPanelView.swift b/leanring-buddy/UI/CompanionPanelView.swift index 2e51c1ddd..695dc1187 100644 --- a/leanring-buddy/UI/CompanionPanelView.swift +++ b/leanring-buddy/UI/CompanionPanelView.swift @@ -631,8 +631,8 @@ struct CompanionPanelView: View { Spacer() HStack(spacing: 0) { - modelOptionButton(label: "GPT-4o", modelID: "gpt-4o") - modelOptionButton(label: "GPT-4o mini", modelID: "gpt-4o-mini") + modelOptionButton(label: "GPT-5.4", modelID: "gpt-5.4") + modelOptionButton(label: "GPT-4.1", modelID: "gpt-4.1") } .background( RoundedRectangle(cornerRadius: 6, style: .continuous)