From 82db8e1a3b57e459e1d390bd617786314afa7e24 Mon Sep 17 00:00:00 2001 From: tisfeng Date: Sat, 8 Jun 2024 20:45:38 +0800 Subject: [PATCH 01/21] refactor: replace const key with enum StoredKey --- .../Configuration+Defaults.swift | 64 ++++++++--------- .../Configuration/DefaultsStoredKey.swift | 70 +++++++------------ .../Service/OpenAI/LLMStreamService.swift | 8 +-- 3 files changed, 61 insertions(+), 81 deletions(-) diff --git a/Easydict/Swift/Feature/Configuration/Configuration+Defaults.swift b/Easydict/Swift/Feature/Configuration/Configuration+Defaults.swift index 629799283..6f3815a2e 100644 --- a/Easydict/Swift/Feature/Configuration/Configuration+Defaults.swift +++ b/Easydict/Swift/Feature/Configuration/Configuration+Defaults.swift @@ -208,123 +208,123 @@ class ShortcutWrapper { // Service Configuration extension Defaults.Keys { // OpenAI - static let openAIAPIKey = Key(apiStoredKey(.openAI)) // EZOpenAIAPIKey + static let openAIAPIKey = Key(storedKey(.api, serviceType: .openAI)) // EZOpenAIAPIKey static let openAITranslation = Key( - translationStoredKey(.openAI), + storedKey(.translation, serviceType: .openAI), default: "1" ) static let openAIDictionary = Key( - dictionaryStoredKey(.openAI), + storedKey(.dictionary, serviceType: .openAI), default: "1" ) static let openAISentence = Key( - sentenceStoredKey(.openAI), + storedKey(.sentence, serviceType: .openAI), default: "1" ) static let openAIServiceUsageStatus = Key( - serviceUsageStatusStoredKey(.openAI), + storedKey(.serviceUsageStatus, serviceType: .openAI), default: .default ) - static let openAIEndPoint = Key(endpointStoredKey(.openAI)) + static let openAIEndPoint = Key(storedKey(.endpoint, serviceType: .openAI)) static let openAIModel = Key( - modelStoredKey(.openAI), + storedKey(.model, serviceType: .openAI), default: OpenAIModel.gpt3_5_turbo.rawValue ) static let openAIAvailableModels = Key( - availableModelsStoredKey(.openAI), + storedKey(.availableModels, serviceType: .openAI), default: OpenAIModel.allCases.map { $0.rawValue }.joined(separator: ",") ) static let openAIVaildModels = Key( - validModelsStoredKey(.openAI), + storedKey(.validModels, serviceType: .openAI), default: OpenAIModel.allCases.map { $0.rawValue } ) // Custom OpenAI static let customOpenAINameKey = Key( - nameStoredKey(.customOpenAI), + storedKey(.name, serviceType: .customOpenAI), default: NSLocalizedString("custom_openai", comment: "") ) - static let customOpenAIAPIKey = Key(apiStoredKey(.customOpenAI)) + static let customOpenAIAPIKey = Key(storedKey(.api, serviceType: .customOpenAI)) static let customOpenAITranslation = Key( - translationStoredKey(.customOpenAI), + storedKey(.translation, serviceType: .customOpenAI), default: "1" ) static let customOpenAIDictionary = Key( - dictionaryStoredKey(.customOpenAI), + storedKey(.dictionary, serviceType: .customOpenAI), default: "0" ) static let customOpenAISentence = Key( - sentenceStoredKey(.customOpenAI), + storedKey(.sentence, serviceType: .customOpenAI), default: "0" ) static let customOpenAIServiceUsageStatus = Key( - serviceUsageStatusStoredKey(.builtInAI), + storedKey(.serviceUsageStatus, serviceType: .customOpenAI), default: .default ) - static let customOpenAIEndPoint = Key(endpointStoredKey(.customOpenAI)) + static let customOpenAIEndPoint = Key(storedKey(.endpoint, serviceType: .customOpenAI)) static let customOpenAIModel = Key( - modelStoredKey(.customOpenAI), + storedKey(.model, serviceType: .customOpenAI), default: "" ) static let customOpenAIAvailableModels = Key( - availableModelsStoredKey(.customOpenAI), + storedKey(.availableModels, serviceType: .customOpenAI), default: "" ) static let customOpenAIVaildModels = Key( - validModelsStoredKey(.customOpenAI), + storedKey(.validModels, serviceType: .customOpenAI), default: [""] ) // Built-in AI static let builtInAIModel = Key( - modelStoredKey(.builtInAI), + storedKey(.model, serviceType: .builtInAI), default: "" ) // EZBuiltInAIModelKey static let builtInAITranslation = Key( - translationStoredKey(.builtInAI), + storedKey(.translation, serviceType: .builtInAI), default: "1" ) static let builtInAIDictionary = Key( - dictionaryStoredKey(.builtInAI), + storedKey(.dictionary, serviceType: .builtInAI), default: "0" ) static let builtInAISentence = Key( - sentenceStoredKey(.builtInAI), + storedKey(.sentence, serviceType: .builtInAI), default: "0" ) static let builtInAIServiceUsageStatus = Key( - serviceUsageStatusStoredKey(.builtInAI), + storedKey(.serviceUsageStatus, serviceType: .builtInAI), default: .default ) // Gemni - static let geminiAPIKey = Key(apiStoredKey(.gemini)) // EZGeminiAPIKey + static let geminiAPIKey = Key(storedKey(.api, serviceType: .gemini)) static let geminiTranslation = Key( - translationStoredKey(.gemini), + storedKey(.translation, serviceType: .gemini), default: "1" ) static let geminiDictionary = Key( - dictionaryStoredKey(.gemini), + storedKey(.dictionary, serviceType: .gemini), default: "1" ) static let geminiSentence = Key( - sentenceStoredKey(.gemini), + storedKey(.sentence, serviceType: .gemini), default: "1" ) static let geminiServiceUsageStatus = Key( - serviceUsageStatusStoredKey(.gemini), + storedKey(.serviceUsageStatus, serviceType: .gemini), default: .default ) static let geminiModel = Key( - modelStoredKey(.gemini), + storedKey(.model, serviceType: .gemini), default: GeminiModel.gemini1_5_flash.rawValue ) static let geminiAvailableModels = Key( - availableModelsStoredKey(.gemini), + storedKey(.availableModels, serviceType: .gemini), default: GeminiModel.allCases.map { $0.rawValue }.joined(separator: ",") ) static let geminiValidModels = Key( - validModelsStoredKey(.gemini), + storedKey(.validModels, serviceType: .gemini), default: GeminiModel.allCases.map { $0.rawValue } ) diff --git a/Easydict/Swift/Feature/Configuration/DefaultsStoredKey.swift b/Easydict/Swift/Feature/Configuration/DefaultsStoredKey.swift index 203ea793a..9508fa087 100644 --- a/Easydict/Swift/Feature/Configuration/DefaultsStoredKey.swift +++ b/Easydict/Swift/Feature/Configuration/DefaultsStoredKey.swift @@ -8,64 +8,44 @@ import Foundation -// TODO: refactor key with enum key type. -func storedKey(_ key: String, serviceType: ServiceType) -> String { +func storedKey(_ key: StoredKey, serviceType: ServiceType) -> String { // This key should be compatible with existing OpenAI config keys // EZOpenAIServiceUsageStatusKey // EZOpenAIDictionaryKey - "EZ" + serviceType.rawValue + key + "Key" -} - -func serviceUsageStatusStoredKey(_ serviceType: ServiceType) -> String { - storedKey(EZServiceUsageStatusKey, serviceType: serviceType) -} - -func translationStoredKey(_ serviceType: ServiceType) -> String { - storedKey(EZTranslationKey, serviceType: serviceType) -} - -func sentenceStoredKey(_ serviceType: ServiceType) -> String { - storedKey(EZSentenceKey, serviceType: serviceType) -} - -func dictionaryStoredKey(_ serviceType: ServiceType) -> String { - storedKey(EZDictionaryKey, serviceType: serviceType) -} - -func availableModelsStoredKey(_ serviceType: ServiceType) -> String { - storedKey(EZAvailableModelsKey, serviceType: serviceType) -} - -func validModelsStoredKey(_ serviceType: ServiceType) -> String { - storedKey(EZValidModelsKey, serviceType: serviceType) -} - -func modelStoredKey(_ serviceType: ServiceType) -> String { - storedKey(EZModelKey, serviceType: serviceType) -} - -func apiStoredKey(_ serviceType: ServiceType) -> String { - storedKey(EZAPIKey, serviceType: serviceType) -} - -func endpointStoredKey(_ serviceType: ServiceType) -> String { - storedKey(EZEndpointKey, serviceType: serviceType) -} - -func nameStoredKey(_ serviceType: ServiceType) -> String { - storedKey(EZNameKey, serviceType: serviceType) + "EZ" + serviceType.rawValue + key.rawValue.capitalizeFirstLetter() + "Key" } extension UserDefaults { - static func bool(forKey key: String, serviceType: ServiceType) -> Bool { + static func bool(forKey key: StoredKey, serviceType: ServiceType) -> Bool { let key = storedKey(key, serviceType: serviceType) let value = standard.bool(forKey: key) return value } - static func string(forKey key: String, serviceType: ServiceType) -> String? { + static func string(forKey key: StoredKey, serviceType: ServiceType) -> String? { let key = storedKey(key, serviceType: serviceType) let value = standard.string(forKey: key) return value } } + +// MARK: - StoredKey + +enum StoredKey: String { + case serviceUsageStatus + case translation + case dictionary + case sentence + case availableModels + case validModels + case model + case api = "API" + case endpoint = "EndPoint" + case name +} + +extension String { + func capitalizeFirstLetter() -> String { + prefix(1).uppercased() + dropFirst() + } +} diff --git a/Easydict/Swift/Service/OpenAI/LLMStreamService.swift b/Easydict/Swift/Service/OpenAI/LLMStreamService.swift index 51708da2d..e53bcc494 100644 --- a/Easydict/Swift/Service/OpenAI/LLMStreamService.swift +++ b/Easydict/Swift/Service/OpenAI/LLMStreamService.swift @@ -40,9 +40,9 @@ public class LLMStreamService: QueryService { override public func queryTextType() -> EZQueryTextType { var typeOptions: EZQueryTextType = [] - let isTranslationEnabled = UserDefaults.bool(forKey: EZTranslationKey, serviceType: serviceType()) - let isSentenceEnabled = UserDefaults.bool(forKey: EZSentenceKey, serviceType: serviceType()) - let isDictionaryEnabled = UserDefaults.bool(forKey: EZDictionaryKey, serviceType: serviceType()) + let isTranslationEnabled = UserDefaults.bool(forKey: .dictionary, serviceType: serviceType()) + let isSentenceEnabled = UserDefaults.bool(forKey: .sentence, serviceType: serviceType()) + let isDictionaryEnabled = UserDefaults.bool(forKey: .dictionary, serviceType: serviceType()) if isTranslationEnabled { typeOptions.insert(.translation) @@ -58,7 +58,7 @@ public class LLMStreamService: QueryService { } override public func serviceUsageStatus() -> EZServiceUsageStatus { - let usageStatus = UserDefaults.string(forKey: EZServiceUsageStatusKey, serviceType: serviceType()) ?? "" + let usageStatus = UserDefaults.string(forKey: .serviceUsageStatus, serviceType: serviceType()) ?? "" guard let value = UInt(usageStatus) else { return .default } return EZServiceUsageStatus(rawValue: value) ?? .default } From 27b588e06d6d208dcbb08a7fc5269fac82fbfe25 Mon Sep 17 00:00:00 2001 From: tisfeng Date: Sat, 8 Jun 2024 20:50:30 +0800 Subject: [PATCH 02/21] perf: remove unused code --- Easydict/objc/Service/Model/EZConstKey.h | 38 ---------------- .../Utility/EZLinkParser/EZSchemeParser.m | 45 ------------------- 2 files changed, 83 deletions(-) diff --git a/Easydict/objc/Service/Model/EZConstKey.h b/Easydict/objc/Service/Model/EZConstKey.h index 4a94c7ed9..60f716567 100644 --- a/Easydict/objc/Service/Model/EZConstKey.h +++ b/Easydict/objc/Service/Model/EZConstKey.h @@ -13,44 +13,6 @@ NS_ASSUME_NONNULL_BEGIN static NSString *const EZBetaFeatureKey = @"EZBetaFeatureKey"; -static NSString *const EZServiceUsageStatusKey = @"ServiceUsageStatus"; -static NSString *const EZTranslationKey = @"Translation"; -static NSString *const EZDictionaryKey = @"Dictionary"; -static NSString *const EZSentenceKey = @"Sentence"; -static NSString *const EZAvailableModelsKey = @"AvailableModels"; -static NSString *const EZValidModelsKey = @"ValidModels"; -static NSString *const EZModelKey = @"Model"; -static NSString *const EZAPIKey = @"API"; -static NSString *const EZEndpointKey = @"EndPoint"; -static NSString *const EZNameKey = @"Name"; - -// OpenAI -static NSString *const EZOpenAIAPIKey = @"EZOpenAIAPIKey"; -static NSString *const EZOpenAIEndPointKey = @"EZOpenAIEndPointKey"; -static NSString *const EZOpenAITranslationKey = @"EZOpenAITranslationKey"; -static NSString *const EZOpenAIDictionaryKey = @"EZOpenAIDictionaryKey"; -static NSString *const EZOpenAISentenceKey = @"EZOpenAISentenceKey"; -static NSString *const EZOpenAIServiceUsageStatusKey = @"EZOpenAIServiceUsageStatusKey"; -static NSString *const EZOpenAIModelKey = @"EZOpenAIModelKey"; -static NSString *const EZOpenAIAvailableModelsKey = @"EZOpenAIAvailableModelsKey"; -static NSString *const EZOpenAIValidModelsKey = @"EZOpenAIValidModelsKey"; - -// Custom OpenAI -static NSString *const EZCustomOpenAINameKey = @"EZCustomOpenAINameKey"; -static NSString *const EZCustomOpenAIEndPointKey = @"EZCustomOpenAIEndPointKey"; -static NSString *const EZCustomOpenAIAPIKey = @"EZCustomOpenAIAPIKey"; -static NSString *const EZCustomOpenAITranslationKey = @"EZCustomOpenAITranslationKey"; -static NSString *const EZCustomOpenAIDictionaryKey = @"EZCustomOpenAIDictionaryKey"; -static NSString *const EZCustomOpenAISentenceKey = @"EZCustomOpenAISentenceKey"; -static NSString *const EZCustomOpenAIServiceUsageStatusKey = @"EZCustomOpenAIServiceUsageStatusKey"; -static NSString *const EZCustomOpenAIAvailableModelsKey = @"EZCustomOpenAIAvailableModelsKey"; -static NSString *const EZCustomOpenAIModelKey = @"EZCustomOpenAIModelKey"; -static NSString *const EZCustomOpenAIValidModelsKey = @"EZCustomOpenAIValidModelsKey"; - -// Built-in AI -static NSString *const EZBuiltInAIModelKey = @"EZBuiltInAIModelKey"; - - static NSString *const EZDeepLAuthKey = @"EZDeepLAuthKey"; static NSString *const EZDeepLTranslateEndPointKey = @"EZDeepLTranslateEndPointKey"; diff --git a/Easydict/objc/Utility/EZLinkParser/EZSchemeParser.m b/Easydict/objc/Utility/EZLinkParser/EZSchemeParser.m index 33e1ba0fc..826ecb02c 100644 --- a/Easydict/objc/Utility/EZLinkParser/EZSchemeParser.m +++ b/Easydict/objc/Utility/EZLinkParser/EZSchemeParser.m @@ -192,23 +192,6 @@ - (NSArray *)allowedReadWriteKeys { NSArray *readWriteKeys = @[ EZBetaFeatureKey, - EZOpenAIAPIKey, - EZOpenAIDictionaryKey, - EZOpenAISentenceKey, - EZOpenAIServiceUsageStatusKey, - EZOpenAIModelKey, - EZOpenAIAvailableModelsKey, - - EZCustomOpenAINameKey, - EZCustomOpenAIEndPointKey, - EZCustomOpenAIAPIKey, - EZCustomOpenAIAvailableModelsKey, - EZCustomOpenAIModelKey, - EZCustomOpenAITranslationKey, - EZCustomOpenAIDictionaryKey, - EZCustomOpenAISentenceKey, - EZCustomOpenAIServiceUsageStatusKey, - EZYoudaoTranslationKey, EZYoudaoDictionaryKey, @@ -223,7 +206,6 @@ - (NSArray *)allowedReadWriteKeys { EZAliAccessKeyId, EZAliAccessKeySecret, - EZGeminiAPIKey, EZIntelligentQueryModeKey, ]; @@ -304,31 +286,4 @@ - (NSDictionary *)getKeyValues:(NSString *)text { return dict; } -- (NSString *)keyValuesOfServiceType:(EZServiceType)serviceType key:(NSString *)key value:(NSString *)value { - /** - easydict://writeKeyValue?ServiceType=OpenAI&ServiceUsageStatus=1 - - easydict://writeKeyValue?OpenAIServiceUsageStatus=1 - - easydict://writeKeyValue?OpenAIQueryServiceType=1 - */ - NSString *keyValueString = @""; - - NSArray *allowdKeyNames = @[ - EZServiceUsageStatusKey, - EZQueryTextTypeKey, - ]; - - NSArray *allServiceTypes = [EZServiceTypes.shared allServiceTypes]; - - BOOL validKey = [allServiceTypes containsObject:serviceType] && [allowdKeyNames containsObject:key]; - - if (validKey) { - NSString *keyString = [NSString stringWithFormat:@"%@%@", serviceType, key]; - keyValueString = [NSString stringWithFormat:@"%@=%@", keyString, value]; - } - - return keyValueString; -} - @end From 00318e74c1ca8f494870f8be9982f539d17cc55f Mon Sep 17 00:00:00 2001 From: tisfeng Date: Mon, 17 Jun 2024 22:44:45 +0800 Subject: [PATCH 03/21] refactor: improve Defaults.Key --- Easydict.xcodeproj/project.pbxproj | 30 +- Easydict/App/Localizable.xcstrings | 1 + .../Configuration+Defaults.swift | 149 ++-------- .../Configuration/DefaultsStoredKey.swift | 6 +- Easydict/Swift/Service/Ali/AliService.swift | 22 +- .../Service/BuiltInAI/BuiltInAIService.swift | 87 +++--- .../Swift/Service/Caiyun/CaiyunService.swift | 2 +- .../CustomOpenAI/CustomOpenAIService.swift | 34 +-- .../Swift/Service/Gemini/GeminiService.swift | 42 +-- .../Service/OpenAI/BaseOpenAIService.swift | 4 +- .../Service/OpenAI/LLMStreamService.swift | 95 +++++- .../Swift/Service/OpenAI/OpenAIService.swift | 45 +-- .../Service/Tencent/TencentService.swift | 4 +- .../Extensions/String/String+Extension.swift | 4 + .../ConfigurableService.swift | 31 -- .../AliService+ConfigurableService.swift | 10 +- .../BingService+ConfigurableService.swift | 5 +- .../CaiyunService+ConfigurableService.swift | 6 +- .../DeepLTranslate+ConfigurableService.swift | 18 +- ...iuTransTranslate+ConfigurableService.swift | 6 +- .../StreamConfigurationView.swift | 281 ++++++++++++++++++ .../TencentService+ConfigurableService.swift | 10 +- ...BuiltInAIService+ConfigurableService.swift | 38 --- ...tomOpenAIService+ConfigurableService.swift | 193 ------------ .../GeminiService+ConfigurableService.swift | 186 ------------ .../OpenAIService+ConfigurableService.swift | 194 ------------ .../SecureTextField.swift | 8 +- .../ServiceConfigurationCells.swift | 78 +++-- ...erviceConfigurationSecretSectionView.swift | 6 +- .../TextEditorCell.swift | 4 + .../SettingView/Tabs/TabView/ServiceTab.swift | 14 +- Easydict/objc/Service/Model/EZQueryService.h | 4 + Easydict/objc/Service/Model/EZQueryService.m | 4 + .../View/ResultView/EZResultView.m | 2 +- 34 files changed, 600 insertions(+), 1023 deletions(-) delete mode 100644 Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurableService.swift rename Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/{QueryService+ConfigurableService => ConfigurationView}/AliService+ConfigurableService.swift (68%) rename Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/{QueryService+ConfigurableService => ConfigurationView}/BingService+ConfigurableService.swift (80%) rename Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/{QueryService+ConfigurableService => ConfigurationView}/CaiyunService+ConfigurableService.swift (77%) rename Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/{QueryService+ConfigurableService => ConfigurationView}/DeepLTranslate+ConfigurableService.swift (77%) rename Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/{QueryService+ConfigurableService => ConfigurationView}/NiuTransTranslate+ConfigurableService.swift (77%) create mode 100644 Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift rename Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/{QueryService+ConfigurableService => ConfigurationView}/TencentService+ConfigurableService.swift (70%) delete mode 100644 Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/BuiltInAIService+ConfigurableService.swift delete mode 100644 Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/CustomOpenAIService+ConfigurableService.swift delete mode 100644 Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/GeminiService+ConfigurableService.swift delete mode 100644 Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/OpenAIService+ConfigurableService.swift diff --git a/Easydict.xcodeproj/project.pbxproj b/Easydict.xcodeproj/project.pbxproj index 6d43d687e..69e6de30f 100644 --- a/Easydict.xcodeproj/project.pbxproj +++ b/Easydict.xcodeproj/project.pbxproj @@ -29,6 +29,7 @@ 03247E3A296AE8EC00AFCD67 /* EZLoadingAnimationView.m in Sources */ = {isa = PBXBuildFile; fileRef = 03247E39296AE8EC00AFCD67 /* EZLoadingAnimationView.m */; }; 03262C1C29EEE91700EFECA0 /* EZEnumTypes.m in Sources */ = {isa = PBXBuildFile; fileRef = 03262C1B29EEE91700EFECA0 /* EZEnumTypes.m */; }; 03262C2529EFE97B00EFECA0 /* NSViewController+EZWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 03262C2429EFE97B00EFECA0 /* NSViewController+EZWindow.m */; }; + 03280B812C23FE4A00E75A24 /* StreamConfigurationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03280B802C23FE4A00E75A24 /* StreamConfigurationView.swift */; }; 0329CD6F29EE924500963F78 /* EZRightClickDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = 0329CD6E29EE924500963F78 /* EZRightClickDetector.m */; }; 033363A0293A05D200FED9C8 /* EZSelectLanguageButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 0333639F293A05D200FED9C8 /* EZSelectLanguageButton.m */; }; 033363A6293C4AFA00FED9C8 /* PrintBeautifulLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 033363A5293C4AFA00FED9C8 /* PrintBeautifulLog.m */; }; @@ -65,7 +66,6 @@ 0361967B2A0037F700806370 /* NSData+EZMD5.m in Sources */ = {isa = PBXBuildFile; fileRef = 0361967A2A0037F700806370 /* NSData+EZMD5.m */; }; 036A0DB82AD8403A006E6D4F /* NSString+EZHandleInputText.m in Sources */ = {isa = PBXBuildFile; fileRef = 036A0DB72AD8403A006E6D4F /* NSString+EZHandleInputText.m */; }; 036A0DBB2AD941F9006E6D4F /* EZReplaceTextButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 036A0DBA2AD941F9006E6D4F /* EZReplaceTextButton.m */; }; - 036BCD482BDE5D0D009C893F /* BuiltInAIService+ConfigurableService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 036BCD472BDE5D0D009C893F /* BuiltInAIService+ConfigurableService.swift */; }; 036BCD4A2BDE8A96009C893F /* DefaultsStoredKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 036BCD492BDE8A96009C893F /* DefaultsStoredKey.swift */; }; 036D62812BCAB613002C95C7 /* BuiltInAIService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 036D62802BCAB613002C95C7 /* BuiltInAIService.swift */; }; 036E7D7B293F4FC8002675DF /* EZOpenLinkButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 036E7D7A293F4FC8002675DF /* EZOpenLinkButton.m */; }; @@ -227,7 +227,6 @@ 0A2A05A62B59757100EEA142 /* Bundle+AppInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A2A05A52B59757100EEA142 /* Bundle+AppInfo.swift */; }; 0A2BA9602B49A989002872A4 /* Binding+DidSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A2BA95F2B49A989002872A4 /* Binding+DidSet.swift */; }; 0A2BA9642B4A3CCD002872A4 /* Notification+Name.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A2BA9632B4A3CCD002872A4 /* Notification+Name.swift */; }; - 0A318F3B2B8CCCCD0005EF77 /* CustomOpenAIService+ConfigurableService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A318F3A2B8CCCCD0005EF77 /* CustomOpenAIService+ConfigurableService.swift */; }; 0A8685C82B552A590022534F /* DisabledAppTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A8685C72B552A590022534F /* DisabledAppTab.swift */; }; 0A9AFBAB2B7F8D7E0064C9A8 /* CustomOpenAIService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A9AFBAA2B7F8D7E0064C9A8 /* CustomOpenAIService.swift */; }; 0AC11B222B4D16A500F07198 /* WindowAccessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AC11B212B4D16A500F07198 /* WindowAccessor.swift */; }; @@ -242,7 +241,6 @@ 0AC8A8432B6957B0006DA5CC /* BingService+ConfigurableService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AC8A8422B6957B0006DA5CC /* BingService+ConfigurableService.swift */; }; 0AC8A8452B6A4D97006DA5CC /* ServiceConfigurationCells.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AC8A8442B6A4D97006DA5CC /* ServiceConfigurationCells.swift */; }; 0AC8A8472B6A4E3F006DA5CC /* ServiceConfigurationSecretSectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AC8A8462B6A4E3F006DA5CC /* ServiceConfigurationSecretSectionView.swift */; }; - 0AC8A84B2B6A629D006DA5CC /* GeminiService+ConfigurableService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AC8A84A2B6A629D006DA5CC /* GeminiService+ConfigurableService.swift */; }; 0AC8A84F2B6DFDD4006DA5CC /* SettingsAccess in Frameworks */ = {isa = PBXBuildFile; productRef = 0AC8A84E2B6DFDD4006DA5CC /* SettingsAccess */; }; 17BCAEF72B0DFF9000A7D372 /* EZNiuTransTranslateResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 17BCAEF52B0DFF9000A7D372 /* EZNiuTransTranslateResponse.m */; }; 17BCAEF82B0DFF9000A7D372 /* EZNiuTransTranslate.m in Sources */ = {isa = PBXBuildFile; fileRef = 17BCAEF62B0DFF9000A7D372 /* EZNiuTransTranslate.m */; }; @@ -311,8 +309,6 @@ EA9943F22B5358BF00EE7B97 /* LanguageExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA9943F12B5358BF00EE7B97 /* LanguageExtensions.swift */; }; EAE3D3502B62E9DE001EE3E3 /* GlobalContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAE3D34F2B62E9DE001EE3E3 /* GlobalContext.swift */; }; EAED41EC2B54AA920005FE0A /* ServiceConfigurationSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAED41EB2B54AA920005FE0A /* ServiceConfigurationSection.swift */; }; - EAED41EF2B54B1430005FE0A /* ConfigurableService.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAED41EE2B54B1430005FE0A /* ConfigurableService.swift */; }; - EAED41F22B54B39D0005FE0A /* OpenAIService+ConfigurableService.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAED41F12B54B39D0005FE0A /* OpenAIService+ConfigurableService.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -378,6 +374,7 @@ 03262C1B29EEE91700EFECA0 /* EZEnumTypes.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EZEnumTypes.m; sourceTree = ""; }; 03262C2329EFE97B00EFECA0 /* NSViewController+EZWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSViewController+EZWindow.h"; sourceTree = ""; }; 03262C2429EFE97B00EFECA0 /* NSViewController+EZWindow.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSViewController+EZWindow.m"; sourceTree = ""; }; + 03280B802C23FE4A00E75A24 /* StreamConfigurationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StreamConfigurationView.swift; sourceTree = ""; }; 0329CD6D29EE924500963F78 /* EZRightClickDetector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EZRightClickDetector.h; sourceTree = ""; }; 0329CD6E29EE924500963F78 /* EZRightClickDetector.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EZRightClickDetector.m; sourceTree = ""; }; 0333639E293A05D200FED9C8 /* EZSelectLanguageButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EZSelectLanguageButton.h; sourceTree = ""; }; @@ -445,7 +442,6 @@ 036A0DB72AD8403A006E6D4F /* NSString+EZHandleInputText.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSString+EZHandleInputText.m"; sourceTree = ""; }; 036A0DB92AD941F9006E6D4F /* EZReplaceTextButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EZReplaceTextButton.h; sourceTree = ""; }; 036A0DBA2AD941F9006E6D4F /* EZReplaceTextButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EZReplaceTextButton.m; sourceTree = ""; }; - 036BCD472BDE5D0D009C893F /* BuiltInAIService+ConfigurableService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BuiltInAIService+ConfigurableService.swift"; sourceTree = ""; }; 036BCD492BDE8A96009C893F /* DefaultsStoredKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultsStoredKey.swift; sourceTree = ""; }; 036D62802BCAB613002C95C7 /* BuiltInAIService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuiltInAIService.swift; sourceTree = ""; }; 036E7D79293F4FC8002675DF /* EZOpenLinkButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EZOpenLinkButton.h; sourceTree = ""; }; @@ -717,7 +713,6 @@ 0A2A05A52B59757100EEA142 /* Bundle+AppInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+AppInfo.swift"; sourceTree = ""; }; 0A2BA95F2B49A989002872A4 /* Binding+DidSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Binding+DidSet.swift"; sourceTree = ""; }; 0A2BA9632B4A3CCD002872A4 /* Notification+Name.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notification+Name.swift"; sourceTree = ""; }; - 0A318F3A2B8CCCCD0005EF77 /* CustomOpenAIService+ConfigurableService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CustomOpenAIService+ConfigurableService.swift"; sourceTree = ""; }; 0A8685C72B552A590022534F /* DisabledAppTab.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisabledAppTab.swift; sourceTree = ""; }; 0A9AFBAA2B7F8D7E0064C9A8 /* CustomOpenAIService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomOpenAIService.swift; sourceTree = ""; }; 0AC11B212B4D16A500F07198 /* WindowAccessor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowAccessor.swift; sourceTree = ""; }; @@ -732,7 +727,6 @@ 0AC8A8422B6957B0006DA5CC /* BingService+ConfigurableService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BingService+ConfigurableService.swift"; sourceTree = ""; }; 0AC8A8442B6A4D97006DA5CC /* ServiceConfigurationCells.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceConfigurationCells.swift; sourceTree = ""; }; 0AC8A8462B6A4E3F006DA5CC /* ServiceConfigurationSecretSectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceConfigurationSecretSectionView.swift; sourceTree = ""; }; - 0AC8A84A2B6A629D006DA5CC /* GeminiService+ConfigurableService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GeminiService+ConfigurableService.swift"; sourceTree = ""; }; 17BCAEF32B0DFF9000A7D372 /* EZNiuTransTranslateResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EZNiuTransTranslateResponse.h; sourceTree = ""; }; 17BCAEF42B0DFF9000A7D372 /* EZNiuTransTranslate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EZNiuTransTranslate.h; sourceTree = ""; }; 17BCAEF52B0DFF9000A7D372 /* EZNiuTransTranslateResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EZNiuTransTranslateResponse.m; sourceTree = ""; }; @@ -813,8 +807,6 @@ EA9943F12B5358BF00EE7B97 /* LanguageExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LanguageExtensions.swift; sourceTree = ""; }; EAE3D34F2B62E9DE001EE3E3 /* GlobalContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalContext.swift; sourceTree = ""; }; EAED41EB2B54AA920005FE0A /* ServiceConfigurationSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceConfigurationSection.swift; sourceTree = ""; }; - EAED41EE2B54B1430005FE0A /* ConfigurableService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigurableService.swift; sourceTree = ""; }; - EAED41F12B54B39D0005FE0A /* OpenAIService+ConfigurableService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OpenAIService+ConfigurableService.swift"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -2386,8 +2378,7 @@ EAED41EA2B54A4900005FE0A /* ServiceConfigurationView */ = { isa = PBXGroup; children = ( - EAED41F02B54B1A60005FE0A /* QueryService+ConfigurableService */, - EAED41EE2B54B1430005FE0A /* ConfigurableService.swift */, + EAED41F02B54B1A60005FE0A /* ConfigurationView */, 0AC8A83E2B689E68006DA5CC /* ServiceSecretConfigreValidatable.swift */, 0AC8A83C2B6685EE006DA5CC /* SecureTextField.swift */, EAED41EB2B54AA920005FE0A /* ServiceConfigurationSection.swift */, @@ -2398,21 +2389,18 @@ path = ServiceConfigurationView; sourceTree = ""; }; - EAED41F02B54B1A60005FE0A /* QueryService+ConfigurableService */ = { + EAED41F02B54B1A60005FE0A /* ConfigurationView */ = { isa = PBXGroup; children = ( - EAED41F12B54B39D0005FE0A /* OpenAIService+ConfigurableService.swift */, - 0A318F3A2B8CCCCD0005EF77 /* CustomOpenAIService+ConfigurableService.swift */, - 036BCD472BDE5D0D009C893F /* BuiltInAIService+ConfigurableService.swift */, + 03280B802C23FE4A00E75A24 /* StreamConfigurationView.swift */, 0AC8A8402B695480006DA5CC /* DeepLTranslate+ConfigurableService.swift */, 0AC8A8342B6641A7006DA5CC /* TencentService+ConfigurableService.swift */, 0AC8A8362B6659A8006DA5CC /* NiuTransTranslate+ConfigurableService.swift */, 0AC8A8382B666F07006DA5CC /* CaiyunService+ConfigurableService.swift */, 0AC8A83A2B6682D4006DA5CC /* AliService+ConfigurableService.swift */, 0AC8A8422B6957B0006DA5CC /* BingService+ConfigurableService.swift */, - 0AC8A84A2B6A629D006DA5CC /* GeminiService+ConfigurableService.swift */, ); - path = "QueryService+ConfigurableService"; + path = ConfigurationView; sourceTree = ""; }; /* End PBXGroup section */ @@ -2813,10 +2801,8 @@ 03F14A3B2956016B00CB7379 /* EZVolcanoTranslate.m in Sources */, 03B0230429231FA6001C7E63 /* EZHoverButton.m in Sources */, 0342A9812AD64924002A9F5F /* NSString+EZSplit.m in Sources */, - EAED41EF2B54B1430005FE0A /* ConfigurableService.swift in Sources */, 03BD2825294875AE00F5891A /* EZMyLabel.m in Sources */, 03B0233029231FA6001C7E63 /* MMCrashUncaughtExceptionHandler.m in Sources */, - 036BCD482BDE5D0D009C893F /* BuiltInAIService+ConfigurableService.swift in Sources */, 03D5FCFF2A5EF4E400AD26BE /* EZDeviceSystemInfo.m in Sources */, 27FE95272B3DC55F000AD654 /* EasydictApp.swift in Sources */, 03882F9129D95044005B5A52 /* CTCommon.m in Sources */, @@ -2854,7 +2840,6 @@ 039CC914292FB3180037B91E /* EZPopUpButton.m in Sources */, 0399C6B829A9F4B800B4AFCC /* EZSchemeParser.m in Sources */, 03542A3A2937AE6400C34C33 /* EZQueryService.m in Sources */, - 0AC8A84B2B6A629D006DA5CC /* GeminiService+ConfigurableService.swift in Sources */, 03B0230529231FA6001C7E63 /* EZButton.m in Sources */, 03B0232329231FA6001C7E63 /* NSString+MM.m in Sources */, 03779F132BB256B5008D3C42 /* APIKey.swift in Sources */, @@ -2866,6 +2851,7 @@ 03B3B8B52925DD3D00168E8D /* EZPopButtonViewController.m in Sources */, 03542A5B2938DA2B00C34C33 /* EZDetectLanguageButton.m in Sources */, 03B0232929231FA6001C7E63 /* NSDictionary+MM.m in Sources */, + 03280B812C23FE4A00E75A24 /* StreamConfigurationView.swift in Sources */, 0333FDA32A035BEC00891515 /* NSArray+EZChineseText.m in Sources */, 03B0233229231FA6001C7E63 /* MMLog.swift in Sources */, 03DC7C5E2A3ABE28000BF7C9 /* EZConstKey.m in Sources */, @@ -2962,7 +2948,6 @@ 03B0232729231FA6001C7E63 /* NSColor+MM.m in Sources */, 03B0233529231FA6001C7E63 /* MMFileLogFormatter.m in Sources */, 03DC38C1292CC97900922CB2 /* EZServiceInfo.m in Sources */, - 0A318F3B2B8CCCCD0005EF77 /* CustomOpenAIService+ConfigurableService.swift in Sources */, 03B0232A29231FA6001C7E63 /* NSColor+MyColors.m in Sources */, C4DD01ED2B12BE9B0025EE8E /* TencentTranslateType.swift in Sources */, 0AC8A83D2B6685EE006DA5CC /* SecureTextField.swift in Sources */, @@ -3009,7 +2994,6 @@ 03B022FD29231FA6001C7E63 /* EZFixedQueryWindow.m in Sources */, 03B0232C29231FA6001C7E63 /* NSView+MM.m in Sources */, 0357B95A2C04387D00A48CB0 /* TextEditorCell.swift in Sources */, - EAED41F22B54B39D0005FE0A /* OpenAIService+ConfigurableService.swift in Sources */, 033C31002A74CECE0095926A /* EZAppleDictionary.m in Sources */, 03E2BF752A298F2B00E010F3 /* NSString+EZUtils.m in Sources */, 03B022F529231FA6001C7E63 /* EZDetectManager.m in Sources */, diff --git a/Easydict/App/Localizable.xcstrings b/Easydict/App/Localizable.xcstrings index bb0b58633..96407e5d2 100644 --- a/Easydict/App/Localizable.xcstrings +++ b/Easydict/App/Localizable.xcstrings @@ -2411,6 +2411,7 @@ } }, "service.configuration.gemini.api_key.placeholder" : { + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { diff --git a/Easydict/Swift/Feature/Configuration/Configuration+Defaults.swift b/Easydict/Swift/Feature/Configuration/Configuration+Defaults.swift index 6f3815a2e..1786366dd 100644 --- a/Easydict/Swift/Feature/Configuration/Configuration+Defaults.swift +++ b/Easydict/Swift/Feature/Configuration/Configuration+Defaults.swift @@ -205,153 +205,44 @@ class ShortcutWrapper { } } -// Service Configuration -extension Defaults.Keys { - // OpenAI - static let openAIAPIKey = Key(storedKey(.api, serviceType: .openAI)) // EZOpenAIAPIKey - static let openAITranslation = Key( - storedKey(.translation, serviceType: .openAI), - default: "1" - ) - static let openAIDictionary = Key( - storedKey(.dictionary, serviceType: .openAI), - default: "1" - ) - static let openAISentence = Key( - storedKey(.sentence, serviceType: .openAI), - default: "1" - ) - static let openAIServiceUsageStatus = Key( - storedKey(.serviceUsageStatus, serviceType: .openAI), - default: .default - ) - static let openAIEndPoint = Key(storedKey(.endpoint, serviceType: .openAI)) - static let openAIModel = Key( - storedKey(.model, serviceType: .openAI), - default: OpenAIModel.gpt3_5_turbo.rawValue - ) - static let openAIAvailableModels = Key( - storedKey(.availableModels, serviceType: .openAI), - default: OpenAIModel.allCases.map { $0.rawValue }.joined(separator: ",") - ) - static let openAIVaildModels = Key( - storedKey(.validModels, serviceType: .openAI), - default: OpenAIModel.allCases.map { $0.rawValue } - ) - - // Custom OpenAI - static let customOpenAINameKey = Key( - storedKey(.name, serviceType: .customOpenAI), - default: NSLocalizedString("custom_openai", comment: "") - ) - static let customOpenAIAPIKey = Key(storedKey(.api, serviceType: .customOpenAI)) - static let customOpenAITranslation = Key( - storedKey(.translation, serviceType: .customOpenAI), - default: "1" - ) - static let customOpenAIDictionary = Key( - storedKey(.dictionary, serviceType: .customOpenAI), - default: "0" - ) - static let customOpenAISentence = Key( - storedKey(.sentence, serviceType: .customOpenAI), - default: "0" - ) - static let customOpenAIServiceUsageStatus = Key( - storedKey(.serviceUsageStatus, serviceType: .customOpenAI), - default: .default - ) - static let customOpenAIEndPoint = Key(storedKey(.endpoint, serviceType: .customOpenAI)) - static let customOpenAIModel = Key( - storedKey(.model, serviceType: .customOpenAI), - default: "" - ) - static let customOpenAIAvailableModels = Key( - storedKey(.availableModels, serviceType: .customOpenAI), - default: "" - ) - static let customOpenAIVaildModels = Key( - storedKey(.validModels, serviceType: .customOpenAI), - default: [""] - ) - - // Built-in AI - static let builtInAIModel = Key( - storedKey(.model, serviceType: .builtInAI), - default: "" - ) // EZBuiltInAIModelKey - static let builtInAITranslation = Key( - storedKey(.translation, serviceType: .builtInAI), - default: "1" - ) - static let builtInAIDictionary = Key( - storedKey(.dictionary, serviceType: .builtInAI), - default: "0" - ) - static let builtInAISentence = Key( - storedKey(.sentence, serviceType: .builtInAI), - default: "0" - ) - static let builtInAIServiceUsageStatus = Key( - storedKey(.serviceUsageStatus, serviceType: .builtInAI), - default: .default - ) +func defaultsKey(_ key: StoredKey, serviceType: ServiceType) -> Defaults.Key { + defaultsKey(key, serviceType: serviceType, defaultValue: nil) +} - // Gemni - static let geminiAPIKey = Key(storedKey(.api, serviceType: .gemini)) - static let geminiTranslation = Key( - storedKey(.translation, serviceType: .gemini), - default: "1" - ) - static let geminiDictionary = Key( - storedKey(.dictionary, serviceType: .gemini), - default: "1" - ) - static let geminiSentence = Key( - storedKey(.sentence, serviceType: .gemini), - default: "1" - ) - static let geminiServiceUsageStatus = Key( - storedKey(.serviceUsageStatus, serviceType: .gemini), - default: .default - ) - static let geminiModel = Key( - storedKey(.model, serviceType: .gemini), - default: GeminiModel.gemini1_5_flash.rawValue - ) - static let geminiAvailableModels = Key( - storedKey(.availableModels, serviceType: .gemini), - default: GeminiModel.allCases.map { $0.rawValue }.joined(separator: ",") - ) - static let geminiValidModels = Key( - storedKey(.validModels, serviceType: .gemini), - default: GeminiModel.allCases.map { $0.rawValue } +func defaultsKey(_ key: StoredKey, serviceType: ServiceType, defaultValue: T) -> Defaults + .Key { + Defaults.Key( + storedKey(key, serviceType: serviceType), + default: defaultValue ) +} +// Service Configuration +extension Defaults.Keys { // DeepL - static let deepLAuth = Key(EZDeepLAuthKey) + static let deepLAuth = Key(EZDeepLAuthKey, default: "") static let deepLTranslation = Key( EZDeepLTranslationAPIKey, default: DeepLAPIUsagePriority.webFirst ) - static let deepLTranslateEndPointKey = Key(EZDeepLTranslateEndPointKey) + static let deepLTranslateEndPointKey = Key(EZDeepLTranslateEndPointKey, default: "") // Bing - static let bingCookieKey = Key(EZBingCookieKey) + static let bingCookieKey = Key(EZBingCookieKey, default: "") // niu - static let niuTransAPIKey = Key(EZNiuTransAPIKey) + static let niuTransAPIKey = Key(EZNiuTransAPIKey, default: "") // Caiyun - static let caiyunToken = Key(EZCaiyunToken) + static let caiyunToken = Key(EZCaiyunToken, default: "") // tencent - static let tencentSecretId = Key(EZTencentSecretId) - static let tencentSecretKey = Key(EZTencentSecretKey) + static let tencentSecretId = Key(EZTencentSecretId, default: "") + static let tencentSecretKey = Key(EZTencentSecretKey, default: "") // Ali - static let aliAccessKeyId = Key(EZAliAccessKeyId) - static let aliAccessKeySecret = Key(EZAliAccessKeySecret) + static let aliAccessKeyId = Key(EZAliAccessKeyId, default: "") + static let aliAccessKeySecret = Key(EZAliAccessKeySecret, default: "") } /// shortcut diff --git a/Easydict/Swift/Feature/Configuration/DefaultsStoredKey.swift b/Easydict/Swift/Feature/Configuration/DefaultsStoredKey.swift index 9508fa087..61661e4cd 100644 --- a/Easydict/Swift/Feature/Configuration/DefaultsStoredKey.swift +++ b/Easydict/Swift/Feature/Configuration/DefaultsStoredKey.swift @@ -36,10 +36,10 @@ enum StoredKey: String { case translation case dictionary case sentence - case availableModels - case validModels + case availableModels // save in String + case validModels // save in [String] case model - case api = "API" + case apiKey = "API" case endpoint = "EndPoint" case name } diff --git a/Easydict/Swift/Service/Ali/AliService.swift b/Easydict/Swift/Service/Ali/AliService.swift index f2d59af25..e9658a59b 100644 --- a/Easydict/Swift/Service/Ali/AliService.swift +++ b/Easydict/Swift/Service/Ali/AliService.swift @@ -57,9 +57,7 @@ class AliService: QueryService { } override func hasPrivateAPIKey() -> Bool { - let id = Defaults[.aliAccessKeyId] ?? "" - let secret = Defaults[.aliAccessKeySecret] ?? "" - return !id.isEmpty && !secret.isEmpty + !aliAccessKeyId.isEmpty && !aliAccessKeySecret.isEmpty } override func translate( @@ -85,13 +83,11 @@ class AliService: QueryService { easydict://writeKeyValue?EZAliAccessKeyId= easydict://writeKeyValue?EZAliAccessKeySecret= */ - if let id = Defaults[.aliAccessKeyId], - let secret = Defaults[.aliAccessKeySecret], - !id.isEmpty, - !secret.isEmpty { + if !aliAccessKeyId.isEmpty, + !aliAccessKeySecret.isEmpty { requestByAPI( - id: id, - secret: secret, + id: aliAccessKeyId, + secret: aliAccessKeySecret, transType: transType, text: text, from: from, @@ -138,6 +134,14 @@ class AliService: QueryService { } } + private var aliAccessKeyId: String { + Defaults[.aliAccessKeyId] + } + + private var aliAccessKeySecret: String { + Defaults[.aliAccessKeySecret] + } + // swiftlint:disable:next function_parameter_count private func requestByAPI( id: String, diff --git a/Easydict/Swift/Service/BuiltInAI/BuiltInAIService.swift b/Easydict/Swift/Service/BuiltInAI/BuiltInAIService.swift index 261e64805..743865db6 100644 --- a/Easydict/Swift/Service/BuiltInAI/BuiltInAIService.swift +++ b/Easydict/Swift/Service/BuiltInAI/BuiltInAIService.swift @@ -13,14 +13,24 @@ import Foundation class BuiltInAIService: BaseOpenAIService { // MARK: Public - override public func name() -> String { + public override func name() -> String { NSLocalizedString("built_in_ai", comment: "") } - override public func serviceType() -> ServiceType { + public override func serviceType() -> ServiceType { .builtInAI } + public override func configurationListItems() -> Any { + StreamConfigurationView( + service: self, + viewModel: viewModel, + showNameSection: false, + showAPIKeySection: false, + showEndpointSection: false + ) + } + // MARK: Internal override var apiKey: String { @@ -33,48 +43,51 @@ class BuiltInAIService: BaseOpenAIService { override var model: String { get { - var model = Defaults[.builtInAIModel] + var model = super.model if model.isEmpty { - model = availableModels.first! + model = validModels.first! } return model } set { - Defaults[.builtInAIModel] = newValue + super.model = newValue } } - override var availableModels: [String] { - [ - // Groq free models https://console.groq.com/docs/models - "llama3-70b-8192", // 30 RPM - "mixtral-8x7b-32768", - - // Google Gemini https://ai.google.dev/pricing?hl=zh-cn - "gemini-1.0-pro", // free 15 RPM - "gemini-1.5-flash", // free 15 RPM - "gemini-1.5-pro", // free 15 RPM - - /** - 阿里通义千问 DashScope - - https://help.aliyun.com/zh/dashscope/developer-reference/tongyi-qianwen-7b-14b-72b-metering-and-billing - */ - "qwen1.5-32b-chat", // 有效期:2024-06-19,1,000,000 tokens 免费额度 - "qwen-turbo", // free total 2,000,000 tokens, until 8.12 - "baichuan2-13b-chat-v1", // free until 8.12, total 1,000,000 tokens - "deepseek-7b-chat", // 开通DashScope即获赠总计 1,000,000 tokens 限时免费使用额度,有效期180天。 - "internlm-7b-chat", // 开通DashScope即获赠总计 1,000,000 tokens 限时免费使用额度,有效期180天。 - - /** - 百度千帆大模型 - - 5月21日起,百度智能云千帆大模型平台ModelBuilder中ERNIE-Speed、ERNIE-Lite、ERNIE-Tiny系列模型Tokens后付费的服务对客户免费开放使用,具体包括ERNIE-Speed-8K、ERNIE-Speed-128K、ERNIE-Speed-AppBuilder专用版、ERNIE-Lite-8K、ERNIE-Lite-8K-0922、ERNIE-Lite-128K(即将上线)、ERNIE-Tiny共计7款模型的预置服务 - - https://cloud.baidu.com/doc/WENXINWORKSHOP/s/wlwg8f1i3 - */ - "ernie_speed", // ERNIE-Speed-8K, it has a higher RPM(300) than ERNIE-Speed-128K(RPM=60) - "ernie-lite-8k", - ] + override var validModels: [String] { + get { + [ + // Groq free models https://console.groq.com/docs/models + "llama3-70b-8192", // 30 RPM + "mixtral-8x7b-32768", + + // Google Gemini https://ai.google.dev/pricing?hl=zh-cn + "gemini-1.0-pro", // free 15 RPM + "gemini-1.5-flash", // free 15 RPM + "gemini-1.5-pro", // free 15 RPM + + /** + 阿里通义千问 DashScope + + https://help.aliyun.com/zh/dashscope/developer-reference/tongyi-qianwen-7b-14b-72b-metering-and-billing + */ + "qwen1.5-32b-chat", // 有效期:2024-06-19,1,000,000 tokens 免费额度 + "qwen-turbo", // free total 2,000,000 tokens, until 8.12 + "baichuan2-13b-chat-v1", // free until 8.12, total 1,000,000 tokens + "deepseek-7b-chat", // 开通DashScope即获赠总计 1,000,000 tokens 限时免费使用额度,有效期180天。 + "internlm-7b-chat", // 开通DashScope即获赠总计 1,000,000 tokens 限时免费使用额度,有效期180天。 + + /** + 百度千帆大模型 + + 5月21日起,百度智能云千帆大模型平台ModelBuilder中ERNIE-Speed、ERNIE-Lite、ERNIE-Tiny系列模型Tokens后付费的服务对客户免费开放使用,具体包括ERNIE-Speed-8K、ERNIE-Speed-128K、ERNIE-Speed-AppBuilder专用版、ERNIE-Lite-8K、ERNIE-Lite-8K-0922、ERNIE-Lite-128K(即将上线)、ERNIE-Tiny共计7款模型的预置服务 + + https://cloud.baidu.com/doc/WENXINWORKSHOP/s/wlwg8f1i3 + */ + "ernie_speed", // ERNIE-Speed-8K, it has a higher RPM(300) than ERNIE-Speed-128K(RPM=60) + "ernie-lite-8k", + ] + } + set {} } } diff --git a/Easydict/Swift/Service/Caiyun/CaiyunService.swift b/Easydict/Swift/Service/Caiyun/CaiyunService.swift index ee4d20149..503a14a5e 100644 --- a/Easydict/Swift/Service/Caiyun/CaiyunService.swift +++ b/Easydict/Swift/Service/Caiyun/CaiyunService.swift @@ -115,7 +115,7 @@ public final class CaiyunService: QueryService { // easydict://writeKeyValue?EZCaiyunToken= private var token: String { let token = Defaults[.caiyunToken] - if let token, !token.isEmpty { + if !token.isEmpty { return token } else { return defaultToken diff --git a/Easydict/Swift/Service/CustomOpenAI/CustomOpenAIService.swift b/Easydict/Swift/Service/CustomOpenAI/CustomOpenAIService.swift index df44e5bd8..ad6912ee0 100644 --- a/Easydict/Swift/Service/CustomOpenAI/CustomOpenAIService.swift +++ b/Easydict/Swift/Service/CustomOpenAI/CustomOpenAIService.swift @@ -13,12 +13,9 @@ import Foundation class CustomOpenAIService: BaseOpenAIService { // MARK: Public - override public func name() -> String { - let name = Defaults[.customOpenAINameKey] - if let name, !name.isEmpty { - return name - } - return NSLocalizedString("custom_openai", comment: "The name of Custom OpenAI Translate") + public override func name() -> String { + let serviceName = Defaults[stringDefaultsKey(.name)] + return serviceName.isEmpty ? NSLocalizedString("custom_openai", comment: "") : serviceName } override public func serviceType() -> ServiceType { @@ -27,24 +24,11 @@ class CustomOpenAIService: BaseOpenAIService { // MARK: Internal - override var apiKey: String { - Defaults[.customOpenAIAPIKey] ?? "" - } - - override var endpoint: String { - Defaults[.customOpenAIEndPoint] ?? "" - } - - override var model: String { - get { - Defaults[.customOpenAIModel] - } - set { - Defaults[.customOpenAIModel] = newValue - } - } - - override var availableModels: [String] { - Defaults[.customOpenAIVaildModels] + override func configurationListItems() -> Any { + StreamConfigurationView( + service: self, + viewModel: viewModel, + showNameSection: true + ) } } diff --git a/Easydict/Swift/Service/Gemini/GeminiService.swift b/Easydict/Swift/Service/Gemini/GeminiService.swift index 64150dc60..f46813b34 100644 --- a/Easydict/Swift/Service/Gemini/GeminiService.swift +++ b/Easydict/Swift/Service/Gemini/GeminiService.swift @@ -109,6 +109,14 @@ public final class GeminiService: LLMStreamService { } } + public override func configurationListItems() -> Any { + StreamConfigurationView( + service: self, + viewModel: viewModel, + showNameSection: false + ) + } + // MARK: Internal // https://ai.google.dev/available_regions @@ -127,25 +135,6 @@ public final class GeminiService: LLMStreamService { ] } - // easydict://writeKeyValue?EZGeminiAPIKey=xxx - override var apiKey: String { - Defaults[.geminiAPIKey] ?? "" - } - - override var availableModels: [String] { - Defaults[.geminiValidModels] - } - - override var model: String { - get { - Defaults[.geminiModel] - } - set { - // easydict://writeKeyValue?EZGeminiModelKey=gemini-1.5-flash - Defaults[.geminiModel] = newValue - } - } - // MARK: Private // Set Gemini safety level to BLOCK_NONE @@ -154,3 +143,18 @@ public final class GeminiService: LLMStreamService { private let sexuallyExplicitBlockNone = SafetySetting(harmCategory: .sexuallyExplicit, threshold: .blockNone) private let dangerousContentBlockNone = SafetySetting(harmCategory: .dangerousContent, threshold: .blockNone) } + +// MARK: - GeminiModel + +// swiftlint:disable identifier_name +enum GeminiModel: String, CaseIterable { + // Docs: https://ai.google.dev/gemini-api/docs/models/gemini + + // RPM: Requests per minute, TPM: Tokens per minute + // RPD: Requests per day, TPD: Tokens per day + case gemini1_0_pro = "gemini-1.0-pro" // Free 15 RPM/32,000 TPM, 1,500 RPD/46,080,000 TPD (n/a context length) + case gemini1_5_flash = "gemini-1.5-flash" // Free 15 RPM/100million TPM, 1500 RPD/ n/a TPD (1048k context length) + case gemini1_5_pro = "gemini-1.5-pro" // Free 2 RPM/32,000 TPM, 50 RPD/46,080,000 TPD (1048k context length) +} + +// swiftlint:enable identifier_name diff --git a/Easydict/Swift/Service/OpenAI/BaseOpenAIService.swift b/Easydict/Swift/Service/OpenAI/BaseOpenAIService.swift index 07ab70947..80889201d 100644 --- a/Easydict/Swift/Service/OpenAI/BaseOpenAIService.swift +++ b/Easydict/Swift/Service/OpenAI/BaseOpenAIService.swift @@ -18,14 +18,14 @@ import OpenAI public class BaseOpenAIService: LLMStreamService { // MARK: Public - override public func translate( + public override func translate( _ text: String, from: Language, to: Language, completion: @escaping (EZQueryResult, Error?) -> () ) { let url = URL(string: endpoint) - let invalidURLError = EZError(type: .param, description: "\(serviceType().rawValue) URL is invalid") + let invalidURLError = EZError(type: .param, description: "`\(serviceType().rawValue)` endpoint is invalid") guard let url, url.isValid else { completion(result, invalidURLError) return diff --git a/Easydict/Swift/Service/OpenAI/LLMStreamService.swift b/Easydict/Swift/Service/OpenAI/LLMStreamService.swift index e53bcc494..04bd90660 100644 --- a/Easydict/Swift/Service/OpenAI/LLMStreamService.swift +++ b/Easydict/Swift/Service/OpenAI/LLMStreamService.swift @@ -6,25 +6,28 @@ // Copyright © 2024 izual. All rights reserved. // +import Combine import Defaults import Foundation // MARK: - LLMStreamService +// import SwiftUI + @objcMembers @objc(EZLLMStreamService) -public class LLMStreamService: QueryService { +public class LLMStreamService: QueryService, ObservableObject { // MARK: Public - override public func isStream() -> Bool { + public override func isStream() -> Bool { true } - override public func intelligentQueryTextType() -> EZQueryTextType { + public override func intelligentQueryTextType() -> EZQueryTextType { Configuration.shared.intelligentQueryTextTypeForServiceType(serviceType()) } - override public func supportLanguagesDictionary() -> MMOrderedDictionary { + public override func supportLanguagesDictionary() -> MMOrderedDictionary { let allLanguages = EZLanguageManager.shared().allLanguages let supportedLanguages = allLanguages.filter { language in !unsupportedLanguages.contains(language) @@ -37,12 +40,12 @@ public class LLMStreamService: QueryService { return orderedDict } - override public func queryTextType() -> EZQueryTextType { + public override func queryTextType() -> EZQueryTextType { var typeOptions: EZQueryTextType = [] - let isTranslationEnabled = UserDefaults.bool(forKey: .dictionary, serviceType: serviceType()) - let isSentenceEnabled = UserDefaults.bool(forKey: .sentence, serviceType: serviceType()) - let isDictionaryEnabled = UserDefaults.bool(forKey: .dictionary, serviceType: serviceType()) + let isTranslationEnabled = Defaults[stringDefaultsKey(.translation)].boolValue + let isSentenceEnabled = Defaults[stringDefaultsKey(.sentence)].boolValue + let isDictionaryEnabled = Defaults[stringDefaultsKey(.dictionary)].boolValue if isTranslationEnabled { typeOptions.insert(.translation) @@ -57,8 +60,8 @@ public class LLMStreamService: QueryService { return typeOptions } - override public func serviceUsageStatus() -> EZServiceUsageStatus { - let usageStatus = UserDefaults.string(forKey: .serviceUsageStatus, serviceType: serviceType()) ?? "" + public override func serviceUsageStatus() -> EZServiceUsageStatus { + let usageStatus = Defaults[stringDefaultsKey(.serviceUsageStatus)] guard let value = UInt(usageStatus) else { return .default } return EZServiceUsageStatus(rawValue: value) ?? .default } @@ -69,25 +72,45 @@ public class LLMStreamService: QueryService { let mustOverride = "This property or method must be overridden by a subclass" + var viewModel: LLMStreamViewModel { + _viewModel + } + var unsupportedLanguages: [Language] { [] } var model: String { - get { fatalError(mustOverride) } - set { _ = newValue; fatalError(mustOverride) } + get { + Defaults[stringDefaultsKey(.model)] + } + set { + if model != newValue { + Defaults[stringDefaultsKey(.model)] = newValue + } + } } - var availableModels: [String] { - fatalError(mustOverride) + var availableModels: String { + get { Defaults[stringDefaultsKey(.availableModels)] } + set { + Defaults[stringDefaultsKey(.availableModels)] = newValue + } } + var validModels: [String] { + get { Defaults[serviceDefaultsKey(.validModels, defaultValue: [""])] } + set { Defaults[serviceDefaultsKey(.validModels, defaultValue: [""])] = newValue } + } + + // apiKey var apiKey: String { - fatalError(mustOverride) + Defaults[stringDefaultsKey(.apiKey)] } + // endpoint var endpoint: String { - fatalError(mustOverride) + Defaults[stringDefaultsKey(.endpoint)] } func getFinalResultText(_ text: String) -> String { @@ -134,6 +157,23 @@ public class LLMStreamService: QueryService { /// Cancel stream request manually. func cancelStream() {} + + func invalidate() { + cancellables.forEach { $0.cancel() } + cancellables.removeAll() + } + + // MARK: Private + + private lazy var _viewModel: LLMStreamViewModel = { + LLMStreamViewModel( + service: self +// model: model, +// availableModels: availableModels + ) + }() + + private var cancellables: Set = [] } extension LLMStreamService { @@ -181,3 +221,26 @@ extension LLMStreamService { } } } + +// MARK: - DefaultsKey + +protocol DefaultsKey { + func stringDefaultsKey(_ key: StoredKey) -> Defaults.Key + func serviceDefaultsKey(_ key: StoredKey, defaultValue: T) -> Defaults.Key +} + +// MARK: - QueryService + DefaultsKey + +extension QueryService: DefaultsKey { + func stringDefaultsKey(_ key: StoredKey) -> Defaults.Key { + defaultsKey(key, serviceType: serviceType(), defaultValue: "") + } + + func serviceDefaultsKey(_ key: StoredKey, defaultValue: T) -> Defaults.Key { + defaultsKey(key, serviceType: serviceType(), defaultValue: defaultValue) + } + + func serviceDefaultsKey(_ key: StoredKey) -> Defaults.Key { + defaultsKey(key, serviceType: serviceType()) + } +} diff --git a/Easydict/Swift/Service/OpenAI/OpenAIService.swift b/Easydict/Swift/Service/OpenAI/OpenAIService.swift index 396da9ce0..e12cc7b60 100644 --- a/Easydict/Swift/Service/OpenAI/OpenAIService.swift +++ b/Easydict/Swift/Service/OpenAI/OpenAIService.swift @@ -29,32 +29,39 @@ class OpenAIService: BaseOpenAIService { // MARK: Internal - override var availableModels: [String] { - Defaults[.openAIVaildModels] - } - - override var model: String { + override var validModels: [String] { get { - Defaults[.openAIModel] + Defaults[serviceDefaultsKey( + .availableModels, + defaultValue: OpenAIModel.allCases.map { $0.rawValue } + )] } set { - // easydict://writeKeyValue?EZOpenAIModelKey=gpt-3.5-turbo - Defaults[.openAIModel] = newValue + Defaults[serviceDefaultsKey( + .availableModels, + defaultValue: OpenAIModel.allCases.map { $0.rawValue } + )] = newValue } } - override var apiKey: String { - // easydict://writeKeyValue?EZOpenAIAPIKey= - Defaults[.openAIAPIKey] ?? "" - } - override var endpoint: String { - // easydict://writeKeyValue?EZOpenAIEndPointKey= - var endPoint = Defaults[.openAIEndPoint] ?? "" - if endPoint.isEmpty { - endPoint = "https://api.openai.com/v1/chat/completions" - } + super.endpoint.isEmpty ? "https://api.openai.com/v1/chat/completions" : super.endpoint + } - return endPoint + override func configurationListItems() -> Any { + StreamConfigurationView(service: self, viewModel: viewModel) } } + +// MARK: - OpenAIModel + +// swiftlint:disable identifier_name +enum OpenAIModel: String, CaseIterable { + // Docs: https://platform.openai.com/docs/models + + case gpt3_5_turbo = "gpt-3.5-turbo" // Currently points to gpt-3.5-turbo-0125. Input: $0.50 | Output: $1.50 (16k) + case gpt4_turbo = "gpt-4-turbo" // Currently points to gpt-4-turbo-2024-04-09. Input: $10 | Output: $30 (128k) + case gpt4o = "gpt-4o" // Currently points to gpt-4o-2024-05-13. Input: $5 | Output: $15 (128k context length) +} + +// swiftlint:enable identifier_name diff --git a/Easydict/Swift/Service/Tencent/TencentService.swift b/Easydict/Swift/Service/Tencent/TencentService.swift index 743a5cef1..4c5feb219 100644 --- a/Easydict/Swift/Service/Tencent/TencentService.swift +++ b/Easydict/Swift/Service/Tencent/TencentService.swift @@ -135,7 +135,7 @@ public final class TencentService: QueryService { // easydict://writeKeyValue?EZTencentSecretId=xxx private var secretId: String { let secretId = Defaults[.tencentSecretId] - if let secretId, !secretId.isEmpty { + if !secretId.isEmpty { return secretId } else { return defaultSecretId @@ -145,7 +145,7 @@ public final class TencentService: QueryService { // easydict://writeKeyValue?EZTencentSecretKey=xxx private var secretKey: String { let secretKey = Defaults[.tencentSecretKey] - if let secretKey, !secretKey.isEmpty { + if !secretKey.isEmpty { return secretKey } else { return defaultSecretKey diff --git a/Easydict/Swift/Utility/Extensions/String/String+Extension.swift b/Easydict/Swift/Utility/Extensions/String/String+Extension.swift index 8331567b7..463cd6cb0 100644 --- a/Easydict/Swift/Utility/Extensions/String/String+Extension.swift +++ b/Easydict/Swift/Utility/Extensions/String/String+Extension.swift @@ -9,6 +9,10 @@ import Foundation extension String { + var boolValue: Bool { + (self as NSString).boolValue + } + /// Truncate string max lenght to 200. func truncated(_ maxLength: Int = 200) -> String { String(prefix(maxLength)) diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurableService.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurableService.swift deleted file mode 100644 index 833a456f8..000000000 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurableService.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// ConfigurableService.swift -// Easydict -// -// Created by 戴藏龙 on 2024/1/14. -// Copyright © 2024 izual. All rights reserved. -// - -import Foundation -import SwiftUI - -// MARK: - ConfigurableService - -/// A service can provide configuration view in setting -protocol ConfigurableService { - // swiftlint:disable:next type_name - associatedtype T: View - - /// Items in Configuration Form. Use ServiceStringConfigurationSection or other customize view. - @ViewBuilder - func configurationListItems() -> T -} - -extension ConfigurableService { - func configurationView() -> some View { - Form { - configurationListItems() - } - .formStyle(.grouped) - } -} diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/AliService+ConfigurableService.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/AliService+ConfigurableService.swift similarity index 68% rename from Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/AliService+ConfigurableService.swift rename to Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/AliService+ConfigurableService.swift index f9712071d..ee711645b 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/AliService+ConfigurableService.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/AliService+ConfigurableService.swift @@ -6,15 +6,11 @@ // Copyright © 2024 izual. All rights reserved. // -import Foundation import SwiftUI -extension AliService: ConfigurableService { - func configurationListItems() -> some View { - ServiceConfigurationSecretSectionView( - service: self, - observeKeys: [.aliAccessKeyId, .aliAccessKeySecret] - ) { +extension AliService { + override func configurationListItems() -> Any? { + ServiceConfigurationSecretSectionView(service: self, observeKeys: [.aliAccessKeyId, .aliAccessKeySecret]) { ServiceConfigurationSecureInputCell( textFieldTitleKey: "service.configuration.ali.access_key_id.title", key: .aliAccessKeyId diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/BingService+ConfigurableService.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/BingService+ConfigurableService.swift similarity index 80% rename from Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/BingService+ConfigurableService.swift rename to Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/BingService+ConfigurableService.swift index a9f232b7b..2719aacc9 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/BingService+ConfigurableService.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/BingService+ConfigurableService.swift @@ -6,11 +6,10 @@ // Copyright © 2024 izual. All rights reserved. // -import Foundation import SwiftUI -extension EZBingService: ConfigurableService { - func configurationListItems() -> some View { +extension EZBingService { + open override func configurationListItems() -> Any? { ServiceConfigurationSecretSectionView(service: self, observeKeys: [.bingCookieKey]) { ServiceConfigurationSecureInputCell( textFieldTitleKey: "service.configuration.bing.cookie.title", diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/CaiyunService+ConfigurableService.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/CaiyunService+ConfigurableService.swift similarity index 77% rename from Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/CaiyunService+ConfigurableService.swift rename to Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/CaiyunService+ConfigurableService.swift index f47c30505..9623ad922 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/CaiyunService+ConfigurableService.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/CaiyunService+ConfigurableService.swift @@ -9,8 +9,10 @@ import Foundation import SwiftUI -extension CaiyunService: ConfigurableService { - func configurationListItems() -> some View { +// MARK: - CaiyunService + ConfigurableService + +extension CaiyunService { + public override func configurationListItems() -> Any? { ServiceConfigurationSecretSectionView(service: self, observeKeys: [.caiyunToken]) { ServiceConfigurationSecureInputCell( textFieldTitleKey: "service.configuration.caiyun.token.title", diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/DeepLTranslate+ConfigurableService.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/DeepLTranslate+ConfigurableService.swift similarity index 77% rename from Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/DeepLTranslate+ConfigurableService.swift rename to Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/DeepLTranslate+ConfigurableService.swift index 3feb2eec1..de79178c3 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/DeepLTranslate+ConfigurableService.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/DeepLTranslate+ConfigurableService.swift @@ -10,21 +10,9 @@ import Defaults import Foundation import SwiftUI -// MARK: - EZDeepLTranslate + ConfigurableService - -extension EZDeepLTranslate: ConfigurableService { - func configurationListItems() -> some View { - EZDeepLTranslateConfigurationView(service: self) - } -} - -// MARK: - EZDeepLTranslateConfigurationView - -private struct EZDeepLTranslateConfigurationView: View { - let service: EZDeepLTranslate - - var body: some View { - ServiceConfigurationSecretSectionView(service: service, observeKeys: [.deepLAuth]) { +extension EZDeepLTranslate { + open override func configurationListItems() -> Any? { + ServiceConfigurationSecretSectionView(service: self, observeKeys: [.deepLAuth]) { ServiceConfigurationSecureInputCell( textFieldTitleKey: "service.configuration.deepl.auth_key.title", key: .deepLAuth diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/NiuTransTranslate+ConfigurableService.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/NiuTransTranslate+ConfigurableService.swift similarity index 77% rename from Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/NiuTransTranslate+ConfigurableService.swift rename to Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/NiuTransTranslate+ConfigurableService.swift index 0c685165a..881e34dab 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/NiuTransTranslate+ConfigurableService.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/NiuTransTranslate+ConfigurableService.swift @@ -9,8 +9,10 @@ import Foundation import SwiftUI -extension EZNiuTransTranslate: ConfigurableService { - func configurationListItems() -> some View { +// MARK: - EZNiuTransTranslate + ConfigurableService + +extension EZNiuTransTranslate { + open override func configurationListItems() -> Any? { ServiceConfigurationSecretSectionView(service: self, observeKeys: [.niuTransAPIKey]) { ServiceConfigurationSecureInputCell( textFieldTitleKey: "service.configuration.niutrans.api_key.title", diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift new file mode 100644 index 000000000..2021f60bf --- /dev/null +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift @@ -0,0 +1,281 @@ +// +// StreamConfigurationView.swift +// Easydict +// +// Created by tisfeng on 2024/6/20. +// Copyright © 2024 izual. All rights reserved. +// + +import Combine +import Defaults +import Foundation +import SwiftUI + +// MARK: - StreamConfigurationView + +struct StreamConfigurationView: View, DefaultsKey { + // MARK: Lifecycle + + init( + service: LLMStreamService, + viewModel: LLMStreamViewModel, + showNameSection: Bool = false, + showAPIKeySection: Bool = true, + showEndpointSection: Bool = true, + showSupportedModelsSection: Bool = true, + showUsedModelSection: Bool = true, + showTranslationToggle: Bool = true, + showSentenceToggle: Bool = true, + showDictionaryToggle: Bool = true, + showUsageStatusPicker: Bool = true + ) { + self.service = service + self.viewModel = viewModel + + self.showNameSection = showNameSection + self.showAPIKeySection = showAPIKeySection + self.showEndpointSection = showEndpointSection + self.showSupportedModelsSection = showSupportedModelsSection + self.showUsedModelSection = showUsedModelSection + self.showTranslationToggle = showTranslationToggle + self.showSentenceToggle = showSentenceToggle + self.showDictionaryToggle = showDictionaryToggle + self.showUsageStatusPicker = showUsageStatusPicker + } + + // MARK: Internal + + let service: LLMStreamService + @ObservedObject var viewModel: LLMStreamViewModel + + let showNameSection: Bool + let showAPIKeySection: Bool + let showEndpointSection: Bool + let showSupportedModelsSection: Bool + let showUsedModelSection: Bool + let showTranslationToggle: Bool + let showSentenceToggle: Bool + let showDictionaryToggle: Bool + let showUsageStatusPicker: Bool + + var body: some View { + ServiceConfigurationSecretSectionView( + service: service, + observeKeys: [ + stringDefaultsKey(.apiKey), + stringDefaultsKey(.endpoint), + stringDefaultsKey(.availableModels), + ] + ) { + if showNameSection { + ServiceConfigurationInputCell( + textFieldTitleKey: "service.configuration.custom_openai.name.title", + key: stringDefaultsKey(.name), + placeholder: "custom_openai", + limitLength: 20 + ) + } + + if showAPIKeySection { + ServiceConfigurationSecureInputCell( + textFieldTitleKey: "service.configuration.openai.api_key.title", + key: stringDefaultsKey(.apiKey), + placeholder: "service.configuration.openai.api_key.placeholder" + ) + } + + if showEndpointSection { + ServiceConfigurationInputCell( + textFieldTitleKey: "service.configuration.openai.endpoint.title", + key: stringDefaultsKey(.endpoint), + placeholder: "service.configuration.openai.endpoint.placeholder" + ) + } + + if showSupportedModelsSection { + TextEditorCell( + title: "service.configuration.custom_openai.supported_models.title", + text: $viewModel.availableModels, + placeholder: "service.configuration.custom_openai.model.placeholder" + ).onChange(of: viewModel.availableModels) { + print("onChange availableModels: \($0)") + } + } + + if showUsedModelSection { + Picker( + "service.configuration.openai.model.title", + selection: $viewModel.model + ) { + ForEach(viewModel.validModels, id: \.self) { value in + Text(value) + } + } + .padding(10.0) + .onChange(of: viewModel.model) { + print("onChange model: \($0)") + } + } + + if showTranslationToggle { + ServiceConfigurationToggleCell( + titleKey: "service.configuration.openai.translation.title", + key: stringDefaultsKey(.translation) + ) + } + if showSentenceToggle { + ServiceConfigurationToggleCell( + titleKey: "service.configuration.openai.sentence.title", + key: stringDefaultsKey(.sentence) + ) + } + if showDictionaryToggle { + ServiceConfigurationToggleCell( + titleKey: "service.configuration.openai.dictionary.title", + key: stringDefaultsKey(.dictionary) + ) + } + + if showUsageStatusPicker { + ServiceConfigurationPickerCell( + titleKey: "service.configuration.openai.usage_status.title", + key: serviceDefaultsKey(.serviceUsageStatus, defaultValue: ServiceUsageStatus.default), + values: ServiceUsageStatus.allCases + ) + } + } + .onDisappear { + service.invalidate() + } + } + + func stringDefaultsKey(_ key: StoredKey) -> Defaults.Key { + service.stringDefaultsKey(key) + } + + func serviceDefaultsKey(_ key: StoredKey, defaultValue: T) -> Defaults.Key { + service.serviceDefaultsKey(key, defaultValue: defaultValue) + } +} + +// MARK: - LLMStreamViewModel + +class LLMStreamViewModel: ObservableObject, DefaultsKey { + // MARK: Lifecycle + + init( + service: LLMStreamService +// model: String, +// availableModels: String + ) { + self.service = service +// self.model = model +// self.availableModels = availableModels + + self.model = Defaults[service.stringDefaultsKey(.model)] + self.availableModels = Defaults[service.stringDefaultsKey(.availableModels)] + + setupSubscribers() + + availableModelsTextDidChanged(availableModels) + } + + // MARK: Internal + + let service: LLMStreamService + + @Published var validModels: [String] = [] + + @Published var model: String { + didSet { + if model != oldValue { + modelDidChanged(model) + } + } + } + + @Published var availableModels: String { + didSet { + if availableModels != oldValue { + availableModelsTextDidChanged(availableModels) + } + } + } + + func setupSubscribers() { + Defaults.publisher(stringDefaultsKey(.model)) + .removeDuplicates() + .throttle(for: 0.1, scheduler: DispatchQueue.main, latest: true) + .sink { [weak self] in + self?.model = $0.newValue + } + .store(in: &cancellables) + + Defaults.publisher(stringDefaultsKey(.availableModels)) + .removeDuplicates() + .throttle(for: 0.1, scheduler: DispatchQueue.main, latest: true) + .sink { [weak self] in + self?.availableModels = $0.newValue + } + .store(in: &cancellables) + } + + func serviceDefaultsKey(_ key: StoredKey, defaultValue: T) -> Defaults.Key { + service.serviceDefaultsKey(key, defaultValue: defaultValue) + } + + func stringDefaultsKey(_ key: StoredKey) -> Defaults.Key { + service.stringDefaultsKey(key) + } + + func invalidate() { + cancellables.forEach { $0.cancel() } + cancellables.removeAll() + } + + // MARK: Private + + private var cancellables: Set = [] + + private func modelDidChanged(_ model: String) { + Defaults[stringDefaultsKey(.model)] = model + + if !validModels.contains(model) { + if model.isEmpty { + availableModels = "" + } else { + if availableModels.isEmpty { + availableModels = model + } else { + availableModels = "\(model), " + availableModels + } + } + } + notifyServiceConfigurationChanged() + } + + private func availableModelsTextDidChanged(_ availableModels: String) { + Defaults[stringDefaultsKey(.availableModels)] = availableModels + + validModels = availableModels.components(separatedBy: ",") + .map { $0.trim() }.filter { !$0.isEmpty } + + if validModels.isEmpty { + model = "" + } else if !validModels.contains(model) { + model = validModels[0] + } + Defaults[serviceDefaultsKey(.validModels, defaultValue: [""])] = validModels + } + + private func notifyServiceConfigurationChanged() { + objectWillChange.send() + + let userInfo: [String: Any] = [ + EZWindowTypeKey: service.windowType.rawValue, + EZServiceTypeKey: service.serviceType().rawValue, + ] + let notification = Notification(name: .serviceHasUpdated, object: nil, userInfo: userInfo) + NotificationCenter.default.post(notification) + } +} diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/TencentService+ConfigurableService.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/TencentService+ConfigurableService.swift similarity index 70% rename from Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/TencentService+ConfigurableService.swift rename to Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/TencentService+ConfigurableService.swift index 146e8d64a..73014326a 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/TencentService+ConfigurableService.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/TencentService+ConfigurableService.swift @@ -9,17 +9,13 @@ import Foundation import SwiftUI -extension TencentService: ConfigurableService { - func configurationListItems() -> some View { - ServiceConfigurationSecretSectionView( - service: self, - observeKeys: [.tencentSecretId, .tencentSecretKey] - ) { +extension TencentService { + public override func configurationListItems() -> Any? { + ServiceConfigurationSecretSectionView(service: self, observeKeys: [.tencentSecretId, .tencentSecretKey]) { ServiceConfigurationSecureInputCell( textFieldTitleKey: "service.configuration.tencent.secret_id.title", key: .tencentSecretId ) - ServiceConfigurationSecureInputCell( textFieldTitleKey: "service.configuration.tencent.secret_key.title", key: .tencentSecretKey diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/BuiltInAIService+ConfigurableService.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/BuiltInAIService+ConfigurableService.swift deleted file mode 100644 index 7895a4965..000000000 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/BuiltInAIService+ConfigurableService.swift +++ /dev/null @@ -1,38 +0,0 @@ -// -// BuiltInAIService+ConfigurableService.swift -// Easydict -// -// Created by tisfeng on 2024/4/28. -// Copyright © 2024 izual. All rights reserved. -// - -import Defaults -import SwiftUI - -// MARK: - BuiltInAIService + ConfigurableService - -extension BuiltInAIService: ConfigurableService { - func configurationListItems() -> some View { - ServiceConfigurationSecretSectionView( - service: self, observeKeys: [] - ) { - ServiceConfigurationToggleCell( - titleKey: "service.configuration.openai.translation.title", - key: .builtInAITranslation - ) - ServiceConfigurationToggleCell( - titleKey: "service.configuration.openai.sentence.title", - key: .builtInAISentence - ) - ServiceConfigurationToggleCell( - titleKey: "service.configuration.openai.dictionary.title", - key: .builtInAIDictionary - ) - ServiceConfigurationPickerCell( - titleKey: "service.configuration.openai.usage_status.title", - key: .builtInAIServiceUsageStatus, - values: ServiceUsageStatus.allCases - ) - } - } -} diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/CustomOpenAIService+ConfigurableService.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/CustomOpenAIService+ConfigurableService.swift deleted file mode 100644 index f738bc2c5..000000000 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/CustomOpenAIService+ConfigurableService.swift +++ /dev/null @@ -1,193 +0,0 @@ -// -// CustomOpenAIService+ConfigurableService.swift -// Easydict -// -// Created by phlpsong on 2024/2/26. -// Copyright © 2024 izual. All rights reserved. -// - -import Combine -import Defaults -import Foundation -import SwiftUI - -// MARK: - CustomOpenAIService + ConfigurableService - -extension CustomOpenAIService: ConfigurableService { - func configurationListItems() -> some View { - CustomOpenAIServiceConfigurationView(service: self) - } -} - -// MARK: - CustomOpenAIServiceConfigurationView - -private struct CustomOpenAIServiceConfigurationView: View { - // MARK: Lifecycle - - init(service: CustomOpenAIService) { - self.service = service - self.viewModel = CustomOpenAIViewModel(service: service) - } - - // MARK: Internal - - let service: CustomOpenAIService - - var body: some View { - ServiceConfigurationSecretSectionView( - service: service, - observeKeys: [.customOpenAIAPIKey, .customOpenAIEndPoint, .customOpenAIAvailableModels] - ) { - // title - ServiceConfigurationInputCell( - textFieldTitleKey: "service.configuration.custom_openai.name.title", - key: .customOpenAINameKey, - placeholder: "custom_openai", - limitLength: 20 - ) - ServiceConfigurationSecureInputCell( - textFieldTitleKey: "service.configuration.openai.api_key.title", - key: .customOpenAIAPIKey, - placeholder: "service.configuration.openai.api_key.placeholder" - ) - // endpoint - ServiceConfigurationInputCell( - textFieldTitleKey: "service.configuration.openai.endpoint.title", - key: .customOpenAIEndPoint, - placeholder: "service.configuration.openai.endpoint.placeholder" - ) - - // models - TextEditorCell( - title: "service.configuration.custom_openai.supported_models.title", - text: viewModel.$availableModels ?? "", - placeholder: "service.configuration.custom_openai.model.placeholder" - ) - - Picker( - "service.configuration.openai.model.title", - selection: viewModel.$model - ) { - ForEach(viewModel.validModels, id: \.self) { value in - Text(value) - } - } - .padding(10.0) - - ServiceConfigurationToggleCell( - titleKey: "service.configuration.openai.translation.title", - key: .customOpenAITranslation - ) - ServiceConfigurationToggleCell( - titleKey: "service.configuration.openai.sentence.title", - key: .customOpenAISentence - ) - ServiceConfigurationToggleCell( - titleKey: "service.configuration.openai.dictionary.title", - key: .customOpenAIDictionary - ) - ServiceConfigurationPickerCell( - titleKey: "service.configuration.openai.usage_status.title", - key: .customOpenAIServiceUsageStatus, - values: ServiceUsageStatus.allCases - ) - } - .onDisappear { - viewModel.invalidate() - } - } - - // MARK: Private - - @ObservedObject private var viewModel: CustomOpenAIViewModel -} - -// MARK: - CustomOpenAIViewModel - -private class CustomOpenAIViewModel: ObservableObject { - // MARK: Lifecycle - - init(service: CustomOpenAIService) { - self.service = service - Defaults.publisher(.customOpenAIModel, options: []) - .removeDuplicates() - .sink { _ in - self.modelChanged() - } - .store(in: &cancellables) - Defaults.publisher(.customOpenAINameKey, options: []) - .removeDuplicates() - .throttle(for: 0.1, scheduler: DispatchQueue.main, latest: true) - .sink { _ in - self.serviceConfigChanged() - } - .store(in: &cancellables) - Defaults.publisher(.customOpenAIAvailableModels) - .removeDuplicates() - .throttle(for: 0.1, scheduler: DispatchQueue.main, latest: true) - .sink { _ in - self.modelsTextChanged() - } - .store(in: &cancellables) - } - - // MARK: Internal - - let service: CustomOpenAIService - - @Default(.customOpenAIModel) var model - @Default(.customOpenAIAvailableModels) var availableModels - - @Published var validModels: [String] = [] - - func invalidate() { - cancellables.forEach { $0.cancel() } - cancellables.removeAll() - } - - // MARK: Private - - private var cancellables: Set = [] - - private func modelChanged() { - if !validModels.contains(model) { - if model.isEmpty { - availableModels = "" - } else { - if availableModels?.isEmpty == true { - availableModels = model - } else { - availableModels = "\(model), " + (availableModels ?? "") - } - } - } - - serviceConfigChanged() - } - - private func modelsTextChanged() { - guard let availableModels else { return } - - validModels = availableModels.components(separatedBy: ",") - .map { $0.trim() }.filter { !$0.isEmpty } - - if validModels.isEmpty { - model = "" - } else if !validModels.contains(model) { - model = validModels[0] - } - - Defaults[.customOpenAIVaildModels] = validModels - } - - private func serviceConfigChanged() { - objectWillChange.send() - - let userInfo: [String: Any] = [ - EZWindowTypeKey: service.windowType.rawValue, - EZServiceTypeKey: service.serviceType().rawValue, - ] - let notification = Notification(name: .serviceHasUpdated, object: nil, userInfo: userInfo) - NotificationCenter.default.post(notification) - } -} diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/GeminiService+ConfigurableService.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/GeminiService+ConfigurableService.swift deleted file mode 100644 index 0568af977..000000000 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/GeminiService+ConfigurableService.swift +++ /dev/null @@ -1,186 +0,0 @@ -// -// GeminiService+ConfigurableService.swift -// Easydict -// -// Created by phlpsong on 2024/1/31. -// Copyright © 2024 izual. All rights reserved. -// - -import Combine -import Defaults -import Foundation -import SwiftUI - -// MARK: - GeminiService + ConfigurableService - -extension GeminiService: ConfigurableService { - func configurationListItems() -> some View { - GeminiServiceConfigurationView(service: self) - } -} - -// MARK: - GeminiServiceConfigurationView - -private struct GeminiServiceConfigurationView: View { - // MARK: Lifecycle - - init(service: GeminiService) { - self.service = service - self.viewModel = GeminiViewModel(service: service) - } - - // MARK: Internal - - let service: GeminiService - - var body: some View { - ServiceConfigurationSecretSectionView( - service: service, - observeKeys: [.geminiAPIKey, .geminiAvailableModels] - ) { - ServiceConfigurationSecureInputCell( - textFieldTitleKey: "service.configuration.openai.api_key.title", - key: .geminiAPIKey, - placeholder: "service.configuration.gemini.api_key.placeholder" - ) - // supported models - TextField( - "service.configuration.custom_openai.supported_models.title", - text: viewModel.$availableModels ?? "", - prompt: Text("service.configuration.custom_openai.model.placeholder") - ) - .padding(10.0) - Picker( - "service.configuration.openai.model.title", - selection: viewModel.$model - ) { - ForEach(viewModel.validModels, id: \.self) { value in - Text(value) - } - } - .padding(10.0) - - ServiceConfigurationToggleCell( - titleKey: "service.configuration.openai.translation.title", - key: .geminiTranslation - ) - ServiceConfigurationToggleCell( - titleKey: "service.configuration.openai.sentence.title", - key: .geminiSentence - ) - ServiceConfigurationToggleCell( - titleKey: "service.configuration.openai.dictionary.title", - key: .geminiDictionary - ) - ServiceConfigurationPickerCell( - titleKey: "service.configuration.openai.usage_status.title", - key: .geminiServiceUsageStatus, - values: ServiceUsageStatus.allCases - ) - } - .onDisappear { - viewModel.invalidate() - } - } - - // MARK: Private - - @ObservedObject private var viewModel: GeminiViewModel -} - -// MARK: - GeminiViewModel - -private class GeminiViewModel: ObservableObject { - // MARK: Lifecycle - - init(service: GeminiService) { - self.service = service - Defaults.publisher(.geminiModel, options: []) - .removeDuplicates() - .sink { _ in - self.modelChanged() - } - .store(in: &cancellables) - Defaults.publisher(.geminiAvailableModels) - .removeDuplicates() - .throttle(for: 0.1, scheduler: DispatchQueue.main, latest: true) - .sink { _ in - self.modelsTextChanged() - } - .store(in: &cancellables) - } - - // MARK: Internal - - let service: GeminiService - - @Default(.geminiModel) var model - @Default(.geminiAvailableModels) var availableModels - - @Published var validModels: [String] = [] - - func invalidate() { - cancellables.forEach { $0.cancel() } - cancellables.removeAll() - } - - // MARK: Private - - private var cancellables: Set = [] - - private func modelChanged() { - if !validModels.contains(model) { - if model.isEmpty { - availableModels = "" - } else { - if availableModels?.isEmpty == true { - availableModels = model - } else { - availableModels = availableModels ?? "" - } - } - } - serviceConfigChanged() - } - - private func modelsTextChanged() { - guard let availableModels else { return } - - validModels = availableModels.components(separatedBy: ",") - .map { $0.trim() }.filter { !$0.isEmpty } - - if validModels.isEmpty { - model = "" - } else if !validModels.contains(model) { - model = validModels[0] - } - - Defaults[.geminiValidModels] = validModels - } - - private func serviceConfigChanged() { - objectWillChange.send() - - let userInfo: [String: Any] = [ - EZWindowTypeKey: service.windowType.rawValue, - EZServiceTypeKey: service.serviceType().rawValue, - ] - let notification = Notification(name: .serviceHasUpdated, object: nil, userInfo: userInfo) - NotificationCenter.default.post(notification) - } -} - -// MARK: - GeminiModel - -// swiftlint:disable identifier_name -enum GeminiModel: String, CaseIterable { - // Docs: https://ai.google.dev/gemini-api/docs/models/gemini - - // RPM: Requests per minute, TPM: Tokens per minute - // RPD: Requests per day, TPD: Tokens per day - case gemini1_0_pro = "gemini-1.0-pro" // Free 15 RPM/32,000 TPM, 1,500 RPD/46,080,000 TPD (n/a context length) - case gemini1_5_flash = "gemini-1.5-flash" // Free 15 RPM/100million TPM, 1500 RPD/ n/a TPD (1048k context length) - case gemini1_5_pro = "gemini-1.5-pro" // Free 2 RPM/32,000 TPM, 50 RPD/46,080,000 TPD (1048k context length) -} - -// swiftlint:enable identifier_name diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/OpenAIService+ConfigurableService.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/OpenAIService+ConfigurableService.swift deleted file mode 100644 index 59eb1a4b4..000000000 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/QueryService+ConfigurableService/OpenAIService+ConfigurableService.swift +++ /dev/null @@ -1,194 +0,0 @@ -// -// OpenAIService+ConfigurableService.swift -// Easydict -// -// Created by 戴藏龙 on 2024/1/14. -// Copyright © 2024 izual. All rights reserved. -// - -import Combine -import Defaults -import Foundation -import SwiftUI - -// MARK: - OpenAIService + ConfigurableService - -extension OpenAIService: ConfigurableService { - func configurationListItems() -> some View { - OpenAIServiceConfigurationView(service: self) - } -} - -// MARK: - OpenAIServiceConfigurationView - -private struct OpenAIServiceConfigurationView: View { - // MARK: Lifecycle - - init(service: OpenAIService) { - self.service = service - self.viewModel = OpenAIServiceViewModel(service: service) - } - - // MARK: Internal - - let service: OpenAIService - - var body: some View { - ServiceConfigurationSecretSectionView( - service: service, observeKeys: [.openAIAPIKey, .openAIEndPoint, .openAIAvailableModels] - ) { - ServiceConfigurationSecureInputCell( - textFieldTitleKey: "service.configuration.openai.api_key.title", - key: .openAIAPIKey, - placeholder: "service.configuration.openai.api_key.placeholder" - ) - // endpoint - ServiceConfigurationInputCell( - textFieldTitleKey: "service.configuration.openai.endpoint.title", - key: .openAIEndPoint, - placeholder: "service.configuration.openai.endpoint.placeholder" - ) - - // models - TextEditorCell( - title: "service.configuration.custom_openai.supported_models.title", - text: viewModel.$availableModels ?? "", - placeholder: "service.configuration.custom_openai.model.placeholder" - ) - - Picker( - "service.configuration.openai.model.title", - selection: viewModel.$model - ) { - ForEach(viewModel.validModels, id: \.self) { value in - Text(value) - } - } - .padding(10.0) - - ServiceConfigurationToggleCell( - titleKey: "service.configuration.openai.translation.title", - key: .openAITranslation - ) - ServiceConfigurationToggleCell( - titleKey: "service.configuration.openai.sentence.title", - key: .openAISentence - ) - ServiceConfigurationToggleCell( - titleKey: "service.configuration.openai.dictionary.title", - key: .openAIDictionary - ) - ServiceConfigurationPickerCell( - titleKey: "service.configuration.openai.usage_status.title", - key: .openAIServiceUsageStatus, - values: ServiceUsageStatus.allCases - ) - } - .onDisappear { - viewModel.invalidate() - } - } - - // MARK: Private - - @ObservedObject private var viewModel: OpenAIServiceViewModel -} - -// MARK: - OpenAIServiceViewModel - -private class OpenAIServiceViewModel: ObservableObject { - // MARK: Lifecycle - - init(service: OpenAIService) { - self.service = service - Defaults.publisher(.openAIModel, options: []) - .removeDuplicates() - .sink { _ in - self.modelChanged() - } - .store(in: &cancellables) - Defaults.publisher(.openAIAvailableModels) - .removeDuplicates() - .throttle(for: 0.1, scheduler: DispatchQueue.main, latest: true) - .sink { _ in - self.modelsTextChanged() - } - .store(in: &cancellables) - } - - // MARK: Internal - - let service: OpenAIService - - @Default(.openAIModel) var model - @Default(.openAIAvailableModels) var availableModels - - @Published var validModels: [String] = [] - - func invalidate() { - cancellables.forEach { $0.cancel() } - cancellables.removeAll() - } - - // MARK: Private - - private var cancellables: Set = [] - - private func modelChanged() { - // Currently, user of low os versions can change OpenAI model using URL scheme, like easydict://writeKeyValue?EZOpenAIModelKey=gpt-4 - // In this case, model may not be included in validModels, we need to handle it. - - if !validModels.contains(model) { - if model.isEmpty { - availableModels = "" - } else { - if availableModels?.isEmpty == true { - availableModels = model - } else { - availableModels = "\(model), " + (availableModels ?? "") - } - } - } - - serviceConfigChanged() - } - - private func modelsTextChanged() { - guard let availableModels else { return } - - validModels = availableModels.components(separatedBy: ",") - .map { $0.trim() }.filter { !$0.isEmpty } - - if validModels.isEmpty { - model = "" - } else if !validModels.contains(model) { - model = validModels[0] - } - - Defaults[.openAIVaildModels] = validModels - } - - private func serviceConfigChanged() { - objectWillChange.send() - - let userInfo: [String: Any] = [ - EZWindowTypeKey: service.windowType.rawValue, - EZServiceTypeKey: service.serviceType().rawValue, - ] - let notification = Notification(name: .serviceHasUpdated, object: nil, userInfo: userInfo) - NotificationCenter.default.post(notification) - } -} - -// MARK: - OpenAIModel - -// swiftlint:disable identifier_name -enum OpenAIModel: String, CaseIterable { - // Docs: https://platform.openai.com/docs/models - - case gpt3_5_turbo = "gpt-3.5-turbo" // Currently points to gpt-3.5-turbo-0125. Input: $0.50 | Output: $1.50 (16k) - case gpt4_turbo = "gpt-4-turbo" // Currently points to gpt-4-turbo-2024-04-09. Input: $10 | Output: $30 (128k) - case gpt4o = "gpt-4o" // Currently points to gpt-4o-2024-05-13. Input: $5 | Output: $15 (128k context length) -} - -// swiftlint:enable identifier_name diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/SecureTextField.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/SecureTextField.swift index 588d371bf..dbd6134e9 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/SecureTextField.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/SecureTextField.swift @@ -16,19 +16,19 @@ struct SecureTextField: View { let title: LocalizedStringKey let placeholder: LocalizedStringKey - @Binding var text: String? + @Binding var text: String var body: some View { HStack { ZStack { - SecureField(title, text: $text ?? "") + SecureField(title, text: $text) .lineLimit(lineLimit) .focused($focus, equals: .secure) .opacity(showText ? 0 : 1) - TextField(title, text: $text ?? "", prompt: Text(placeholder)) + TextField(title, text: $text, prompt: Text(placeholder)) .lineLimit(lineLimit) .focused($focus, equals: .text) - .opacity(showText || (text?.isEmpty ?? true) ? 1 : 0) + .opacity(showText || (text.isEmpty) ? 1 : 0) } Button(action: { diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationCells.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationCells.swift index d9cd9a55a..9870ea25d 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationCells.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationCells.swift @@ -17,7 +17,7 @@ struct ServiceConfigurationSecureInputCell: View { init( textFieldTitleKey: LocalizedStringKey, - key: Defaults.Key, + key: Defaults.Key, placeholder: LocalizedStringKey = "service.configuration.input.placeholder" ) { self.textFieldTitleKey = textFieldTitleKey @@ -27,7 +27,7 @@ struct ServiceConfigurationSecureInputCell: View { // MARK: Internal - @Default var value: String? + @Default var value: String let textFieldTitleKey: LocalizedStringKey let placeholder: LocalizedStringKey @@ -43,7 +43,7 @@ struct ServiceConfigurationInputCell: View { init( textFieldTitleKey: LocalizedStringKey, - key: Defaults.Key, + key: Defaults.Key, placeholder: LocalizedStringKey, limitLength: Int = Int.max ) { @@ -55,14 +55,14 @@ struct ServiceConfigurationInputCell: View { // MARK: Internal - @Default var value: String? + @Default var value: String let textFieldTitleKey: LocalizedStringKey let placeholder: LocalizedStringKey var limitLength: Int var body: some View { - TextField(textFieldTitleKey, text: $value ?? "", prompt: Text(placeholder)) + TextField(textFieldTitleKey, text: $value, prompt: Text(placeholder)) .padding(10.0) .onReceive(Just(value)) { _ in limit(limitLength) @@ -72,8 +72,8 @@ struct ServiceConfigurationInputCell: View { // MARK: Private private func limit(_ max: Int) { - if let value, value.count > max { - self.value = String(value.prefix(max)) + if value.count > max { + value = String(value.prefix(max)) } } } @@ -105,10 +105,31 @@ struct ServiceConfigurationPickerCell) { + self.key = key + self._value = .init(key) + self.isOn = Defaults[key] == "1" + } -class ConfigurationToggleViewModel: ObservableObject { - @Published var isOn = false + // MARK: Internal + + @Default var value: String + + @Published var isOn: Bool { + didSet { + value = isOn ? "1" : "0" + } + } + + // MARK: Private + + private var key: Defaults.Key + private var cancellable: AnyCancellable? } // MARK: - ServiceConfigurationToggleCell @@ -118,49 +139,18 @@ struct ServiceConfigurationToggleCell: View { init(titleKey: LocalizedStringKey, key: Defaults.Key) { self.titleKey = titleKey - _value = .init(key) - viewModel.isOn = value == "1" + self.viewModel = ToggleViewModel(key: key) } // MARK: Internal - @Default var value: String +// @Default var value: String let titleKey: LocalizedStringKey - @ObservedObject var viewModel = ConfigurationToggleViewModel() + @ObservedObject var viewModel: ToggleViewModel var body: some View { Toggle(titleKey, isOn: $viewModel.isOn) .padding(10.0) - .onChange(of: viewModel.isOn) { newValue in - value = newValue ? "1" : "0" - } - } -} - -#Preview { - Group { - ServiceConfigurationSecureInputCell( - textFieldTitleKey: "service.configuration.openai.api_key.title", - key: .openAIAPIKey, - placeholder: "service.configuration.openai.api_key.placeholder" - ) - - ServiceConfigurationInputCell( - textFieldTitleKey: "service.configuration.openai.endpoint.title", - key: .openAIEndPoint, - placeholder: "service.configuration.openai.endpoint.placeholder" - ) - - ServiceConfigurationPickerCell( - titleKey: "service.configuration.openai.usage_status.title", - key: .openAIServiceUsageStatus, - values: ServiceUsageStatus.allCases - ) - - ServiceConfigurationToggleCell( - titleKey: "service.configuration.openai.translation.title", - key: .openAITranslation - ) } } diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationSecretSectionView.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationSecretSectionView.swift index 9e41282b8..f76642d43 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationSecretSectionView.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationSecretSectionView.swift @@ -17,7 +17,7 @@ struct ServiceConfigurationSecretSectionView: View { init( service: QueryService, - observeKeys: [Defaults.Key], + observeKeys: [Defaults.Key], @ViewBuilder content: () -> Content ) { self.service = service @@ -113,14 +113,14 @@ struct ServiceConfigurationSecretSectionView: View { private class ServiceValidationViewModel: ObservableObject { // MARK: Lifecycle - init(service: QueryService, observing keys: [Defaults.Key]) { + init(service: QueryService, observing keys: [Defaults.Key]) { self.service = service self.name = service.name() cancellables.append( // check secret key empty input Defaults.publisher(keys: keys) .sink { [weak self] _ in - let hasEmptyInput = keys.contains(where: { (Defaults[$0] ?? "").isEmpty }) + let hasEmptyInput = keys.contains(where: { Defaults[$0].isEmpty }) DispatchQueue.main.async { self?.isValidateBtnDisabled = hasEmptyInput } diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/TextEditorCell.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/TextEditorCell.swift index f0ea569ca..7384a291c 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/TextEditorCell.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/TextEditorCell.swift @@ -70,6 +70,10 @@ struct TrailingTextEditorWithPlaceholder: View { TextEditor(text: $text) .multilineTextAlignment(.trailing) + .onChange(of: text) { newValue in + print("TextEditor onChange: \(text)") + print("newValue: \(newValue)") + } } } } diff --git a/Easydict/Swift/View/SettingView/Tabs/TabView/ServiceTab.swift b/Easydict/Swift/View/SettingView/Tabs/TabView/ServiceTab.swift index f29ea782e..5dcd4404d 100644 --- a/Easydict/Swift/View/SettingView/Tabs/TabView/ServiceTab.swift +++ b/Easydict/Swift/View/SettingView/Tabs/TabView/ServiceTab.swift @@ -32,17 +32,15 @@ struct ServiceTab: View { Group { if let service = viewModel.selectedService { - // To provide configuration options for a service, follow these steps - // 1. If the Service is an object of Objc, expose it to Swift. - // 2. Create a new file in the Utility - Extensions - QueryService+ConfigurableService, - // 3. referring to OpenAIService+ConfigurableService, `extension` the Service - // as `ConfigurableService` to provide the configuration items. - if let service = service as? (any ConfigurableService) { - AnyView(service.configurationView()) + if let view = service.configurationListItems() as? (any View) { + Form { + AnyView(view) + } + .formStyle(.grouped) + } else { HStack { Spacer() - // No configuration for service xxx Text("setting.service.detail.no_configuration \(service.name())") Spacer() } diff --git a/Easydict/objc/Service/Model/EZQueryService.h b/Easydict/objc/Service/Model/EZQueryService.h index 95db440e6..9206e6acb 100644 --- a/Easydict/objc/Service/Model/EZQueryService.h +++ b/Easydict/objc/Service/Model/EZQueryService.h @@ -40,6 +40,8 @@ NS_SWIFT_NAME(QueryService) @property (nonatomic, copy, nullable) void (^autoCopyTranslatedTextBlock)(EZQueryResult *result, NSError *_Nullable error); +//@property (nonatomic, strong) id viewModel; + /// 支持的语言 - (NSArray *)languages; @@ -65,6 +67,8 @@ NS_SWIFT_NAME(QueryService) - (void)startQuery:(EZQueryModel *)queryModel completion:(void (^)(EZQueryResult *result, NSError *_Nullable error))completion; +- (nullable id)configurationListItems; + @end diff --git a/Easydict/objc/Service/Model/EZQueryService.m b/Easydict/objc/Service/Model/EZQueryService.m index f5a5f124c..2d69c2148 100644 --- a/Easydict/objc/Service/Model/EZQueryService.m +++ b/Easydict/objc/Service/Model/EZQueryService.m @@ -212,6 +212,10 @@ - (void)startQuery:(EZQueryModel *)queryModel [self translate:queryText from:from to:to completion:completion]; } +- (nullable id)configurationListItems { + return nil; +} + #pragma mark - 必须重写的子类方法 - (EZServiceType)serviceType { diff --git a/Easydict/objc/ViewController/View/ResultView/EZResultView.m b/Easydict/objc/ViewController/View/ResultView/EZResultView.m index 957533a72..4a4943516 100644 --- a/Easydict/objc/ViewController/View/ResultView/EZResultView.m +++ b/Easydict/objc/ViewController/View/ResultView/EZResultView.m @@ -436,7 +436,7 @@ - (BOOL)isLLLStreamService:(EZQueryService *)service { - (void)showModelSelectionMenu:(EZButton *)sender { EZLLMStreamService *service = (EZLLMStreamService *)self.result.service; NSMenu *menu = [[NSMenu alloc] initWithTitle:@"Menu"]; - for (NSString *model in service.availableModels) { + for (NSString *model in service.validModels) { NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:model action:@selector(modelDidSelected:) keyEquivalent:@""]; item.target = self; [menu addItem:item]; From c8bb781b74b34f4d52ecab1a5c49cd6ac235c5fd Mon Sep 17 00:00:00 2001 From: tisfeng Date: Tue, 25 Jun 2024 11:51:46 +0800 Subject: [PATCH 04/21] refactor: improve TextEditorCell, use ServiceConfigurationPickerCell to show model --- .../Configuration/DefaultsStoredKey.swift | 2 +- Easydict/Swift/Model/ServiceUsageStatus.swift | 10 ++- .../Service/OpenAI/LLMStreamService.swift | 30 +++---- .../Swift/Service/OpenAI/OpenAIService.swift | 15 +--- .../StreamConfigurationView.swift | 88 +++++++++---------- .../ServiceConfigurationCells.swift | 8 +- .../TextEditorCell.swift | 25 ++++-- 7 files changed, 83 insertions(+), 95 deletions(-) diff --git a/Easydict/Swift/Feature/Configuration/DefaultsStoredKey.swift b/Easydict/Swift/Feature/Configuration/DefaultsStoredKey.swift index 61661e4cd..a3d09f684 100644 --- a/Easydict/Swift/Feature/Configuration/DefaultsStoredKey.swift +++ b/Easydict/Swift/Feature/Configuration/DefaultsStoredKey.swift @@ -36,7 +36,7 @@ enum StoredKey: String { case translation case dictionary case sentence - case availableModels // save in String + case supportedModels = "AvailableModels" // save in String: "gpt-3.5, gpt-4" case validModels // save in [String] case model case apiKey = "API" diff --git a/Easydict/Swift/Model/ServiceUsageStatus.swift b/Easydict/Swift/Model/ServiceUsageStatus.swift index bfa04040a..a60d08668 100644 --- a/Easydict/Swift/Model/ServiceUsageStatus.swift +++ b/Easydict/Swift/Model/ServiceUsageStatus.swift @@ -39,6 +39,14 @@ extension ServiceUsageStatus: EnumLocalizedStringConvertible { } } -// MARK: Defaults.Serializable +// MARK: - String + EnumLocalizedStringConvertible + +extension String: EnumLocalizedStringConvertible { + var title: LocalizedStringKey { + LocalizedStringKey(self) + } +} + +// MARK: - ServiceUsageStatus + Defaults.Serializable extension ServiceUsageStatus: Defaults.Serializable {} diff --git a/Easydict/Swift/Service/OpenAI/LLMStreamService.swift b/Easydict/Swift/Service/OpenAI/LLMStreamService.swift index 0f4c4fcba..e69daca99 100644 --- a/Easydict/Swift/Service/OpenAI/LLMStreamService.swift +++ b/Easydict/Swift/Service/OpenAI/LLMStreamService.swift @@ -12,8 +12,6 @@ import Foundation // MARK: - LLMStreamService -// import SwiftUI - @objcMembers @objc(EZLLMStreamService) public class LLMStreamService: QueryService, ObservableObject { @@ -72,9 +70,13 @@ public class LLMStreamService: QueryService, ObservableObject { let mustOverride = "This property or method must be overridden by a subclass" - var viewModel: LLMStreamViewModel { - _viewModel - } + lazy var viewModel: LLMStreamViewModel = { + LLMStreamViewModel( + service: self, + model: model, + supportedModels: supportedModels + ) + }() var unsupportedLanguages: [Language] { [] @@ -91,16 +93,16 @@ public class LLMStreamService: QueryService, ObservableObject { } } - var availableModels: String { - get { Defaults[stringDefaultsKey(.availableModels)] } + var supportedModels: String { + get { Defaults[stringDefaultsKey(.supportedModels)] } set { - Defaults[stringDefaultsKey(.availableModels)] = newValue + Defaults[stringDefaultsKey(.supportedModels)] = newValue } } var validModels: [String] { - get { Defaults[serviceDefaultsKey(.validModels, defaultValue: [""])] } - set { Defaults[serviceDefaultsKey(.validModels, defaultValue: [""])] = newValue } + supportedModels.components(separatedBy: ",") + .map { $0.trim() }.filter { !$0.isEmpty } } // apiKey @@ -171,14 +173,6 @@ public class LLMStreamService: QueryService, ObservableObject { // MARK: Private - private lazy var _viewModel: LLMStreamViewModel = { - LLMStreamViewModel( - service: self -// model: model, -// availableModels: availableModels - ) - }() - private var cancellables: Set = [] } diff --git a/Easydict/Swift/Service/OpenAI/OpenAIService.swift b/Easydict/Swift/Service/OpenAI/OpenAIService.swift index e12cc7b60..943519d7d 100644 --- a/Easydict/Swift/Service/OpenAI/OpenAIService.swift +++ b/Easydict/Swift/Service/OpenAI/OpenAIService.swift @@ -29,20 +29,7 @@ class OpenAIService: BaseOpenAIService { // MARK: Internal - override var validModels: [String] { - get { - Defaults[serviceDefaultsKey( - .availableModels, - defaultValue: OpenAIModel.allCases.map { $0.rawValue } - )] - } - set { - Defaults[serviceDefaultsKey( - .availableModels, - defaultValue: OpenAIModel.allCases.map { $0.rawValue } - )] = newValue - } - } + // TODO: We need to set default supportedModels for OpenAI override var endpoint: String { super.endpoint.isEmpty ? "https://api.openai.com/v1/chat/completions" : super.endpoint diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift index 2021f60bf..a8c6712af 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift @@ -64,7 +64,7 @@ struct StreamConfigurationView: View, DefaultsKey { observeKeys: [ stringDefaultsKey(.apiKey), stringDefaultsKey(.endpoint), - stringDefaultsKey(.availableModels), + stringDefaultsKey(.supportedModels), ] ) { if showNameSection { @@ -94,27 +94,18 @@ struct StreamConfigurationView: View, DefaultsKey { if showSupportedModelsSection { TextEditorCell( - title: "service.configuration.custom_openai.supported_models.title", - text: $viewModel.availableModels, + titleKey: "service.configuration.custom_openai.supported_models.title", + storedValueKey: stringDefaultsKey(.supportedModels), placeholder: "service.configuration.custom_openai.model.placeholder" - ).onChange(of: viewModel.availableModels) { - print("onChange availableModels: \($0)") - } + ) } if showUsedModelSection { - Picker( - "service.configuration.openai.model.title", - selection: $viewModel.model - ) { - ForEach(viewModel.validModels, id: \.self) { value in - Text(value) - } - } - .padding(10.0) - .onChange(of: viewModel.model) { - print("onChange model: \($0)") - } + ServiceConfigurationPickerCell( + titleKey: "service.configuration.openai.model.title", + key: stringDefaultsKey(.model), + values: viewModel.validModels + ) } if showTranslationToggle { @@ -164,20 +155,15 @@ class LLMStreamViewModel: ObservableObject, DefaultsKey { // MARK: Lifecycle init( - service: LLMStreamService -// model: String, -// availableModels: String + service: LLMStreamService, + model: String, + supportedModels: String ) { self.service = service -// self.model = model -// self.availableModels = availableModels - - self.model = Defaults[service.stringDefaultsKey(.model)] - self.availableModels = Defaults[service.stringDefaultsKey(.availableModels)] + self.model = model + self.supportedModels = supportedModels setupSubscribers() - - availableModelsTextDidChanged(availableModels) } // MARK: Internal @@ -194,28 +180,36 @@ class LLMStreamViewModel: ObservableObject, DefaultsKey { } } - @Published var availableModels: String { + @Published var supportedModels: String { didSet { - if availableModels != oldValue { - availableModelsTextDidChanged(availableModels) + if supportedModels != oldValue { + supportedModelsTextDidChanged(supportedModels) } } } func setupSubscribers() { - Defaults.publisher(stringDefaultsKey(.model)) + Defaults.publisher(stringDefaultsKey(.name), options: []) + .removeDuplicates() + .throttle(for: 0.1, scheduler: DispatchQueue.main, latest: true) + .sink { [weak self] _ in + self?.notifyServiceConfigurationChanged() + } + .store(in: &cancellables) + + Defaults.publisher(stringDefaultsKey(.model), options: []) .removeDuplicates() .throttle(for: 0.1, scheduler: DispatchQueue.main, latest: true) .sink { [weak self] in - self?.model = $0.newValue + self?.modelDidChanged($0.newValue) } .store(in: &cancellables) - Defaults.publisher(stringDefaultsKey(.availableModels)) + Defaults.publisher(stringDefaultsKey(.supportedModels)) .removeDuplicates() .throttle(for: 0.1, scheduler: DispatchQueue.main, latest: true) .sink { [weak self] in - self?.availableModels = $0.newValue + self?.supportedModelsTextDidChanged($0.newValue) } .store(in: &cancellables) } @@ -237,27 +231,28 @@ class LLMStreamViewModel: ObservableObject, DefaultsKey { private var cancellables: Set = [] - private func modelDidChanged(_ model: String) { - Defaults[stringDefaultsKey(.model)] = model + private func modelDidChanged(_ newModel: String) { + Defaults[stringDefaultsKey(.model)] = newModel - if !validModels.contains(model) { - if model.isEmpty { - availableModels = "" + // Handle some special cases + if !validModels.contains(newModel) { + if newModel.isEmpty { + supportedModels = "" } else { - if availableModels.isEmpty { - availableModels = model + if supportedModels.isEmpty { + supportedModels = newModel } else { - availableModels = "\(model), " + availableModels + supportedModels = "\(newModel), " + supportedModels } } } notifyServiceConfigurationChanged() } - private func availableModelsTextDidChanged(_ availableModels: String) { - Defaults[stringDefaultsKey(.availableModels)] = availableModels + private func supportedModelsTextDidChanged(_ newSupportedModels: String) { + Defaults[stringDefaultsKey(.supportedModels)] = newSupportedModels - validModels = availableModels.components(separatedBy: ",") + validModels = newSupportedModels.components(separatedBy: ",") .map { $0.trim() }.filter { !$0.isEmpty } if validModels.isEmpty { @@ -265,7 +260,6 @@ class LLMStreamViewModel: ObservableObject, DefaultsKey { } else if !validModels.contains(model) { model = validModels[0] } - Defaults[serviceDefaultsKey(.validModels, defaultValue: [""])] = validModels } private func notifyServiceConfigurationChanged() { diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationCells.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationCells.swift index 9870ea25d..7cf79e1b9 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationCells.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationCells.swift @@ -118,6 +118,7 @@ class ToggleViewModel: ObservableObject { // MARK: Internal + let key: Defaults.Key @Default var value: String @Published var isOn: Bool { @@ -125,11 +126,6 @@ class ToggleViewModel: ObservableObject { value = isOn ? "1" : "0" } } - - // MARK: Private - - private var key: Defaults.Key - private var cancellable: AnyCancellable? } // MARK: - ServiceConfigurationToggleCell @@ -144,9 +140,9 @@ struct ServiceConfigurationToggleCell: View { // MARK: Internal -// @Default var value: String let titleKey: LocalizedStringKey + // Since we previously used String for the toggle value, we have to connect String <--> Bool with a viewModel. @ObservedObject var viewModel: ToggleViewModel var body: some View { diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/TextEditorCell.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/TextEditorCell.swift index 7384a291c..dc4feac89 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/TextEditorCell.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/TextEditorCell.swift @@ -6,22 +6,35 @@ // Copyright © 2024 izual. All rights reserved. // +import Defaults import SwiftUI // MARK: - TextEditorCell struct TextEditorCell: View { + // MARK: Lifecycle + + init( + titleKey: LocalizedStringKey, + storedValueKey: Defaults.Key, + placeholder: LocalizedStringKey + ) { + self.titleKey = titleKey + self.placeholder = placeholder + _value = .init(storedValueKey) + } + // MARK: Internal - let title: LocalizedStringKey - @Binding var text: String + let titleKey: LocalizedStringKey + @Default var value: String let placeholder: LocalizedStringKey var body: some View { HStack(alignment: .center, spacing: 20) { - Text(title) + Text(titleKey) - TrailingTextEditorWithPlaceholder(text: $text, placeholder: placeholder) + TrailingTextEditorWithPlaceholder(text: $value, placeholder: placeholder) .padding(.horizontal, 3) .padding(.top, 5) .padding(.bottom, 7) @@ -70,10 +83,6 @@ struct TrailingTextEditorWithPlaceholder: View { TextEditor(text: $text) .multilineTextAlignment(.trailing) - .onChange(of: text) { newValue in - print("TextEditor onChange: \(text)") - print("newValue: \(newValue)") - } } } } From 6bf590ba6379317606ec7010f002ad52ac55fcb3 Mon Sep 17 00:00:00 2001 From: tisfeng Date: Wed, 26 Jun 2024 23:44:29 +0800 Subject: [PATCH 05/21] perf: disable user to edit built-in supported models --- .../ConfigurationView/StreamConfigurationView.swift | 11 ++++++++++- .../ServiceConfigurationView/TextEditorCell.swift | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift index a8c6712af..5a6b668c5 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift @@ -41,6 +41,13 @@ struct StreamConfigurationView: View, DefaultsKey { self.showSentenceToggle = showSentenceToggle self.showDictionaryToggle = showDictionaryToggle self.showUsageStatusPicker = showUsageStatusPicker + + // Disable user to edit built-in supported models. + self.isEditable = service.serviceType() != .builtInAI + + #if DEBUG + self.isEditable = isEditable || Defaults[.enableBetaFeature] + #endif } // MARK: Internal @@ -58,6 +65,8 @@ struct StreamConfigurationView: View, DefaultsKey { let showDictionaryToggle: Bool let showUsageStatusPicker: Bool + var isEditable = true + var body: some View { ServiceConfigurationSecretSectionView( service: service, @@ -97,7 +106,7 @@ struct StreamConfigurationView: View, DefaultsKey { titleKey: "service.configuration.custom_openai.supported_models.title", storedValueKey: stringDefaultsKey(.supportedModels), placeholder: "service.configuration.custom_openai.model.placeholder" - ) + ).disabled(!isEditable) } if showUsedModelSection { diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/TextEditorCell.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/TextEditorCell.swift index dc4feac89..f5f4fed34 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/TextEditorCell.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/TextEditorCell.swift @@ -73,7 +73,7 @@ struct TrailingTextEditorWithPlaceholder: View { .padding(.horizontal, 5) .background(GeometryReader { geometry in Color.clear.onAppear { - // 22 is one line height, if placeholder is more than one line, alway set alignment to .leading + // 22 is one line height, if placeholder is more than one line, always set alignment to .leading if geometry.size.height > 22 { oneLineAlignment = .topLeading } From af083069e7fbd00ddbb856c402ccba7adbc4f2df Mon Sep 17 00:00:00 2001 From: tisfeng Date: Fri, 28 Jun 2024 22:16:39 +0800 Subject: [PATCH 06/21] refactor: improve StreamConfigurationView, remove viewModel --- Easydict.xcodeproj/project.pbxproj | 6 +- .../Service/BuiltInAI/BuiltInAIService.swift | 2 +- .../CustomOpenAI/CustomOpenAIService.swift | 4 +- .../Swift/Service/Gemini/GeminiService.swift | 3 +- .../LLMStreamService+Configuration.swift | 98 ++++++++++ .../Service/OpenAI/LLMStreamService.swift | 108 +++++------ .../Swift/Service/OpenAI/OpenAIService.swift | 2 +- .../StreamConfigurationView.swift | 168 ++---------------- .../ServiceConfigurationCells.swift | 28 +++ .../View/ResultView/EZResultView.m | 2 +- 10 files changed, 208 insertions(+), 213 deletions(-) create mode 100644 Easydict/Swift/Service/OpenAI/LLMStreamService+Configuration.swift diff --git a/Easydict.xcodeproj/project.pbxproj b/Easydict.xcodeproj/project.pbxproj index 599efe9dc..04a94bfd2 100644 --- a/Easydict.xcodeproj/project.pbxproj +++ b/Easydict.xcodeproj/project.pbxproj @@ -221,6 +221,7 @@ 03F0DB382953428300EBF9C1 /* EZLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 03F0DB372953428300EBF9C1 /* EZLog.m */; }; 03F14A3B2956016B00CB7379 /* EZVolcanoTranslate.m in Sources */ = {isa = PBXBuildFile; fileRef = 03F14A3A2956016B00CB7379 /* EZVolcanoTranslate.m */; }; 03F639952AA6CFBB009B9914 /* EZBingConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 03F639942AA6CFBB009B9914 /* EZBingConfig.m */; }; + 03FA677E2C2EFB10000FEA64 /* LLMStreamService+Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03FA677D2C2EFB10000FEA64 /* LLMStreamService+Configuration.swift */; }; 03FB3EDD2B1B405B004C3238 /* TencentSigning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03FB3EDC2B1B405B004C3238 /* TencentSigning.swift */; }; 03FD68BB2B1DC59600FD388E /* CryptoSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 03FD68BA2B1DC59600FD388E /* CryptoSwift */; }; 03FD68BE2B1E151A00FD388E /* String+EncryptAES.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03FD68BD2B1E151A00FD388E /* String+EncryptAES.swift */; }; @@ -704,6 +705,7 @@ 03F14A3A2956016B00CB7379 /* EZVolcanoTranslate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EZVolcanoTranslate.m; sourceTree = ""; }; 03F639932AA6CFBB009B9914 /* EZBingConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EZBingConfig.h; sourceTree = ""; }; 03F639942AA6CFBB009B9914 /* EZBingConfig.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EZBingConfig.m; sourceTree = ""; }; + 03FA677D2C2EFB10000FEA64 /* LLMStreamService+Configuration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "LLMStreamService+Configuration.swift"; sourceTree = ""; }; 03FB3EDC2B1B405B004C3238 /* TencentSigning.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TencentSigning.swift; sourceTree = ""; }; 03FD68BD2B1E151A00FD388E /* String+EncryptAES.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+EncryptAES.swift"; sourceTree = ""; }; 06E15747A7BD34D510ADC6A8 /* Pods-Easydict.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Easydict.debug.xcconfig"; path = "Target Support Files/Pods-Easydict/Pods-Easydict.debug.xcconfig"; sourceTree = ""; }; @@ -1193,8 +1195,8 @@ 03779F0A2BB25688008D3C42 /* Service */ = { isa = PBXGroup; children = ( - 036D627F2BCAB5C6002C95C7 /* BuiltInAI */, 03779F0D2BB256A7008D3C42 /* OpenAI */, + 036D627F2BCAB5C6002C95C7 /* BuiltInAI */, 0A9AFBA92B7F8D6A0064C9A8 /* CustomOpenAI */, C4DD01E72B12B3B00025EE8E /* Tencent */, 2746AEBF2AF95040005FE0A1 /* Caiyun */, @@ -1208,6 +1210,7 @@ isa = PBXGroup; children = ( 0387FB792BFBA990000A7A82 /* LLMStreamService.swift */, + 03FA677D2C2EFB10000FEA64 /* LLMStreamService+Configuration.swift */, 0396DE542BB5844A009FD2A5 /* BaseOpenAIService.swift */, 03779F0B2BB256A7008D3C42 /* OpenAIService.swift */, 03779F0C2BB256A7008D3C42 /* Prompt.swift */, @@ -2791,6 +2794,7 @@ 03BDA7BF2A26DA280079D04F /* NSScanner+EscapedScanning.m in Sources */, 03542A4C2937B5F100C34C33 /* EZYoudaoTranslate.m in Sources */, 0A2A05A62B59757100EEA142 /* Bundle+AppInfo.swift in Sources */, + 03FA677E2C2EFB10000FEA64 /* LLMStreamService+Configuration.swift in Sources */, 03247E362968158B00AFCD67 /* EZScriptExecutor.m in Sources */, 03882F8E29D95044005B5A52 /* ToastWindowController.m in Sources */, 03B0231929231FA6001C7E63 /* SnipViewController.m in Sources */, diff --git a/Easydict/Swift/Service/BuiltInAI/BuiltInAIService.swift b/Easydict/Swift/Service/BuiltInAI/BuiltInAIService.swift index 743865db6..fe0f878a4 100644 --- a/Easydict/Swift/Service/BuiltInAI/BuiltInAIService.swift +++ b/Easydict/Swift/Service/BuiltInAI/BuiltInAIService.swift @@ -24,7 +24,7 @@ class BuiltInAIService: BaseOpenAIService { public override func configurationListItems() -> Any { StreamConfigurationView( service: self, - viewModel: viewModel, +// viewModel: viewModel, showNameSection: false, showAPIKeySection: false, showEndpointSection: false diff --git a/Easydict/Swift/Service/CustomOpenAI/CustomOpenAIService.swift b/Easydict/Swift/Service/CustomOpenAI/CustomOpenAIService.swift index ad6912ee0..ef465da43 100644 --- a/Easydict/Swift/Service/CustomOpenAI/CustomOpenAIService.swift +++ b/Easydict/Swift/Service/CustomOpenAI/CustomOpenAIService.swift @@ -14,7 +14,7 @@ class CustomOpenAIService: BaseOpenAIService { // MARK: Public public override func name() -> String { - let serviceName = Defaults[stringDefaultsKey(.name)] + let serviceName = Defaults[super.nameKey] return serviceName.isEmpty ? NSLocalizedString("custom_openai", comment: "") : serviceName } @@ -27,7 +27,7 @@ class CustomOpenAIService: BaseOpenAIService { override func configurationListItems() -> Any { StreamConfigurationView( service: self, - viewModel: viewModel, +// viewModel: viewModel, showNameSection: true ) } diff --git a/Easydict/Swift/Service/Gemini/GeminiService.swift b/Easydict/Swift/Service/Gemini/GeminiService.swift index e1ff3842e..7c321db11 100644 --- a/Easydict/Swift/Service/Gemini/GeminiService.swift +++ b/Easydict/Swift/Service/Gemini/GeminiService.swift @@ -110,8 +110,7 @@ public final class GeminiService: LLMStreamService { public override func configurationListItems() -> Any { StreamConfigurationView( service: self, - viewModel: viewModel, - showNameSection: false + showEndpointSection: false ) } diff --git a/Easydict/Swift/Service/OpenAI/LLMStreamService+Configuration.swift b/Easydict/Swift/Service/OpenAI/LLMStreamService+Configuration.swift new file mode 100644 index 000000000..b250f3073 --- /dev/null +++ b/Easydict/Swift/Service/OpenAI/LLMStreamService+Configuration.swift @@ -0,0 +1,98 @@ +// +// LLMStreamService+Configuation.swift +// Easydict +// +// Created by tisfeng on 2024/6/28. +// Copyright © 2024 izual. All rights reserved. +// + +import Defaults +import Foundation + +extension LLMStreamService { + func setupSubscribers() { + Defaults.publisher(nameKey, options: []) + .removeDuplicates() + .throttle(for: 0.1, scheduler: DispatchQueue.main, latest: true) + .sink { [weak self] _ in + self?.notifyServiceConfigurationChanged() + } + .store(in: &cancellables) + + Defaults.publisher(modelKey, options: []) + .removeDuplicates() + .throttle(for: 0.1, scheduler: DispatchQueue.main, latest: true) + .sink { [weak self] in + self?.modelDidChanged($0.newValue) + } + .store(in: &cancellables) + + Defaults.publisher(supportedModelsKey, options: []) + .removeDuplicates() + .throttle(for: 0.1, scheduler: DispatchQueue.main, latest: true) + .sink { [weak self] in + self?.supportedModelsTextDidChanged($0.newValue) + } + .store(in: &cancellables) + } + + func invalidate() { + cancellables.forEach { $0.cancel() } + cancellables.removeAll() + } + + func modelDidChanged(_ newModel: String) { + model = newModel + + // Handle some special cases + if !validModels.contains(newModel) { + if newModel.isEmpty { + supportedModels = "" + } else { + if supportedModels.isEmpty { + supportedModels = newModel + } else { + supportedModels = "\(newModel), " + supportedModels + } + } + } + notifyServiceConfigurationChanged() + } + + func supportedModelsTextDidChanged(_ newSupportedModels: String) { + supportedModels = newSupportedModels + + if validModels.isEmpty { + model = "" + } else if !validModels.contains(model) { + model = validModels[0] + } + + Defaults[validModelsKey] = validModels + } + + func notifyServiceConfigurationChanged() { + objectWillChange.send() + + logInfo("service config changed: \(serviceType().rawValue)") + + let userInfo: [String: Any] = [ + EZWindowTypeKey: windowType.rawValue, + EZServiceTypeKey: serviceType().rawValue, + ] + let notification = Notification(name: .serviceHasUpdated, object: nil, userInfo: userInfo) + NotificationCenter.default.post(notification) + } + + func stringDefaultsKey(_ key: StoredKey) -> Defaults.Key { + defaultsKey(key, serviceType: serviceType(), defaultValue: "") + } + + func serviceDefaultsKey(_ key: StoredKey, defaultValue: T) -> Defaults.Key { + defaultsKey(key, serviceType: serviceType(), defaultValue: defaultValue) + } + + func serviceDefaultsKey(_ key: StoredKey) -> Defaults.Key { + defaultsKey(key, serviceType: serviceType()) + } +} diff --git a/Easydict/Swift/Service/OpenAI/LLMStreamService.swift b/Easydict/Swift/Service/OpenAI/LLMStreamService.swift index e69daca99..631d934c9 100644 --- a/Easydict/Swift/Service/OpenAI/LLMStreamService.swift +++ b/Easydict/Swift/Service/OpenAI/LLMStreamService.swift @@ -41,9 +41,9 @@ public class LLMStreamService: QueryService, ObservableObject { public override func queryTextType() -> EZQueryTextType { var typeOptions: EZQueryTextType = [] - let isTranslationEnabled = Defaults[stringDefaultsKey(.translation)].boolValue - let isSentenceEnabled = Defaults[stringDefaultsKey(.sentence)].boolValue - let isDictionaryEnabled = Defaults[stringDefaultsKey(.dictionary)].boolValue + let isTranslationEnabled = Defaults[translationKey].boolValue + let isSentenceEnabled = Defaults[sentenceKey].boolValue + let isDictionaryEnabled = Defaults[dictionaryKey].boolValue if isTranslationEnabled { typeOptions.insert(.translation) @@ -59,8 +59,8 @@ public class LLMStreamService: QueryService, ObservableObject { } public override func serviceUsageStatus() -> EZServiceUsageStatus { - let usageStatus = Defaults[stringDefaultsKey(.serviceUsageStatus)] - guard let value = UInt(usageStatus) else { return .default } + let usageStatus = Defaults[serviceUsageStatusKey] + guard let value = UInt(usageStatus.rawValue) else { return .default } return EZServiceUsageStatus(rawValue: value) ?? .default } @@ -70,49 +70,81 @@ public class LLMStreamService: QueryService, ObservableObject { let mustOverride = "This property or method must be overridden by a subclass" - lazy var viewModel: LLMStreamViewModel = { - LLMStreamViewModel( - service: self, - model: model, - supportedModels: supportedModels - ) - }() + var cancellables: Set = [] var unsupportedLanguages: [Language] { [] } var model: String { - get { - Defaults[stringDefaultsKey(.model)] - } + get { Defaults[modelKey] } set { if model != newValue { - Defaults[stringDefaultsKey(.model)] = newValue + Defaults[modelKey] = newValue } } } + var modelKey: Defaults.Key { + stringDefaultsKey(.model) + } + var supportedModels: String { - get { Defaults[stringDefaultsKey(.supportedModels)] } + get { Defaults[supportedModelsKey] } set { - Defaults[stringDefaultsKey(.supportedModels)] = newValue + if supportedModels != newValue { + Defaults[supportedModelsKey] = newValue + } } } + var supportedModelsKey: Defaults.Key { + stringDefaultsKey(.supportedModels) + } + var validModels: [String] { supportedModels.components(separatedBy: ",") .map { $0.trim() }.filter { !$0.isEmpty } } - // apiKey + var validModelsKey: Defaults.Key<[String]> { + serviceDefaultsKey(.validModels, defaultValue: [""]) + } + var apiKey: String { - Defaults[stringDefaultsKey(.apiKey)] + Defaults[apiKeyKey] + } + + var apiKeyKey: Defaults.Key { + stringDefaultsKey(.apiKey) } - // endpoint var endpoint: String { - Defaults[stringDefaultsKey(.endpoint)] + Defaults[endpointKey] + } + + var endpointKey: Defaults.Key { + stringDefaultsKey(.endpoint) + } + + var nameKey: Defaults.Key { + stringDefaultsKey(.name) + } + + var translationKey: Defaults.Key { + stringDefaultsKey(.translation) + } + + var sentenceKey: Defaults.Key { + stringDefaultsKey(.sentence) + } + + var dictionaryKey: Defaults.Key { + stringDefaultsKey(.dictionary) + } + + var serviceUsageStatusKey: Defaults.Key { + serviceDefaultsKey(.serviceUsageStatus, defaultValue: .default) } /// Base on chat query, convert prompt dict to LLM service prompt model. @@ -165,15 +197,6 @@ public class LLMStreamService: QueryService, ObservableObject { /// Cancel stream request manually. func cancelStream() {} - - func invalidate() { - cancellables.forEach { $0.cancel() } - cancellables.removeAll() - } - - // MARK: Private - - private var cancellables: Set = [] } extension LLMStreamService { @@ -224,29 +247,6 @@ extension LLMStreamService { } } -// MARK: - DefaultsKey - -protocol DefaultsKey { - func stringDefaultsKey(_ key: StoredKey) -> Defaults.Key - func serviceDefaultsKey(_ key: StoredKey, defaultValue: T) -> Defaults.Key -} - -// MARK: - QueryService + DefaultsKey - -extension QueryService: DefaultsKey { - func stringDefaultsKey(_ key: StoredKey) -> Defaults.Key { - defaultsKey(key, serviceType: serviceType(), defaultValue: "") - } - - func serviceDefaultsKey(_ key: StoredKey, defaultValue: T) -> Defaults.Key { - defaultsKey(key, serviceType: serviceType(), defaultValue: defaultValue) - } - - func serviceDefaultsKey(_ key: StoredKey) -> Defaults.Key { - defaultsKey(key, serviceType: serviceType()) - } -} - // MARK: - ChatQueryParam struct ChatQueryParam { diff --git a/Easydict/Swift/Service/OpenAI/OpenAIService.swift b/Easydict/Swift/Service/OpenAI/OpenAIService.swift index 943519d7d..15b198505 100644 --- a/Easydict/Swift/Service/OpenAI/OpenAIService.swift +++ b/Easydict/Swift/Service/OpenAI/OpenAIService.swift @@ -36,7 +36,7 @@ class OpenAIService: BaseOpenAIService { } override func configurationListItems() -> Any { - StreamConfigurationView(service: self, viewModel: viewModel) + StreamConfigurationView(service: self) } } diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift index 5a6b668c5..f41b7afbf 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift @@ -13,12 +13,11 @@ import SwiftUI // MARK: - StreamConfigurationView -struct StreamConfigurationView: View, DefaultsKey { +struct StreamConfigurationView: View { // MARK: Lifecycle init( service: LLMStreamService, - viewModel: LLMStreamViewModel, showNameSection: Bool = false, showAPIKeySection: Bool = true, showEndpointSection: Bool = true, @@ -30,7 +29,6 @@ struct StreamConfigurationView: View, DefaultsKey { showUsageStatusPicker: Bool = true ) { self.service = service - self.viewModel = viewModel self.showNameSection = showNameSection self.showAPIKeySection = showAPIKeySection @@ -48,12 +46,13 @@ struct StreamConfigurationView: View, DefaultsKey { #if DEBUG self.isEditable = isEditable || Defaults[.enableBetaFeature] #endif + + service.setupSubscribers() } // MARK: Internal let service: LLMStreamService - @ObservedObject var viewModel: LLMStreamViewModel let showNameSection: Bool let showAPIKeySection: Bool @@ -71,15 +70,15 @@ struct StreamConfigurationView: View, DefaultsKey { ServiceConfigurationSecretSectionView( service: service, observeKeys: [ - stringDefaultsKey(.apiKey), - stringDefaultsKey(.endpoint), - stringDefaultsKey(.supportedModels), + service.apiKeyKey, + service.endpointKey, + service.supportedModelsKey, ] ) { if showNameSection { ServiceConfigurationInputCell( textFieldTitleKey: "service.configuration.custom_openai.name.title", - key: stringDefaultsKey(.name), + key: service.nameKey, placeholder: "custom_openai", limitLength: 20 ) @@ -88,7 +87,7 @@ struct StreamConfigurationView: View, DefaultsKey { if showAPIKeySection { ServiceConfigurationSecureInputCell( textFieldTitleKey: "service.configuration.openai.api_key.title", - key: stringDefaultsKey(.apiKey), + key: service.apiKeyKey, placeholder: "service.configuration.openai.api_key.placeholder" ) } @@ -96,7 +95,7 @@ struct StreamConfigurationView: View, DefaultsKey { if showEndpointSection { ServiceConfigurationInputCell( textFieldTitleKey: "service.configuration.openai.endpoint.title", - key: stringDefaultsKey(.endpoint), + key: service.endpointKey, placeholder: "service.configuration.openai.endpoint.placeholder" ) } @@ -104,42 +103,42 @@ struct StreamConfigurationView: View, DefaultsKey { if showSupportedModelsSection { TextEditorCell( titleKey: "service.configuration.custom_openai.supported_models.title", - storedValueKey: stringDefaultsKey(.supportedModels), + storedValueKey: service.supportedModelsKey, placeholder: "service.configuration.custom_openai.model.placeholder" ).disabled(!isEditable) } if showUsedModelSection { - ServiceConfigurationPickerCell( + PickerCell( titleKey: "service.configuration.openai.model.title", - key: stringDefaultsKey(.model), - values: viewModel.validModels + selectionKey: service.modelKey, + valuesKey: service.validModelsKey ) } if showTranslationToggle { ServiceConfigurationToggleCell( titleKey: "service.configuration.openai.translation.title", - key: stringDefaultsKey(.translation) + key: service.translationKey ) } if showSentenceToggle { ServiceConfigurationToggleCell( titleKey: "service.configuration.openai.sentence.title", - key: stringDefaultsKey(.sentence) + key: service.sentenceKey ) } if showDictionaryToggle { ServiceConfigurationToggleCell( titleKey: "service.configuration.openai.dictionary.title", - key: stringDefaultsKey(.dictionary) + key: service.dictionaryKey ) } if showUsageStatusPicker { ServiceConfigurationPickerCell( titleKey: "service.configuration.openai.usage_status.title", - key: serviceDefaultsKey(.serviceUsageStatus, defaultValue: ServiceUsageStatus.default), + key: service.serviceUsageStatusKey, values: ServiceUsageStatus.allCases ) } @@ -148,137 +147,4 @@ struct StreamConfigurationView: View, DefaultsKey { service.invalidate() } } - - func stringDefaultsKey(_ key: StoredKey) -> Defaults.Key { - service.stringDefaultsKey(key) - } - - func serviceDefaultsKey(_ key: StoredKey, defaultValue: T) -> Defaults.Key { - service.serviceDefaultsKey(key, defaultValue: defaultValue) - } -} - -// MARK: - LLMStreamViewModel - -class LLMStreamViewModel: ObservableObject, DefaultsKey { - // MARK: Lifecycle - - init( - service: LLMStreamService, - model: String, - supportedModels: String - ) { - self.service = service - self.model = model - self.supportedModels = supportedModels - - setupSubscribers() - } - - // MARK: Internal - - let service: LLMStreamService - - @Published var validModels: [String] = [] - - @Published var model: String { - didSet { - if model != oldValue { - modelDidChanged(model) - } - } - } - - @Published var supportedModels: String { - didSet { - if supportedModels != oldValue { - supportedModelsTextDidChanged(supportedModels) - } - } - } - - func setupSubscribers() { - Defaults.publisher(stringDefaultsKey(.name), options: []) - .removeDuplicates() - .throttle(for: 0.1, scheduler: DispatchQueue.main, latest: true) - .sink { [weak self] _ in - self?.notifyServiceConfigurationChanged() - } - .store(in: &cancellables) - - Defaults.publisher(stringDefaultsKey(.model), options: []) - .removeDuplicates() - .throttle(for: 0.1, scheduler: DispatchQueue.main, latest: true) - .sink { [weak self] in - self?.modelDidChanged($0.newValue) - } - .store(in: &cancellables) - - Defaults.publisher(stringDefaultsKey(.supportedModels)) - .removeDuplicates() - .throttle(for: 0.1, scheduler: DispatchQueue.main, latest: true) - .sink { [weak self] in - self?.supportedModelsTextDidChanged($0.newValue) - } - .store(in: &cancellables) - } - - func serviceDefaultsKey(_ key: StoredKey, defaultValue: T) -> Defaults.Key { - service.serviceDefaultsKey(key, defaultValue: defaultValue) - } - - func stringDefaultsKey(_ key: StoredKey) -> Defaults.Key { - service.stringDefaultsKey(key) - } - - func invalidate() { - cancellables.forEach { $0.cancel() } - cancellables.removeAll() - } - - // MARK: Private - - private var cancellables: Set = [] - - private func modelDidChanged(_ newModel: String) { - Defaults[stringDefaultsKey(.model)] = newModel - - // Handle some special cases - if !validModels.contains(newModel) { - if newModel.isEmpty { - supportedModels = "" - } else { - if supportedModels.isEmpty { - supportedModels = newModel - } else { - supportedModels = "\(newModel), " + supportedModels - } - } - } - notifyServiceConfigurationChanged() - } - - private func supportedModelsTextDidChanged(_ newSupportedModels: String) { - Defaults[stringDefaultsKey(.supportedModels)] = newSupportedModels - - validModels = newSupportedModels.components(separatedBy: ",") - .map { $0.trim() }.filter { !$0.isEmpty } - - if validModels.isEmpty { - model = "" - } else if !validModels.contains(model) { - model = validModels[0] - } - } - - private func notifyServiceConfigurationChanged() { - objectWillChange.send() - - let userInfo: [String: Any] = [ - EZWindowTypeKey: service.windowType.rawValue, - EZServiceTypeKey: service.serviceType().rawValue, - ] - let notification = Notification(name: .serviceHasUpdated, object: nil, userInfo: userInfo) - NotificationCenter.default.post(notification) - } } diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationCells.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationCells.swift index 7cf79e1b9..d2d0dd784 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationCells.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationCells.swift @@ -105,6 +105,34 @@ struct ServiceConfigurationPickerCell: View { + // MARK: Lifecycle + + init(titleKey: LocalizedStringKey, selectionKey: Defaults.Key, valuesKey: Defaults.Key<[T]>) { + self.titleKey = titleKey + _selection = .init(selectionKey) + _values = .init(valuesKey) + } + + // MARK: Internal + + let titleKey: LocalizedStringKey + + @Default var selection: T + @Default var values: [T] + + var body: some View { + Picker(titleKey, selection: $selection) { + ForEach(values, id: \.self) { value in + Text(value.title) + } + } + .padding(10.0) + } +} + // MARK: - ToggleViewModel class ToggleViewModel: ObservableObject { diff --git a/Easydict/objc/ViewController/View/ResultView/EZResultView.m b/Easydict/objc/ViewController/View/ResultView/EZResultView.m index 4a4943516..2e32a18cc 100644 --- a/Easydict/objc/ViewController/View/ResultView/EZResultView.m +++ b/Easydict/objc/ViewController/View/ResultView/EZResultView.m @@ -449,7 +449,7 @@ - (void)modelDidSelected:(NSMenuItem *)sender { if (![service.model isEqualToString:sender.title]) { service.model = sender.title; self.serviceModelButton.title = service.model; - [self postServiceUpdatedNotification:service.serviceType]; +// [self postServiceUpdatedNotification:service.serviceType]; } } From 863cb5c6e8a1c63f915f2204cff09c86153d3604 Mon Sep 17 00:00:00 2001 From: tisfeng Date: Fri, 28 Jun 2024 22:41:39 +0800 Subject: [PATCH 07/21] fix: setup subscribers when init, post update notification if model changes --- Easydict/Swift/Service/OpenAI/LLMStreamService.swift | 7 +++++++ .../ConfigurationView/StreamConfigurationView.swift | 1 + .../objc/ViewController/View/ResultView/EZResultView.m | 7 ------- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Easydict/Swift/Service/OpenAI/LLMStreamService.swift b/Easydict/Swift/Service/OpenAI/LLMStreamService.swift index 631d934c9..ca5bb74e8 100644 --- a/Easydict/Swift/Service/OpenAI/LLMStreamService.swift +++ b/Easydict/Swift/Service/OpenAI/LLMStreamService.swift @@ -15,6 +15,13 @@ import Foundation @objcMembers @objc(EZLLMStreamService) public class LLMStreamService: QueryService, ObservableObject { + // MARK: Lifecycle + + public override init() { + super.init() + setupSubscribers() + } + // MARK: Public public override func isStream() -> Bool { diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift index f41b7afbf..550f530e5 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift @@ -47,6 +47,7 @@ struct StreamConfigurationView: View { self.isEditable = isEditable || Defaults[.enableBetaFeature] #endif + service.invalidate() service.setupSubscribers() } diff --git a/Easydict/objc/ViewController/View/ResultView/EZResultView.m b/Easydict/objc/ViewController/View/ResultView/EZResultView.m index 2e32a18cc..120ed7df5 100644 --- a/Easydict/objc/ViewController/View/ResultView/EZResultView.m +++ b/Easydict/objc/ViewController/View/ResultView/EZResultView.m @@ -449,16 +449,9 @@ - (void)modelDidSelected:(NSMenuItem *)sender { if (![service.model isEqualToString:sender.title]) { service.model = sender.title; self.serviceModelButton.title = service.model; -// [self postServiceUpdatedNotification:service.serviceType]; } } -- (void)postServiceUpdatedNotification:(EZServiceType)serviceType { - NSDictionary *userInfo = @{EZServiceTypeKey : serviceType}; - NSNotification *notification = [NSNotification notificationWithName:EZServiceHasUpdatedNotification object:nil userInfo:userInfo]; - [[NSNotificationCenter defaultCenter] postNotification:notification]; -} - #pragma mark - Animation - (void)rotateArrowButton { From 0af9a9f0e5212e2d2bdf9731adb7d08c5fada279 Mon Sep 17 00:00:00 2001 From: tisfeng Date: Sun, 30 Jun 2024 16:38:41 +0800 Subject: [PATCH 08/21] perf: set defaultModels for OpenAI, Gemini and Built-in service --- .../Service/BuiltInAI/BuiltInAIService.swift | 86 ++++++++----------- .../CustomOpenAI/CustomOpenAIService.swift | 1 - .../Swift/Service/Gemini/GeminiService.swift | 6 +- .../LLMStreamService+Configuration.swift | 8 +- .../Service/OpenAI/LLMStreamService.swift | 39 ++++++--- .../Swift/Service/OpenAI/OpenAIService.swift | 4 +- 6 files changed, 75 insertions(+), 69 deletions(-) diff --git a/Easydict/Swift/Service/BuiltInAI/BuiltInAIService.swift b/Easydict/Swift/Service/BuiltInAI/BuiltInAIService.swift index fe0f878a4..3d392b89d 100644 --- a/Easydict/Swift/Service/BuiltInAI/BuiltInAIService.swift +++ b/Easydict/Swift/Service/BuiltInAI/BuiltInAIService.swift @@ -24,8 +24,6 @@ class BuiltInAIService: BaseOpenAIService { public override func configurationListItems() -> Any { StreamConfigurationView( service: self, -// viewModel: viewModel, - showNameSection: false, showAPIKeySection: false, showEndpointSection: false ) @@ -33,6 +31,40 @@ class BuiltInAIService: BaseOpenAIService { // MARK: Internal + override var defaultModels: [String] { + [ + // Groq free models https://console.groq.com/docs/models + "llama3-70b-8192", // 30 RPM + "mixtral-8x7b-32768", + + // Google Gemini https://ai.google.dev/pricing?hl=zh-cn + "gemini-1.0-pro", // free 15 RPM + "gemini-1.5-flash", // free 15 RPM + "gemini-1.5-pro", // free 15 RPM + + /** + 阿里通义千问 DashScope + + https://help.aliyun.com/zh/dashscope/developer-reference/tongyi-qianwen-7b-14b-72b-metering-and-billing + */ + "qwen1.5-32b-chat", // 有效期:2024-06-19,1,000,000 tokens 免费额度 + "qwen-turbo", // free total 2,000,000 tokens, until 8.12 + "baichuan2-13b-chat-v1", // free until 8.12, total 1,000,000 tokens + "deepseek-7b-chat", // 开通DashScope即获赠总计 1,000,000 tokens 限时免费使用额度,有效期180天。 + "internlm-7b-chat", // 开通DashScope即获赠总计 1,000,000 tokens 限时免费使用额度,有效期180天。 + + /** + 百度千帆大模型 + + 5月21日起,百度智能云千帆大模型平台ModelBuilder中ERNIE-Speed、ERNIE-Lite、ERNIE-Tiny系列模型Tokens后付费的服务对客户免费开放使用,具体包括ERNIE-Speed-8K、ERNIE-Speed-128K、ERNIE-Speed-AppBuilder专用版、ERNIE-Lite-8K、ERNIE-Lite-8K-0922、ERNIE-Lite-128K(即将上线)、ERNIE-Tiny共计7款模型的预置服务 + + https://cloud.baidu.com/doc/WENXINWORKSHOP/s/wlwg8f1i3 + */ + "ernie_speed", // ERNIE-Speed-8K, it has a higher RPM(300) than ERNIE-Speed-128K(RPM=60) + "ernie-lite-8k", + ] + } + override var apiKey: String { defaultAPIKey } @@ -40,54 +72,4 @@ class BuiltInAIService: BaseOpenAIService { override var endpoint: String { defaultEndpoint } - - override var model: String { - get { - var model = super.model - if model.isEmpty { - model = validModels.first! - } - return model - } - set { - super.model = newValue - } - } - - override var validModels: [String] { - get { - [ - // Groq free models https://console.groq.com/docs/models - "llama3-70b-8192", // 30 RPM - "mixtral-8x7b-32768", - - // Google Gemini https://ai.google.dev/pricing?hl=zh-cn - "gemini-1.0-pro", // free 15 RPM - "gemini-1.5-flash", // free 15 RPM - "gemini-1.5-pro", // free 15 RPM - - /** - 阿里通义千问 DashScope - - https://help.aliyun.com/zh/dashscope/developer-reference/tongyi-qianwen-7b-14b-72b-metering-and-billing - */ - "qwen1.5-32b-chat", // 有效期:2024-06-19,1,000,000 tokens 免费额度 - "qwen-turbo", // free total 2,000,000 tokens, until 8.12 - "baichuan2-13b-chat-v1", // free until 8.12, total 1,000,000 tokens - "deepseek-7b-chat", // 开通DashScope即获赠总计 1,000,000 tokens 限时免费使用额度,有效期180天。 - "internlm-7b-chat", // 开通DashScope即获赠总计 1,000,000 tokens 限时免费使用额度,有效期180天。 - - /** - 百度千帆大模型 - - 5月21日起,百度智能云千帆大模型平台ModelBuilder中ERNIE-Speed、ERNIE-Lite、ERNIE-Tiny系列模型Tokens后付费的服务对客户免费开放使用,具体包括ERNIE-Speed-8K、ERNIE-Speed-128K、ERNIE-Speed-AppBuilder专用版、ERNIE-Lite-8K、ERNIE-Lite-8K-0922、ERNIE-Lite-128K(即将上线)、ERNIE-Tiny共计7款模型的预置服务 - - https://cloud.baidu.com/doc/WENXINWORKSHOP/s/wlwg8f1i3 - */ - "ernie_speed", // ERNIE-Speed-8K, it has a higher RPM(300) than ERNIE-Speed-128K(RPM=60) - "ernie-lite-8k", - ] - } - set {} - } } diff --git a/Easydict/Swift/Service/CustomOpenAI/CustomOpenAIService.swift b/Easydict/Swift/Service/CustomOpenAI/CustomOpenAIService.swift index ef465da43..c5d9cf1ab 100644 --- a/Easydict/Swift/Service/CustomOpenAI/CustomOpenAIService.swift +++ b/Easydict/Swift/Service/CustomOpenAI/CustomOpenAIService.swift @@ -27,7 +27,6 @@ class CustomOpenAIService: BaseOpenAIService { override func configurationListItems() -> Any { StreamConfigurationView( service: self, -// viewModel: viewModel, showNameSection: true ) } diff --git a/Easydict/Swift/Service/Gemini/GeminiService.swift b/Easydict/Swift/Service/Gemini/GeminiService.swift index 7c321db11..af14ded17 100644 --- a/Easydict/Swift/Service/Gemini/GeminiService.swift +++ b/Easydict/Swift/Service/Gemini/GeminiService.swift @@ -116,6 +116,10 @@ public final class GeminiService: LLMStreamService { // MARK: Internal + override var defaultModels: [String] { + GeminiModel.allCases.map(\.rawValue) + } + // https://ai.google.dev/available_regions override var unsupportedLanguages: [Language] { [ @@ -175,9 +179,9 @@ enum GeminiModel: String, CaseIterable { // RPM: Requests per minute, TPM: Tokens per minute // RPD: Requests per day, TPD: Tokens per day - case gemini1_0_pro = "gemini-1.0-pro" // Free 15 RPM/32,000 TPM, 1,500 RPD/46,080,000 TPD (n/a context length) case gemini1_5_flash = "gemini-1.5-flash" // Free 15 RPM/100million TPM, 1500 RPD/ n/a TPD (1048k context length) case gemini1_5_pro = "gemini-1.5-pro" // Free 2 RPM/32,000 TPM, 50 RPD/46,080,000 TPD (1048k context length) + case gemini1_0_pro = "gemini-1.0-pro" // Free 15 RPM/32,000 TPM, 1,500 RPD/46,080,000 TPD (n/a context length) } // swiftlint:enable identifier_name diff --git a/Easydict/Swift/Service/OpenAI/LLMStreamService+Configuration.swift b/Easydict/Swift/Service/OpenAI/LLMStreamService+Configuration.swift index b250f3073..46ad5c579 100644 --- a/Easydict/Swift/Service/OpenAI/LLMStreamService+Configuration.swift +++ b/Easydict/Swift/Service/OpenAI/LLMStreamService+Configuration.swift @@ -67,8 +67,6 @@ extension LLMStreamService { } else if !validModels.contains(model) { model = validModels[0] } - - Defaults[validModelsKey] = validModels } func notifyServiceConfigurationChanged() { @@ -85,7 +83,11 @@ extension LLMStreamService { } func stringDefaultsKey(_ key: StoredKey) -> Defaults.Key { - defaultsKey(key, serviceType: serviceType(), defaultValue: "") + stringDefaultsKey(key, defaultValue: "") + } + + func stringDefaultsKey(_ key: StoredKey, defaultValue: String) -> Defaults.Key { + defaultsKey(key, serviceType: serviceType(), defaultValue: defaultValue) } func serviceDefaultsKey(_ key: StoredKey, defaultValue: T) -> Defaults.Key { diff --git a/Easydict/Swift/Service/OpenAI/LLMStreamService.swift b/Easydict/Swift/Service/OpenAI/LLMStreamService.swift index ca5bb74e8..c6f181835 100644 --- a/Easydict/Swift/Service/OpenAI/LLMStreamService.swift +++ b/Easydict/Swift/Service/OpenAI/LLMStreamService.swift @@ -79,39 +79,47 @@ public class LLMStreamService: QueryService, ObservableObject { var cancellables: Set = [] + var defaultModels: [String] { + [""] + } + var unsupportedLanguages: [Language] { [] } var model: String { - get { Defaults[modelKey] } - set { - if model != newValue { - Defaults[modelKey] = newValue + get { + var model = Defaults[modelKey] + if !validModels.contains(model) || model.isEmpty { + model = validModels.first ?? "" + Defaults[modelKey] = model } + return model + } + set { + Defaults[modelKey] = newValue } } var modelKey: Defaults.Key { - stringDefaultsKey(.model) + stringDefaultsKey(.model, defaultValue: defaultModels.first ?? "") } var supportedModels: String { get { Defaults[supportedModelsKey] } set { - if supportedModels != newValue { - Defaults[supportedModelsKey] = newValue - } + Defaults[supportedModelsKey] = newValue + Defaults[validModelsKey] = validModels(from: newValue) } } var supportedModelsKey: Defaults.Key { - stringDefaultsKey(.supportedModels) + stringDefaultsKey(.supportedModels, defaultValue: supportedModels(from: defaultModels)) } + /// Just getter, we should set supportedModels and get validModels. var validModels: [String] { - supportedModels.components(separatedBy: ",") - .map { $0.trim() }.filter { !$0.isEmpty } + Defaults[validModelsKey] } var validModelsKey: Defaults.Key<[String]> { @@ -154,6 +162,15 @@ public class LLMStreamService: QueryService, ObservableObject { serviceDefaultsKey(.serviceUsageStatus, defaultValue: .default) } + func validModels(from supportedModels: String) -> [String] { + supportedModels.components(separatedBy: ",") + .map { $0.trim() }.filter { !$0.isEmpty } + } + + func supportedModels(from validModels: [String]) -> String { + validModels.joined(separator: ", ") + } + /// Base on chat query, convert prompt dict to LLM service prompt model. func serviceChatMessageModels(_ chatQuery: ChatQueryParam) -> [Any] { diff --git a/Easydict/Swift/Service/OpenAI/OpenAIService.swift b/Easydict/Swift/Service/OpenAI/OpenAIService.swift index 15b198505..46a796a2b 100644 --- a/Easydict/Swift/Service/OpenAI/OpenAIService.swift +++ b/Easydict/Swift/Service/OpenAI/OpenAIService.swift @@ -29,7 +29,9 @@ class OpenAIService: BaseOpenAIService { // MARK: Internal - // TODO: We need to set default supportedModels for OpenAI + override var defaultModels: [String] { + OpenAIModel.allCases.map(\.rawValue) + } override var endpoint: String { super.endpoint.isEmpty ? "https://api.openai.com/v1/chat/completions" : super.endpoint From 18725e2dbef78aa010ce017f00c0fad67dea52ba Mon Sep 17 00:00:00 2001 From: tisfeng Date: Sun, 30 Jun 2024 22:32:54 +0800 Subject: [PATCH 09/21] refactor: rename enum OpenAIModel and GeminiModel, update gpt3_5_turbo to gpt_3_5_turbo --- Easydict/Swift/Service/Gemini/GeminiService.swift | 8 ++++---- Easydict/Swift/Service/OpenAI/OpenAIService.swift | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Easydict/Swift/Service/Gemini/GeminiService.swift b/Easydict/Swift/Service/Gemini/GeminiService.swift index af14ded17..0e46c7f37 100644 --- a/Easydict/Swift/Service/Gemini/GeminiService.swift +++ b/Easydict/Swift/Service/Gemini/GeminiService.swift @@ -48,7 +48,7 @@ public final class GeminiService: LLMStreamService { var systemInstruction: ModelContent? = try ModelContent(role: "system", systemPrompt) // !!!: gemini-1.0-pro model does not support system instruction https://github.com/google-gemini/generative-ai-python/issues/328 - if model == GeminiModel.gemini1_0_pro.rawValue { + if model == GeminiModel.gemini_1_0_pro.rawValue { systemInstruction = nil enableSystemPromptInChats = true } @@ -179,9 +179,9 @@ enum GeminiModel: String, CaseIterable { // RPM: Requests per minute, TPM: Tokens per minute // RPD: Requests per day, TPD: Tokens per day - case gemini1_5_flash = "gemini-1.5-flash" // Free 15 RPM/100million TPM, 1500 RPD/ n/a TPD (1048k context length) - case gemini1_5_pro = "gemini-1.5-pro" // Free 2 RPM/32,000 TPM, 50 RPD/46,080,000 TPD (1048k context length) - case gemini1_0_pro = "gemini-1.0-pro" // Free 15 RPM/32,000 TPM, 1,500 RPD/46,080,000 TPD (n/a context length) + case gemini_1_5_flash = "gemini-1.5-flash" // Free 15 RPM/100million TPM, 1500 RPD/ n/a TPD (1048k context length) + case gemini_1_5_pro = "gemini-1.5-pro" // Free 2 RPM/32,000 TPM, 50 RPD/46,080,000 TPD (1048k context length) + case gemini_1_0_pro = "gemini-1.0-pro" // Free 15 RPM/32,000 TPM, 1,500 RPD/46,080,000 TPD (n/a context length) } // swiftlint:enable identifier_name diff --git a/Easydict/Swift/Service/OpenAI/OpenAIService.swift b/Easydict/Swift/Service/OpenAI/OpenAIService.swift index 46a796a2b..44d1ce62b 100644 --- a/Easydict/Swift/Service/OpenAI/OpenAIService.swift +++ b/Easydict/Swift/Service/OpenAI/OpenAIService.swift @@ -48,9 +48,9 @@ class OpenAIService: BaseOpenAIService { enum OpenAIModel: String, CaseIterable { // Docs: https://platform.openai.com/docs/models - case gpt3_5_turbo = "gpt-3.5-turbo" // Currently points to gpt-3.5-turbo-0125. Input: $0.50 | Output: $1.50 (16k) - case gpt4_turbo = "gpt-4-turbo" // Currently points to gpt-4-turbo-2024-04-09. Input: $10 | Output: $30 (128k) - case gpt4o = "gpt-4o" // Currently points to gpt-4o-2024-05-13. Input: $5 | Output: $15 (128k context length) + case gpt_3_5_turbo = "gpt-3.5-turbo" // Currently points to gpt-3.5-turbo-0125. Input: $0.50 | Output: $1.50 (16k) + case gpt_4_turbo = "gpt-4-turbo" // Currently points to gpt-4-turbo-2024-04-09. Input: $10 | Output: $30 (128k) + case gpt_4o = "gpt-4o" // Currently points to gpt-4o-2024-05-13. Input: $5 | Output: $15 (128k context length) } // swiftlint:enable identifier_name From addfda37a08074da794dc136c886757289b672be Mon Sep 17 00:00:00 2001 From: tisfeng Date: Mon, 1 Jul 2024 23:49:17 +0800 Subject: [PATCH 10/21] fix: due to service memory leaks, multiple notifications are posted --- .../Service/OpenAI/BaseOpenAIService.swift | 5 +- .../LLMStreamService+Configuration.swift | 3 + .../Service/OpenAI/LLMStreamService.swift | 7 - .../StreamConfigurationView.swift | 6 - Easydict/objc/Service/Model/EZQueryService.m | 4 + .../EZBaseQueryViewController.m | 420 +++++++++--------- 6 files changed, 232 insertions(+), 213 deletions(-) diff --git a/Easydict/Swift/Service/OpenAI/BaseOpenAIService.swift b/Easydict/Swift/Service/OpenAI/BaseOpenAIService.swift index 4c1d5218c..7ee475ac2 100644 --- a/Easydict/Swift/Service/OpenAI/BaseOpenAIService.swift +++ b/Easydict/Swift/Service/OpenAI/BaseOpenAIService.swift @@ -52,8 +52,11 @@ public class BaseOpenAIService: LLMStreamService { let query = ChatQuery(messages: chatHistory, model: model, temperature: 0) let openAI = OpenAI(apiToken: apiKey) + // FIXME: It seems that `control` will cause a memory leak, but it is not clear how to solve it. + unowned let unownedControl = control + // TODO: refactor chatsStream with await - openAI.chatsStream(query: query, url: url, control: control) { [weak self] res in + openAI.chatsStream(query: query, url: url, control: unownedControl) { [weak self] res in guard let self else { return } switch res { diff --git a/Easydict/Swift/Service/OpenAI/LLMStreamService+Configuration.swift b/Easydict/Swift/Service/OpenAI/LLMStreamService+Configuration.swift index 46ad5c579..7baabb6f1 100644 --- a/Easydict/Swift/Service/OpenAI/LLMStreamService+Configuration.swift +++ b/Easydict/Swift/Service/OpenAI/LLMStreamService+Configuration.swift @@ -11,6 +11,8 @@ import Foundation extension LLMStreamService { func setupSubscribers() { + logInfo("setup subscribers") + Defaults.publisher(nameKey, options: []) .removeDuplicates() .throttle(for: 0.1, scheduler: DispatchQueue.main, latest: true) @@ -37,6 +39,7 @@ extension LLMStreamService { } func invalidate() { + logInfo("invalidate subscribers") cancellables.forEach { $0.cancel() } cancellables.removeAll() } diff --git a/Easydict/Swift/Service/OpenAI/LLMStreamService.swift b/Easydict/Swift/Service/OpenAI/LLMStreamService.swift index c6f181835..99c852aed 100644 --- a/Easydict/Swift/Service/OpenAI/LLMStreamService.swift +++ b/Easydict/Swift/Service/OpenAI/LLMStreamService.swift @@ -15,13 +15,6 @@ import Foundation @objcMembers @objc(EZLLMStreamService) public class LLMStreamService: QueryService, ObservableObject { - // MARK: Lifecycle - - public override init() { - super.init() - setupSubscribers() - } - // MARK: Public public override func isStream() -> Bool { diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift index 550f530e5..e4c383b33 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift @@ -46,9 +46,6 @@ struct StreamConfigurationView: View { #if DEBUG self.isEditable = isEditable || Defaults[.enableBetaFeature] #endif - - service.invalidate() - service.setupSubscribers() } // MARK: Internal @@ -144,8 +141,5 @@ struct StreamConfigurationView: View { ) } } - .onDisappear { - service.invalidate() - } } } diff --git a/Easydict/objc/Service/Model/EZQueryService.m b/Easydict/objc/Service/Model/EZQueryService.m index 2d69c2148..3d6de6d37 100644 --- a/Easydict/objc/Service/Model/EZQueryService.m +++ b/Easydict/objc/Service/Model/EZQueryService.m @@ -35,6 +35,10 @@ - (instancetype)init { return self; } +- (void)dealloc { + MMLogInfo(@"dealloc service: %@", self); +} + - (EZAudioPlayer *)audioPlayer { if (!_audioPlayer) { _audioPlayer = [[EZAudioPlayer alloc] init]; diff --git a/Easydict/objc/ViewController/Window/BaseQueryWindow/EZBaseQueryViewController.m b/Easydict/objc/ViewController/Window/BaseQueryWindow/EZBaseQueryViewController.m index 0adb856c5..3e6c349c8 100644 --- a/Easydict/objc/ViewController/Window/BaseQueryWindow/EZBaseQueryViewController.m +++ b/Easydict/objc/ViewController/Window/BaseQueryWindow/EZBaseQueryViewController.m @@ -112,13 +112,13 @@ - (void)loadView { - (void)viewDidLoad { [super viewDidLoad]; - + [self setupUI]; } - (void)viewWillAppear { [super viewWillAppear]; - + [EZLog logWindowAppear:self.windowType]; } @@ -126,30 +126,30 @@ - (void)viewWillAppear { - (void)setupData { self.queryModel = [[EZQueryModel alloc] init]; self.queryModel.queryViewHeight = [self miniQueryViewHeight]; - + self.detectManager = [EZDetectManager managerWithModel:self.queryModel]; - + [self setupServices:[self latestServices]]; [self resetQueryAndResults]; } - (void)setupUI { [self tableView]; - + [self updateWindowViewHeight]; - + mm_weakify(self); [self setResizeWindowBlock:^{ mm_strongify(self); - + // Avoid recycling call, resize window --> update window height --> resize window if (self.lockResizeWindow) { // MMLogInfo(@"lockResizeWindow"); return; } - + [self setNeedUpdateIframeHeightForAllResults]; - + [self reloadTableViewDataWithLock:NO completion:^{ // Update query view height manually, and update cell height. CGFloat queryViewHeight = [self.queryView heightOfQueryView]; @@ -158,37 +158,37 @@ - (void)setupUI { NSIndexSet *firstIndexSet = [NSIndexSet indexSetWithIndex:0]; [self.tableView noteHeightOfRowsWithIndexesChanged:firstIndexSet]; } - + [self updateWindowViewHeight]; }]; }]; - - + + NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; - + [defaultCenter addObserver:self selector:@selector(handleServiceUpdate:) name:EZServiceHasUpdatedNotification object:nil]; - + [defaultCenter addObserver:self selector:@selector(boundsDidChangeNotification:) name:NSViewBoundsDidChangeNotification object:[self.scrollView contentView]]; - + // ???: FIX [dcs_error] kDCSActiveDictionariesChangedDistributedNotification catched, but it seems does not work. [defaultCenter addObserver:self selector:@selector(activeDictionariesChanged:) name:kDCSActiveDictionariesChangedDistributedNotification object:nil]; - + [defaultCenter addObserverForName:NotificationName.didChangeFontSize object:nil queue:NSOperationQueue.mainQueue usingBlock:^(NSNotification *_Nonnull notification) { mm_strongify(self); [self reloadTableViewData:^{ [self updateAllResultCellHeight]; }]; }]; - + [defaultCenter addObserver:self selector:@selector(modifyLanduage:) name:NSNotification.languagePreferenceChanged object:nil]; } @@ -200,30 +200,32 @@ - (void)modifyLanduage:(NSNotification *)notification { - (void)setupServices:(NSArray *)allServices { NSMutableArray *serviceTypes = [NSMutableArray array]; NSMutableArray *services = [NSMutableArray array]; - + self.youdaoService = nil; EZServiceType defaultTTSServiceType = Configuration.shared.defaultTTSServiceType; - + for (EZQueryService *service in allServices) { if (service.enabled) { [self resetService:service]; - + [services addObject:service]; [serviceTypes addObject:service.serviceType]; + + [self trySetupSubscribersForService:service oldService:nil]; } - + EZServiceType serviceType = service.serviceType; if ([serviceType isEqualToString:EZServiceTypeYoudao]) { self.youdaoService = service; } - + if ([serviceType isEqualToString:defaultTTSServiceType]) { _defaultTTSService = service; } } self.services = services; self.serviceTypes = serviceTypes; - + self.audioPlayer = [[EZAudioPlayer alloc] init]; if (!self.youdaoService) { self.youdaoService = [self serviceWithType:EZServiceTypeYoudao]; @@ -232,7 +234,7 @@ - (void)setupServices:(NSArray *)allServices { - (void)dealloc { MMLogInfo(@"dealloc: %@", self); - + [[NSNotificationCenter defaultCenter] removeObserver:self]; } @@ -244,15 +246,15 @@ - (void)activeDictionariesChanged:(NSNotification *)notification { - (void)handleServiceUpdate:(NSNotification *)notification { NSDictionary *userInfo = notification.userInfo; - EZWindowType type = [userInfo[EZWindowTypeKey] integerValue]; + EZWindowType windowType = [userInfo[EZWindowTypeKey] integerValue]; NSString *serviceType = [notification.userInfo objectForKey:EZServiceTypeKey]; - MMLogInfo(@"Notify to update service: %@", serviceType); - + MMLogInfo(@"handle service update notification: %@, windowType: %ld", serviceType, windowType); + if ([serviceType length] != 0) { [self updateService:serviceType autoQuery:YES]; return; } - if (type == self.windowType || !userInfo) { + if (windowType == self.windowType || !userInfo) { [self resetAllCellWithServices:[self latestServices]]; } } @@ -270,7 +272,7 @@ - (NSScrollView *)scrollView { NSScrollView *scrollView = [[NSScrollView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:scrollView]; _scrollView = scrollView; - + scrollView.wantsLayer = YES; scrollView.layer.cornerRadius = EZCornerRadius_8; [scrollView excuteLight:^(NSScrollView *scrollView) { @@ -278,20 +280,20 @@ - (NSScrollView *)scrollView { } dark:^(NSScrollView *scrollView) { scrollView.backgroundColor = [NSColor ez_mainViewBgDarkColor]; }]; - + [scrollView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.view).offset(0); make.left.right.bottom.equalTo(self.view); - + CGSize miniWindowSize = [EZLayoutManager.shared minimumWindowSize:self.windowType]; make.width.mas_greaterThanOrEqualTo(miniWindowSize.width); make.height.mas_greaterThanOrEqualTo(miniWindowSize.height); }]; - + scrollView.hasVerticalScroller = YES; scrollView.verticalScroller.controlSize = NSControlSizeSmall; [scrollView setAutomaticallyAdjustsContentInsets:NO]; - + CGFloat bottomInset = EZHorizontalCellSpacing_10 - EZVerticalCellSpacing_7 / 2; scrollView.contentInsets = NSEdgeInsetsMake(0, 0, bottomInset, 0); } @@ -302,26 +304,26 @@ - (NSTableView *)tableView { if (!_tableView) { NSTableView *tableView = [[NSTableView alloc] initWithFrame:self.scrollView.bounds]; _tableView = tableView; - + [tableView excuteLight:^(NSTableView *tableView) { tableView.backgroundColor = [NSColor ez_mainViewBgLightColor]; } dark:^(NSTableView *tableView) { tableView.backgroundColor = [NSColor ez_mainViewBgDarkColor]; }]; - + tableView.style = NSTableViewStylePlain; - + NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:EZColumnId]; self.column = column; column.resizingMask = NSTableColumnUserResizingMask | NSTableColumnAutoresizingMask; [tableView addTableColumn:column]; - + tableView.delegate = self; tableView.dataSource = self; tableView.rowHeight = 40; [tableView setAutoresizesSubviews:YES]; [tableView setColumnAutoresizingStyle:NSTableViewUniformColumnAutoresizingStyle]; - + tableView.headerView = nil; tableView.intercellSpacing = CGSizeMake(2 * EZHorizontalCellSpacing_10, EZVerticalCellSpacing_7); tableView.gridColor = NSColor.clearColor; @@ -348,10 +350,10 @@ - (EZAudioPlayer *)audioPlayer { - (void)setInputText:(NSString *)inputText { // !!!: Rewrite property copy setter. Avoid text being affected. _inputText = [inputText copy]; - + self.queryModel.inputText = _inputText; - - + + [self updateQueryViewModelAndDetectedLanguage:self.queryModel]; } @@ -376,23 +378,23 @@ - (void)startQueryText:(NSString *)text { - (void)startQueryText:(NSString *)text actionType:(EZActionType)actionType { MMLogInfo(@"query actionType: %@", actionType); - + if (text.trim.length == 0) { MMLogWarn(@"query text is empty"); return; } - + self.inputText = text; self.queryModel.actionType = actionType; self.queryView.isTypingChinese = NO; - + if ([self handleEasydictScheme:text]) { return; } - + // Before starting new query, we should stop the previous query. [self.queryModel stopAllService]; - + // Close all resultView before querying new text. [self closeAllResultView:^{ self.inputText = text; @@ -406,28 +408,28 @@ - (BOOL)handleEasydictScheme:(NSString *)text { if (!isEasydictScheme) { return NO; } - + [self.schemeParser openURLScheme:text completion:^(BOOL isSuccess, NSString *_Nullable returnValue, NSString *_Nullable actionKey) { NSString *message = isSuccess ? @"Success" : @"Failed"; if (returnValue.length > 0) { message = returnValue; } - + [EZToast showToast:message]; - + if (!isSuccess) { return; } - + [self clearInput]; - + // If write, need to update. if (actionKey && [self.schemeParser isWriteActionKey:actionKey]) { // Besides current window, other pages need to be notified, such as the settings service page. [self postUpdateServiceNotification]; } }]; - + return YES; } @@ -439,70 +441,70 @@ - (void)postUpdateServiceNotification { - (void)startOCRImage:(NSImage *)image actionType:(EZActionType)actionType { MMLogInfo(@"start OCR Image: %@, actionType: %@", @(image.size), actionType); - + self.queryModel.OCRImage = image; self.queryModel.actionType = actionType; - + self.queryView.isTypingChinese = NO; [self.queryView startLoadingAnimation:YES]; - + // Hide previous tips view first. [self showTipsView:NO completion:nil]; - + mm_weakify(self); [self.detectManager ocrAndDetectText:^(EZQueryModel *_Nonnull queryModel, NSError *_Nullable error) { mm_strongify(self); // !!!: inputText should be used here, not queryText, queryText may be modified, such as easydict://query?text=xxx NSString *inputText = queryModel.inputText; MMLogInfo(@"ocr result: %@", inputText); - + NSDictionary *dict = @{ @"detectedLanguage" : queryModel.detectedLanguage, @"actionType" : actionType, }; [EZLog logEventWithName:@"ocr" parameters:dict]; - - + + if (actionType == EZActionTypeScreenshotOCR) { [inputText copyToPasteboardSafely]; - + dispatch_block_on_main_safely(^{ [EZToast showSuccessToast]; }); - + return; } - - + + if (actionType == EZActionTypeOCRQuery) { [self.queryView startLoadingAnimation:NO]; - + self.inputText = inputText; - + // Show detected language, even auto self.queryModel.showAutoLanguage = YES; - + [self updateQueryTextAndParagraphStyle:inputText actionType:actionType]; - + if (error) { NSString *errorMsg = [error localizedDescription]; self.queryView.alertText = errorMsg; return; } - + if (Configuration.shared.autoCopyOCRText) { [inputText copyToPasteboardSafely]; } - + [self.queryView highlightAllLinks]; - + if ([self.inputText isURL]) { // Append a whitespace to beautify the link. self.inputText = [self.inputText stringByAppendingString:@" "]; - + return; } - + BOOL autoSnipTranslate = Configuration.shared.autoQueryOCRText; if (autoSnipTranslate && queryModel.autoQuery) { [self startQueryText]; @@ -513,18 +515,18 @@ - (void)startOCRImage:(NSImage *)image actionType:(EZActionType)actionType { - (void)retryQuery { MMLogInfo(@"retry query"); - + [self.audioPlayer stop]; - + // Reset query view height. if (self.queryModel.OCRImage) { self.inputText = @""; } - + // Re-detect langauge when retry. self.queryModel.detectedLanguage = EZLanguageAuto; self.queryModel.needDetectLanguage = YES; - + [self closeAllResultView:^{ [self startQueryWithType:self.queryModel.actionType]; }]; @@ -535,7 +537,7 @@ - (void)focusInputTextView { if (self.queryView.window == self.baseQueryWindow) { // Need to activate the current application first. [NSApp activateIgnoringOtherApps:YES]; - + [self.baseQueryWindow makeFirstResponder:self.queryView.textView]; if (Configuration.shared.selectQueryTextWhenWindowActivate) { self.queryView.textView.selectedRange = NSMakeRange(0, self.inputText.length); @@ -548,20 +550,20 @@ - (void)clearInput { self.inputText = @""; self.queryModel.OCRImage = nil; [self.queryView setAlertTextHidden:YES]; - + [self.audioPlayer stop]; } - (void)clearAll { [self clearInput]; - + [self updateQueryCellWithCompletionHandler:^{ // !!!: To show closing animation, we cannot reset result directly. [self closeAllResultView:^{ [self resetQueryAndResults]; }]; }]; - + self.queryView.clearButtonHidden = YES; } @@ -594,22 +596,22 @@ - (void)togglePlayQueryText:(BOOL)play { [self.audioPlayer stop]; return; } - + void (^playAudioBlock)(void) = ^{ NSString *queryText = self.queryText; NSString *textLanguage = self.queryModel.queryFromLanguage; BOOL isEnglishWord = [queryText isEnglishWordWithLanguage:textLanguage]; - + // If query text is an English word, use Youdao TTS to play. EZQueryService *ttsService = isEnglishWord ? self.youdaoService : self.defaultTTSService; - + [self.audioPlayer playTextAudio:queryText language:textLanguage accent:nil audioURL:nil designatedService:ttsService]; }; - + // Before playing audio, we should detect the query text language. if (self.queryModel.hasQueryFromLanguage) { playAudioBlock(); @@ -630,7 +632,7 @@ - (void)stopAllResultAudio { - (void)updateQueryTextAndParagraphStyle:(NSString *)text actionType:(EZActionType)queryType { [self.queryView.textView updateTextAndParagraphStyle:text]; self.queryModel.actionType = queryType; - + if (text) { /** If user disabled auto query when getting selected text, we should close tips view after updating query text. @@ -652,20 +654,20 @@ - (void)showTipsView:(BOOL)isVisible { - (void)showTipsView:(BOOL)isVisible completion:(void (^)(void))completion { // when queryModel.queryText is Empty show tips - + if (!isVisible && !self.isTipsViewVisible) { if (completion) { completion(); } return; } - + self.isTipsViewVisible = isVisible; - + if (isVisible) { [self resetQueryAndResults]; } - + [self reloadTableViewData:completion]; } @@ -712,12 +714,12 @@ - (void)queryCurrentModel { MMLogWarn(@"query text is empty"); return; } - + MMLogInfo(@"query text: %@", self.queryText.truncated); - + // !!!: Reset all result before new query. [self resetAllResults]; - + if (self.queryModel.needDetectLanguage) { [self detectQueryText:^(NSString *_Nonnull language) { [self queryAllSerives:self.queryModel]; @@ -729,7 +731,7 @@ - (void)queryCurrentModel { - (void)queryAllSerives:(EZQueryModel *)queryModel { MMLogInfo(@"query: %@ --> %@", queryModel.queryFromLanguage, queryModel.queryTargetLanguage); - + self.firstService = nil; for (EZQueryService *service in self.services) { BOOL enableAutoQuery = service.enabledQuery && service.enabledAutoQuery && service.queryTextType != EZQueryTextTypeNone; @@ -737,17 +739,17 @@ - (void)queryAllSerives:(EZQueryModel *)queryModel { MMLogInfo(@"service disabled: %@", service.serviceType); continue; } - + [self queryWithModel:queryModel service:service]; - + if (!self.firstService) { self.firstService = service; [self autoCopyTranslatedTextOfService:service]; } } - + [[EZLocalStorage shared] increaseQueryCount:self.inputText]; - + // Auto play query text if it is an English word. [self autoPlayEnglishWordAudio]; } @@ -758,21 +760,21 @@ - (void)queryWithModel:(EZQueryModel *)queryModel service:(EZQueryService *)serv MMLogError(@"query error: %@", error); } result.error = [EZError errorWithNSError:error]; - + // Auto convert to traditional Chinese if needed. if (service.autoConvertTraditionalChinese && [self.queryModel.queryTargetLanguage isEqualToString:EZLanguageTraditionalChinese]) { [service.result convertToTraditionalChineseResult]; } - + BOOL hideResult = !result.manulShow && !result.hasTranslatedResult && result.isWarningErrorType; if (hideResult) { result.isShowing = NO; } - + // MMLogInfo(@"update service: %@, %@", service.serviceType, result); [self updateCellWithResult:result reloadData:YES]; - + if (service.autoCopyTranslatedTextBlock) { service.autoCopyTranslatedTextBlock(result, error); } @@ -791,19 +793,19 @@ - (void)queryWithModel:(EZQueryModel *)queryModel MMLogWarn(@"queryText is empty"); return; } - + // MMLogInfo(@"query service: %@", service.serviceType); - + EZQueryResult *result = service.result; - + // Show result if it has been queried. result.isShowing = YES; result.isLoading = YES; - + [self updateResultLoadingAnimation:result]; - + [service startQuery:queryModel completion:completion]; - + [EZLocalStorage.shared increaseQueryService:service]; } @@ -823,7 +825,7 @@ - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { // View-base 设置某个元素的具体视图 - (nullable NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(nullable NSTableColumn *)tableColumn row:(NSInteger)row { // MMLogInfo(@"tableView for row: %ld", row); - + if (row == 0) { self.queryView = [self createQueryView]; self.queryView.windowType = self.windowType; @@ -831,7 +833,7 @@ - (nullable NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(null self.queryView.queryModel = self.queryModel; return self.queryView; } - + if (self.windowType != EZWindowTypeMini && row == 1) { EZSelectLanguageCell *selectLanguageCell = [self.tableView makeViewWithIdentifier:EZSelectLanguageCellId owner:self]; if (!selectLanguageCell) { @@ -840,18 +842,18 @@ - (nullable NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(null } selectLanguageCell.queryModel = self.queryModel; self.selectLanguageCell = selectLanguageCell; - + mm_weakify(self); [selectLanguageCell setEnterActionBlock:^(EZLanguage _Nonnull from, EZLanguage _Nonnull to) { mm_strongify(self); self.queryModel.userSourceLanguage = from; self.queryModel.userTargetLanguage = to; - + [self retryQuery]; }]; return selectLanguageCell; } - + // show tips view if (row == 2 && self.isTipsViewVisible) { EZTableTipsCell *tipsCell = [self.tableView makeViewWithIdentifier:EZTableTipsCellId owner:self]; @@ -862,10 +864,10 @@ - (nullable NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(null self.tipsCell = tipsCell; return tipsCell; } - + EZResultView *resultCell = [self resultCellAtRow:row]; resultCell.windowType = self.windowType; - + return resultCell; } @@ -875,7 +877,7 @@ - (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger) - (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row { CGFloat height; - + if (row == 0) { height = self.queryModel.queryViewHeight; } else if (row == 1 && self.windowType != EZWindowTypeMini) { @@ -897,7 +899,7 @@ - (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row { } } // MMLogInfo(@"row: %ld, height: %@", row, @(height)); - + return height; } @@ -928,14 +930,14 @@ - (void)reloadTableViewDataWithLock:(BOOL)lockFlag completion:(void (^)(void))co completion(); } }]; - + [self.tableView reloadData]; [CATransaction commit]; } - (void)closeAllResultView:(void (^)(void))completionHandler { [self.queryModel stopAllService]; - + // !!!: Need to update all result cells, even it's not showing, it may show error image. NSArray *allResults = [self resetAllResults]; [self updateCellWithResults:allResults reloadData:YES completionHandler:completionHandler]; @@ -963,7 +965,7 @@ - (void)updateCellWithResults:(NSArray *)results reloadData:(BO isFinished = result.webViewManager.wordResultViewHeight > 0; } result.isLoading = !isFinished; - + NSIndexSet *indexSet = [self indexSetOfResult:result]; if (indexSet) { [rowIndexes addIndexes:indexSet]; @@ -988,19 +990,19 @@ - (void)updateTableViewRowIndexes:(NSIndexSet *)rowIndexes animate:(BOOL)animateFlag completionHandler:(void (^)(void))completionHandler { // MMLogInfo(@"updateTableViewRowIndexes: %@", rowIndexes); - + // !!!: Since the caller may be in non-main thread, we need to dispatch to main thread, but canont always use dispatch_async, it will cause the animation not smooth. dispatch_block_on_main_safely(^{ if (reloadData) { // !!!: Note: For NSView-based table views, this method drops the view-cells in the table row, but not the NSTableRowView instances. - + // ???: need to check. - + [self.tableView reloadDataForRowIndexes:rowIndexes columnIndexes:[NSIndexSet indexSetWithIndex:0]]; } - + CGFloat duration = animateFlag ? EZUpdateTableViewRowHeightAnimationDuration : 0; - + [NSAnimationContext runAnimationGroup:^(NSAnimationContext *_Nonnull context) { context.duration = duration; // !!!: Must first notify the update tableView cell height, and then calculate the tableView height. @@ -1039,7 +1041,7 @@ - (void)updateSelectLanguageCell { if (offset == 1) { return; } - + NSIndexSet *rowIndexes = [NSMutableIndexSet indexSetWithIndex:offset - 1]; [self.tableView reloadDataForRowIndexes:rowIndexes columnIndexes:[NSIndexSet indexSetWithIndex:0]]; } @@ -1095,14 +1097,14 @@ - (NSUInteger)rowIndexOfResult:(EZQueryResult *)result { - (void)resetCellWithService:(EZQueryService *)service autoQuery:(BOOL)autoQuery { [self resetService:service]; - + EZQueryResult *newResult = [service resetServiceResult]; - + [self updateCellWithResult:newResult reloadData:YES completionHandler:^{ if (autoQuery) { // Make enabledQuery = YES before retry, it may be closed manually. service.enabledQuery = YES; - + [self queryWithModel:self.queryModel service:service]; } }]; @@ -1120,6 +1122,7 @@ - (void)updateService:(NSString *)serviceType autoQuery:(BOOL)autoQuery { for (EZQueryService *service in self.services) { if (service.serviceType == serviceType) { EZQueryService *updatedService = [EZLocalStorage.shared service:serviceType windowType:self.windowType]; + [self trySetupSubscribersForService:updatedService oldService:service]; NSInteger index = [self.serviceTypes indexOfObject:serviceType]; newServices[index] = updatedService; self.services = newServices.copy; @@ -1141,11 +1144,30 @@ - (void)resetAllCellWithServices:(NSArray *)allServices { return [EZLocalStorage.shared allServices:self.windowType]; } +- (void)trySetupSubscribersForService:(EZQueryService *)service oldService:(nullable EZQueryService *)oldService { + // TODO: We should set subscribers when init EZLLMStreamService. + + /** + We only setup subscribers in query window, we do not need notification in other place when init(), like settings. + + When notify a service configuration changed, it will init a new service, this is bad. + But for some strange reason, the old service can not be deallocated, this will cause a memory leak, and we also need to cancel old services subscribers. + + These code are ugly, we should fix it later. + */ + + if ([service isKindOfClass:EZLLMStreamService.class]) { + [((EZLLMStreamService *)service) setupSubscribers]; + [((EZLLMStreamService *)oldService) invalidate]; + } +} + + #pragma mark - Update Data. - (void)resetQueryAndResults { [self resetAllResults]; - + if (self.inputText.length) { self.inputText = @""; } @@ -1165,7 +1187,7 @@ - (nullable EZResultView *)resultCellOfResult:(EZQueryResult *)result { if (index != NSNotFound) { NSInteger row = index + [self resultCellOffset]; EZResultView *resultCell = [[[self.tableView rowViewAtRow:row makeIfNecessary:NO] subviews] firstObject]; - + // ???: Why is it possible to return a EZSelectLanguageCell ? if ([resultCell isKindOfClass:[EZResultView class]]) { return resultCell; @@ -1192,19 +1214,19 @@ - (void)cancelDelayDetectQueryText { /// Detect query text, and update select language cell. - (void)detectQueryText:(nullable void (^)(NSString *language))completion { [self cancelDelayDetectQueryText]; - + [self.detectManager detectText:self.queryText completion:^(EZQueryModel *queryModel, NSError *error) { // `self.queryModel.detectedLanguage` has already been updated inside the method. - + // Show detected language button if has queryText, even detect language is auto. BOOL showAutoLanguage = YES; if (self.queryText.length == 0) { showAutoLanguage = NO; } self.queryModel.showAutoLanguage = showAutoLanguage; - + [self updateQueryViewModelAndDetectedLanguage:queryModel]; - + if (completion) { completion(queryModel.detectedLanguage); } @@ -1213,7 +1235,7 @@ - (void)detectQueryText:(nullable void (^)(NSString *language))completion { - (void)updateQueryViewModelAndDetectedLanguage:(EZQueryModel *)queryModel { self.queryView.clearButtonHidden = (queryModel.inputText.length == 0) && ([self allShowingResults].count == 0); - + self.queryView.queryModel = queryModel; [self updateQueryCell]; [self updateSelectLanguageCell]; @@ -1229,7 +1251,7 @@ - (NSArray *)allShowingResults { [results addObject:result]; } } - + return results; } @@ -1253,7 +1275,7 @@ - (void)setNeedUpdateIframeHeightForAllResults { - (void)disableReplaceTextButton { for (EZQueryService *service in self.services) { service.result.showReplaceButton = NO; - + EZResultView *resultView = [self resultCellOfResult:service.result]; resultView.wordResultView.replaceTextButton.enabled = NO; } @@ -1268,49 +1290,49 @@ - (EZQueryView *)createQueryView { queryView = [[EZQueryView alloc] initWithFrame:[self tableViewContentBounds]]; queryView.identifier = EZQueryViewId; } - + // placeholder, just for new user. NSString *placeholderText = NSLocalizedString(@"placeholder", nil); if (EZLocalStorage.shared.queryCount > 100) { placeholderText = @""; } queryView.placeholderText = placeholderText; - + queryView.audioButton.audioPlayer = self.audioPlayer; - + mm_weakify(self); [queryView setUpdateInputTextBlock:^(NSString *text, CGFloat queryViewHeight) { mm_strongify(self); // MMLogInfo(@"UpdateQueryTextBlock"); - + // !!!: The code here is a bit messy, so you need to be careful about changing it. - + // But, since there are cases where the query text is set manually, such as query selected text, where the query text is set first and then the input text is modified, the query cell must be updated for such cases. - + // Reduce the update frequency, update only when the queryText or height changes. if ([self.inputText isEqualToString:text] && self.queryModel.queryViewHeight == queryViewHeight) { return; } - + NSString *oldInputText = self.inputText; self.inputText = text; - + // Only detect when query text is changed. if (![self.inputText.trim isEqualToString:oldInputText.trim]) { [self delayDetectQueryText]; } - + self.queryModel.queryViewHeight = queryViewHeight; [self updateQueryCell]; }]; - + [queryView setEnterActionBlock:^(NSString *text) { mm_strongify(self); // tips view hidden once user tap entry self.isTipsViewVisible = NO; [self startQueryText:text]; }]; - + [queryView setPasteTextBlock:^(NSString *_Nonnull text) { mm_strongify(self); [self detectQueryText:^(NSString *_Nonnull language) { @@ -1319,35 +1341,35 @@ - (EZQueryView *)createQueryView { } }]; }]; - + [queryView setPlayAudioBlock:^(NSString *text) { mm_strongify(self); [self togglePlayQueryText]; }]; - + [queryView setCopyTextBlock:^(NSString *text) { [text copyAndShowToast:YES]; }]; - + [queryView setClearBlock:^(NSString *_Nonnull text) { mm_strongify(self); - + // Close tips view when user clicking clear button. self.isTipsViewVisible = NO; - + [self clearAll]; }]; - + [queryView setSelectedLanguageBlock:^(EZLanguage language) { mm_strongify(self); - + EZLanguage detectedLanguage = self.queryModel.detectedLanguage; if (![detectedLanguage isEqualToString:language]) { self.queryModel.detectedLanguage = language; [self retryQuery]; - + [self updateSelectLanguageCell]; - + NSDictionary *dict = @{ @"autoDetect" : detectedLanguage, @"userSelect" : language, @@ -1355,35 +1377,35 @@ - (EZQueryView *)createQueryView { [EZLog logEventWithName:@"change_detected_language" parameters:dict]; } }]; - + return queryView; } - (EZResultView *)resultCellAtRow:(NSInteger)row { EZQueryService *service = [self serviceAtRow:row]; EZResultView *resultCell = [self.tableView makeViewWithIdentifier:EZResultViewId owner:self]; - + if (!resultCell) { resultCell = [[EZResultView alloc] initWithFrame:[self tableViewContentBounds]]; resultCell.identifier = EZResultViewId; } - + EZQueryResult *result = service.result; resultCell.result = result; [self setupResultCell:resultCell]; - + WKWebView *webView = nil; if ([service.serviceType isEqualToString:EZServiceTypeAppleDictionary]) { EZAppleDictionary *appleDictService = (EZAppleDictionary *)service; - + EZWebViewManager *webViewManager = result.webViewManager; webView = webViewManager.webView; resultCell.wordResultView.webView = webView; - + BOOL needLoadHTML = result.isShowing && result.HTMLString.length && !webViewManager.isLoaded; if (needLoadHTML) { webViewManager.isLoaded = YES; - + NSURL *htmlFileURL = [NSURL fileURLWithPath:appleDictService.htmlFilePath]; webView.navigationDelegate = resultCell.wordResultView; [webView loadFileURL:htmlFileURL allowingReadAccessToURL:TTTDictionary.userDictionaryDirectoryURL]; @@ -1391,25 +1413,25 @@ - (EZResultView *)resultCellAtRow:(NSInteger)row { [webViewManager updateAllIframe]; } } - + return resultCell; } - (void)setupResultCell:(EZResultView *)resultView { EZQueryResult *result = resultView.result; EZQueryService *service = result.service; - + mm_weakify(self); [resultView setQueryTextBlock:^(NSString *_Nonnull word) { mm_strongify(self); [self startQueryText:word]; }]; - + [resultView setRetryBlock:^(EZQueryResult *result) { mm_strongify(self); [self resetCellWithService:service autoQuery:YES]; }]; - + // !!!: Avoid capture result, the block paramter result is different from former result. [resultView setClickArrowBlock:^(EZQueryResult *newResult) { mm_strongify(self); @@ -1417,9 +1439,9 @@ - (void)setupResultCell:(EZResultView *)resultView { if (!isShowing) { [newResult.service.audioPlayer stop]; } - + service.enabledQuery = isShowing; - + // If there is no result, try to query with current servie. if (isShowing && !newResult.hasShowingResult) { if (self.queryModel.needDetectLanguage) { @@ -1432,7 +1454,7 @@ - (void)setupResultCell:(EZResultView *)resultView { } else { // If alreay has result, just update cell. [self updateCellWithResult:newResult reloadData:YES]; - + // if hide result view, we need to notify to update reused cell height. if (!isShowing) { [self.tableView reloadData]; @@ -1457,11 +1479,11 @@ - (NSInteger)resultCellOffset { offset = 2; } } - + if (self.isTipsViewVisible) { offset += 1; } - + return offset; } @@ -1502,46 +1524,46 @@ - (void)updateWindowViewHeightWithLock:(BOOL)lockFlag if (lockFlag) { self.lockResizeWindow = YES; } - + // MMLogInfo(@"updateWindowViewHeightWithLock"); - + CGFloat tableViewHeight = [self getScrollViewContentHeight]; CGFloat height = [self getRestrainedScrollViewHeight:tableViewHeight]; // MMLogInfo(@"getRestrainedScrollViewHeight: %@", @(height)); - + CGSize maxWindowSize = [EZLayoutManager.shared maximumWindowSize:self.windowType]; - + CGFloat titleBarHeight = EZTitlebarHeight_28; // system title bar height is 28 - + CGFloat scrollViewHeight = height + self.scrollView.contentInsets.top + self.scrollView.contentInsets.bottom; scrollViewHeight = MIN(scrollViewHeight, maxWindowSize.height - titleBarHeight); - + // Diable change window height manually. [self.scrollView mas_updateConstraints:^(MASConstraintMaker *make) { make.height.mas_greaterThanOrEqualTo(scrollViewHeight); make.height.mas_lessThanOrEqualTo(scrollViewHeight); }]; - + CGFloat showingWindowHeight = scrollViewHeight + titleBarHeight; showingWindowHeight = MIN(showingWindowHeight, maxWindowSize.height); - + // Since chaneg height will cause position change, we need to adjust y to keep top-left coordinate position. NSWindow *window = self.view.window; - + CGFloat deltaHeight = window.height - showingWindowHeight; CGFloat y = window.y + deltaHeight; - + CGRect newFrame = CGRectMake(window.x, y, window.width, showingWindowHeight); CGRect safeFrame = [EZCoordinateUtils getSafeAreaFrame:newFrame inScreen:nil]; - + // ???: why set window frame will change tableView height? // ???: why this window animation will block cell rendering? // [self.window setFrame:safeFrame display:NO animate:animateFlag]; [self.baseQueryWindow setFrame:safeFrame display:NO]; - + // Restore tableView height. self.tableView.height = tableViewHeight; - + if (animateFlag) { // Animation cost time. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(EZUpdateTableViewRowHeightAnimationDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ @@ -1550,26 +1572,26 @@ - (void)updateWindowViewHeightWithLock:(BOOL)lockFlag } else { self.lockResizeWindow = NO; } - + // MMLogInfo(@"window frame: %@", @(window.frame)); } - (CGFloat)getRestrainedScrollViewHeight:(CGFloat)scrollViewContentHeight { CGFloat height = scrollViewContentHeight; - + CGSize minimumWindowSize = [EZLayoutManager.shared minimumWindowSize:self.windowType]; CGSize maximumWindowSize = [EZLayoutManager.shared maximumWindowSize:self.windowType]; - + height = MAX(height, minimumWindowSize.height); height = MIN(height, maximumWindowSize.height); - + return height; } /// Manually calculate tableView row height. - (CGFloat)getScrollViewContentHeight { CGFloat scrollViewContentHeight = 0; - + NSInteger rowCount = [self numberOfRowsInTableView:self.tableView]; for (int i = 0; i < rowCount; i++) { CGFloat rowHeight = [self tableView:self.tableView heightOfRow:i]; @@ -1577,8 +1599,8 @@ - (CGFloat)getScrollViewContentHeight { scrollViewContentHeight += (rowHeight + EZVerticalCellSpacing_7); } // MMLogInfo(@"scrollViewContentHeight: %.1f", scrollViewContentHeight); - - + + return scrollViewContentHeight; } @@ -1586,10 +1608,10 @@ - (CGFloat)getScrollViewContentHeight { - (CGFloat)getContentHeight { // Modify scrollView height to 0, to get actual tableView content height, avoid blank view. self.scrollView.height = 0; - + CGFloat documentViewHeight = self.scrollView.documentView.height; // actually is tableView height // MMLogInfo(@"documentView height: %@", @(documentViewHeight)); - + return documentViewHeight; } @@ -1605,12 +1627,12 @@ - (void)autoPlayEnglishWordAudio { if (!Configuration.shared.autoPlayAudio) { return; } - + BOOL isEnglishWord = [self.queryText isEnglishWordWithLanguage:self.queryModel.queryFromLanguage]; if (!isEnglishWord) { return; } - + MMLogInfo(@"Auto play English word audio: %@", self.queryText); [self togglePlayQueryText:YES]; } @@ -1623,13 +1645,13 @@ - (void)autoCopyTranslatedTextOfService:(EZQueryService *)service { service.autoCopyTranslatedTextBlock = nil; return; } - + [service setAutoCopyTranslatedTextBlock:^(EZQueryResult *result, NSError *error) { if (!result.HTMLString.length) { [result.copiedText copyToPasteboard]; return; } - + mm_weakify(result); [result setDidFinishLoadingHTMLBlock:^{ mm_strongify(result); From 0a0e388c0ea6f3d7cf359808653eede994a3010a Mon Sep 17 00:00:00 2001 From: tisfeng Date: Tue, 2 Jul 2024 23:12:27 +0800 Subject: [PATCH 11/21] fix: if main window dealloc, we need to setup subscribers again --- .../LLMStreamService+Configuration.swift | 21 +++---- .../Notification/Notification+Name.swift | 21 +++++++ Easydict/Swift/Utility/GlobalContext.swift | 2 + ...erviceConfigurationSecretSectionView.swift | 2 + .../SettingView/Tabs/TabView/ServiceTab.swift | 4 +- .../ViewController/Storage/EZLocalStorage.h | 1 + .../EZBaseQueryViewController.m | 62 ++++++++++++------- .../BaseQueryWindow/EZBaseQueryWindow.m | 9 ++- .../Window/WindowManager/EZWindowManager.m | 1 + 9 files changed, 85 insertions(+), 38 deletions(-) diff --git a/Easydict/Swift/Service/OpenAI/LLMStreamService+Configuration.swift b/Easydict/Swift/Service/OpenAI/LLMStreamService+Configuration.swift index 7baabb6f1..205c68d01 100644 --- a/Easydict/Swift/Service/OpenAI/LLMStreamService+Configuration.swift +++ b/Easydict/Swift/Service/OpenAI/LLMStreamService+Configuration.swift @@ -38,8 +38,8 @@ extension LLMStreamService { .store(in: &cancellables) } - func invalidate() { - logInfo("invalidate subscribers") + func cancelSubscribers() { + logInfo("cancel subscribers") cancellables.forEach { $0.cancel() } cancellables.removeAll() } @@ -59,7 +59,7 @@ extension LLMStreamService { } } } - notifyServiceConfigurationChanged() + notifyServiceConfigurationChanged(autoQuery: true) } func supportedModelsTextDidChanged(_ newSupportedModels: String) { @@ -72,17 +72,16 @@ extension LLMStreamService { } } - func notifyServiceConfigurationChanged() { + func notifyServiceConfigurationChanged(autoQuery: Bool = false) { objectWillChange.send() - logInfo("service config changed: \(serviceType().rawValue)") + logInfo("service config changed: \(serviceType().rawValue), windowType: \(windowType.rawValue)") - let userInfo: [String: Any] = [ - EZWindowTypeKey: windowType.rawValue, - EZServiceTypeKey: serviceType().rawValue, - ] - let notification = Notification(name: .serviceHasUpdated, object: nil, userInfo: userInfo) - NotificationCenter.default.post(notification) + NotificationCenter.default.postServiceUpdateNotification( + serviceType: serviceType(), + windowType: windowType, + autoQuery: autoQuery + ) } func stringDefaultsKey(_ key: StoredKey) -> Defaults.Key { diff --git a/Easydict/Swift/Utility/Extensions/Notification/Notification+Name.swift b/Easydict/Swift/Utility/Extensions/Notification/Notification+Name.swift index 83c897869..87ca45106 100644 --- a/Easydict/Swift/Utility/Extensions/Notification/Notification+Name.swift +++ b/Easydict/Swift/Utility/Extensions/Notification/Notification+Name.swift @@ -28,3 +28,24 @@ extension NSNotification { public static let linkButtonUpdated = Notification.Name.linkButtonUpdated } + +@objc +extension NotificationCenter { + func postServiceUpdateNotification( + serviceType: ServiceType = .init(rawValue: ""), + windowType: EZWindowType = .none, + autoQuery: Bool = false + ) { + let userInfo: [String: Any] = [ + EZServiceTypeKey: serviceType.rawValue, + EZWindowTypeKey: windowType.rawValue, + EZAutoQueryKey: autoQuery, + ] + let notification = Notification(name: .serviceHasUpdated, userInfo: userInfo) + post(notification) + } + + func postServiceUpdateNotification() { + postServiceUpdateNotification(autoQuery: false) + } +} diff --git a/Easydict/Swift/Utility/GlobalContext.swift b/Easydict/Swift/Utility/GlobalContext.swift index 3fbe43892..063996af5 100644 --- a/Easydict/Swift/Utility/GlobalContext.swift +++ b/Easydict/Swift/Utility/GlobalContext.swift @@ -45,6 +45,8 @@ class GlobalContext: NSObject { let updaterController: SPUStandardUpdaterController + var subscribeWindowType: EZWindowType = .none + // MARK: Private private let updaterHelper: SPUUpdaterHelper diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationSecretSectionView.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationSecretSectionView.swift index 77af50542..dc86dceee 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationSecretSectionView.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationSecretSectionView.swift @@ -119,6 +119,7 @@ private class ServiceValidationViewModel: ObservableObject { init(service: QueryService, observing keys: [Defaults.Key]) { self.service = service self.name = service.name() + // check secret key empty input Defaults.publisher(keys: keys) .throttle(for: 0.5, scheduler: DispatchQueue.main, latest: true) @@ -130,6 +131,7 @@ private class ServiceValidationViewModel: ObservableObject { self.isValidateBtnDisabled = hasEmptyInput } .store(in: &cancellables) + serviceUpdatePublisher .sink { [weak self] notification in self?.didReceive(notification) diff --git a/Easydict/Swift/View/SettingView/Tabs/TabView/ServiceTab.swift b/Easydict/Swift/View/SettingView/Tabs/TabView/ServiceTab.swift index 5dcd4404d..e6a606efa 100644 --- a/Easydict/Swift/View/SettingView/Tabs/TabView/ServiceTab.swift +++ b/Easydict/Swift/View/SettingView/Tabs/TabView/ServiceTab.swift @@ -104,9 +104,7 @@ private class ServiceTabViewModel: ObservableObject { } func postUpdateServiceNotification() { - let userInfo: [String: Any] = [EZWindowTypeKey: windowType.rawValue] - let notification = Notification(name: .serviceHasUpdated, object: nil, userInfo: userInfo) - NotificationCenter.default.post(notification) + NotificationCenter.default.postServiceUpdateNotification(windowType: windowType) } } diff --git a/Easydict/objc/ViewController/Storage/EZLocalStorage.h b/Easydict/objc/ViewController/Storage/EZLocalStorage.h index 96894fb65..7166f31a6 100644 --- a/Easydict/objc/ViewController/Storage/EZLocalStorage.h +++ b/Easydict/objc/ViewController/Storage/EZLocalStorage.h @@ -15,6 +15,7 @@ NS_ASSUME_NONNULL_BEGIN static NSString *const EZServiceHasUpdatedNotification = @"EZServiceHasUpdatedNotification"; static NSString *const EZWindowTypeKey = @"EZWindowTypeKey"; +static NSString *const EZAutoQueryKey = @"EZAutoQueryKey"; @interface EZLocalStorage : NSObject diff --git a/Easydict/objc/ViewController/Window/BaseQueryWindow/EZBaseQueryViewController.m b/Easydict/objc/ViewController/Window/BaseQueryWindow/EZBaseQueryViewController.m index 3e6c349c8..f09fdaa29 100644 --- a/Easydict/objc/ViewController/Window/BaseQueryWindow/EZBaseQueryViewController.m +++ b/Easydict/objc/ViewController/Window/BaseQueryWindow/EZBaseQueryViewController.m @@ -235,7 +235,8 @@ - (void)setupServices:(NSArray *)allServices { - (void)dealloc { MMLogInfo(@"dealloc: %@", self); - [[NSNotificationCenter defaultCenter] removeObserver:self]; + [NSNotificationCenter.defaultCenter removeObserver:self]; + [NSNotificationCenter.defaultCenter removeObserver:self name:NotificationName.didChangeFontSize object:nil]; } #pragma mark - NSNotificationCenter @@ -247,15 +248,27 @@ - (void)activeDictionariesChanged:(NSNotification *)notification { - (void)handleServiceUpdate:(NSNotification *)notification { NSDictionary *userInfo = notification.userInfo; EZWindowType windowType = [userInfo[EZWindowTypeKey] integerValue]; - NSString *serviceType = [notification.userInfo objectForKey:EZServiceTypeKey]; - MMLogInfo(@"handle service update notification: %@, windowType: %ld", serviceType, windowType); + NSString *serviceType = userInfo[EZServiceTypeKey]; + BOOL autoQuery = [userInfo[EZAutoQueryKey] boolValue]; + + MMLogInfo(@"handle service update notification: %@, userInfo: %@", serviceType, userInfo); + + // If window is deallocing, we should not continue to update. + if (GlobalContext.shared.subscribeWindowType == EZWindowTypeNone && self.windowType == EZWindowTypeMain) { + return; + } if ([serviceType length] != 0) { - [self updateService:serviceType autoQuery:YES]; + [self updateService:serviceType autoQuery:autoQuery]; return; } - if (windowType == self.windowType || !userInfo) { - [self resetAllCellWithServices:[self latestServices]]; + + if (!userInfo || windowType == self.windowType || windowType == EZWindowTypeNone) { + [self resetAllCellWithServices:[self latestServices] completion:^{ + if (autoQuery) { + [self queryCurrentModel]; + } + }]; } } @@ -426,19 +439,13 @@ - (BOOL)handleEasydictScheme:(NSString *)text { // If write, need to update. if (actionKey && [self.schemeParser isWriteActionKey:actionKey]) { // Besides current window, other pages need to be notified, such as the settings service page. - [self postUpdateServiceNotification]; + [NSNotificationCenter.defaultCenter postServiceUpdateNotification]; } }]; return YES; } -- (void)postUpdateServiceNotification { - // Need to update all types window. - NSNotification *notification = [NSNotification notificationWithName:EZServiceHasUpdatedNotification object:nil userInfo:nil]; - [[NSNotificationCenter defaultCenter] postNotification:notification]; -} - - (void)startOCRImage:(NSImage *)image actionType:(EZActionType)actionType { MMLogInfo(@"start OCR Image: %@, actionType: %@", @(image.size), actionType); @@ -1121,22 +1128,27 @@ - (void)updateService:(NSString *)serviceType autoQuery:(BOOL)autoQuery { NSMutableArray *newServices = [self.services mutableCopy]; for (EZQueryService *service in self.services) { if (service.serviceType == serviceType) { + if (!autoQuery) { + [self updateCellWithResult:service.result reloadData:YES completionHandler:nil]; + return; + } + EZQueryService *updatedService = [EZLocalStorage.shared service:serviceType windowType:self.windowType]; [self trySetupSubscribersForService:updatedService oldService:service]; NSInteger index = [self.serviceTypes indexOfObject:serviceType]; newServices[index] = updatedService; self.services = newServices.copy; - if (autoQuery) { - [self resetCellWithService:updatedService autoQuery:autoQuery]; - } - break; + + [self resetCellWithService:updatedService autoQuery:autoQuery]; + + return; } } } -- (void)resetAllCellWithServices:(NSArray *)allServices { +- (void)resetAllCellWithServices:(NSArray *)allServices completion:(void (^)(void))completion { [self setupServices:allServices]; - [self reloadTableViewData:nil]; + [self reloadTableViewData:completion]; } /// Get latest services from local storage. @@ -1148,17 +1160,21 @@ - (void)trySetupSubscribersForService:(EZQueryService *)service oldService:(null // TODO: We should set subscribers when init EZLLMStreamService. /** - We only setup subscribers in query window, we do not need notification in other place when init(), like settings. + We only setup subscribers in `one` query window, we do not need extra notification in other place when init(), like settings. When notify a service configuration changed, it will init a new service, this is bad. But for some strange reason, the old service can not be deallocated, this will cause a memory leak, and we also need to cancel old services subscribers. - These code are ugly, we should fix it later. + This code is so ugly, we should fix it later. */ - if ([service isKindOfClass:EZLLMStreamService.class]) { + BOOL enableSubscribe = GlobalContext.shared.subscribeWindowType == EZWindowTypeNone || GlobalContext.shared.subscribeWindowType == self.windowType; + + if ([service isKindOfClass:EZLLMStreamService.class] && enableSubscribe) { [((EZLLMStreamService *)service) setupSubscribers]; - [((EZLLMStreamService *)oldService) invalidate]; + [((EZLLMStreamService *)oldService) cancelSubscribers]; + + GlobalContext.shared.subscribeWindowType = self.windowType; } } diff --git a/Easydict/objc/ViewController/Window/BaseQueryWindow/EZBaseQueryWindow.m b/Easydict/objc/ViewController/Window/BaseQueryWindow/EZBaseQueryWindow.m index 7af33c460..a74424024 100644 --- a/Easydict/objc/ViewController/Window/BaseQueryWindow/EZBaseQueryWindow.m +++ b/Easydict/objc/ViewController/Window/BaseQueryWindow/EZBaseQueryWindow.m @@ -104,7 +104,14 @@ - (NSTimeInterval)animationResizeTime:(NSRect)newFrame { - (void)dealloc { - MMLogInfo(@"dealloc: %@", self); + MMLogInfo(@"dealloc query window: %@", self); + + // We should reset subscribeWindowType when query window dealloc. + if (GlobalContext.shared.subscribeWindowType == self.windowType) { + GlobalContext.shared.subscribeWindowType = EZWindowTypeNone; + + [NSNotificationCenter.defaultCenter postServiceUpdateNotification]; + } } #pragma mark - NSWindowDelegate, NSNotification diff --git a/Easydict/objc/ViewController/Window/WindowManager/EZWindowManager.m b/Easydict/objc/ViewController/Window/WindowManager/EZWindowManager.m index 62baf1ad2..fcfe99ff5 100644 --- a/Easydict/objc/ViewController/Window/WindowManager/EZWindowManager.m +++ b/Easydict/objc/ViewController/Window/WindowManager/EZWindowManager.m @@ -689,6 +689,7 @@ - (void)destroyMainWindow { if ([EZMainQueryWindow isAlive]) { [EZMainQueryWindow destroySharedInstance]; + _mainWindow = nil; } } From c70e01cf9dc7770e3dd5fc9216944765a4e566cf Mon Sep 17 00:00:00 2001 From: tisfeng Date: Wed, 3 Jul 2024 18:41:03 +0800 Subject: [PATCH 12/21] fix: improve Gemini error message for empty model --- Easydict/Swift/Service/Gemini/GeminiService.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Easydict/Swift/Service/Gemini/GeminiService.swift b/Easydict/Swift/Service/Gemini/GeminiService.swift index 0e46c7f37..48a264012 100644 --- a/Easydict/Swift/Service/Gemini/GeminiService.swift +++ b/Easydict/Swift/Service/Gemini/GeminiService.swift @@ -34,6 +34,12 @@ public final class GeminiService: LLMStreamService { to: Language, completion: @escaping (EZQueryResult, Error?) -> () ) { + if model.isEmpty { + let emptyModelError = EZError(type: .param, description: "model is empty") + completion(result, emptyModelError) + return + } + let queryType = queryType(text: text, from: from, to: to) Task { From fcc107283e9223098ac7f7e23c9fc49db3aaf068 Mon Sep 17 00:00:00 2001 From: tisfeng Date: Wed, 3 Jul 2024 20:18:04 +0800 Subject: [PATCH 13/21] fix: replace validation viewModel @StateObject with @ObservedObject --- .../ServiceConfigurationSecretSectionView.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationSecretSectionView.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationSecretSectionView.swift index dc86dceee..7888c4bdc 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationSecretSectionView.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ServiceConfigurationSecretSectionView.swift @@ -22,10 +22,10 @@ struct ServiceConfigurationSecretSectionView: View { ) { self.service = service self.content = content() - self._viewModel = StateObject(wrappedValue: ServiceValidationViewModel( + self.viewModel = ServiceValidationViewModel( service: service, observing: observeKeys - )) + ) } // MARK: Internal @@ -107,7 +107,7 @@ struct ServiceConfigurationSecretSectionView: View { // MARK: Private - @StateObject private var viewModel: ServiceValidationViewModel + @ObservedObject private var viewModel: ServiceValidationViewModel } // MARK: - ServiceValidationViewModel From 4f9f835eb6af6a5632f1aa940ad26709013d4302 Mon Sep 17 00:00:00 2001 From: tisfeng Date: Wed, 3 Jul 2024 22:14:54 +0800 Subject: [PATCH 14/21] refactor: improve Gemini translate() --- .../Swift/Service/Gemini/GeminiService.swift | 117 ++++++++++-------- 1 file changed, 63 insertions(+), 54 deletions(-) diff --git a/Easydict/Swift/Service/Gemini/GeminiService.swift b/Easydict/Swift/Service/Gemini/GeminiService.swift index 48a264012..f86c6863d 100644 --- a/Easydict/Swift/Service/Gemini/GeminiService.swift +++ b/Easydict/Swift/Service/Gemini/GeminiService.swift @@ -40,8 +40,71 @@ public final class GeminiService: LLMStreamService { return } + performTranslationTask(text: text, from: from, to: to, completion: completion) + } + + public override func configurationListItems() -> Any { + StreamConfigurationView( + service: self, + showEndpointSection: false + ) + } + + // MARK: Internal + + override var defaultModels: [String] { + GeminiModel.allCases.map(\.rawValue) + } + + // https://ai.google.dev/available_regions + override var unsupportedLanguages: [Language] { + [ + .persian, + .filipino, + .khmer, + .lao, + .malay, + .mongolian, + .burmese, + .telugu, + .tamil, + .urdu, + ] + } + + override func serviceChatMessageModels(_ chatQuery: ChatQueryParam) -> [Any] { + var chatModels: [ModelContent] = [] + for prompt in chatMessageDicts(chatQuery) { + if let openAIRole = prompt["role"], + let parts = prompt["content"] { + let role = getGeminiRole(from: openAIRole) + let chat = ModelContent(role: role, parts: parts) + chatModels.append(chat) + } + } + return chatModels + } + + // MARK: Private + + // Set Gemini safety level to BLOCK_NONE + private let blockNoneSettings = [ + SafetySetting(harmCategory: .harassment, threshold: .blockNone), + SafetySetting(harmCategory: .hateSpeech, threshold: .blockNone), + SafetySetting(harmCategory: .sexuallyExplicit, threshold: .blockNone), + SafetySetting(harmCategory: .dangerousContent, threshold: .blockNone), + ] + + private func performTranslationTask( + text: String, + from: Language, + to: Language, + completion: @escaping (EZQueryResult, Error?) -> () + ) { let queryType = queryType(text: text, from: from, to: to) + // Gemini Docs: https://github.com/google/generative-ai-swift + Task { do { result.isStreamFinished = false @@ -79,8 +142,6 @@ public final class GeminiService: LLMStreamService { var resultText = "" - // Gemini Docs: https://github.com/google/generative-ai-swift - let outputContentStream = model.generateContentStream(chatHistory) for try await outputContent in outputContentStream { guard let line = outputContent.text else { @@ -113,58 +174,6 @@ public final class GeminiService: LLMStreamService { } } - public override func configurationListItems() -> Any { - StreamConfigurationView( - service: self, - showEndpointSection: false - ) - } - - // MARK: Internal - - override var defaultModels: [String] { - GeminiModel.allCases.map(\.rawValue) - } - - // https://ai.google.dev/available_regions - override var unsupportedLanguages: [Language] { - [ - .persian, - .filipino, - .khmer, - .lao, - .malay, - .mongolian, - .burmese, - .telugu, - .tamil, - .urdu, - ] - } - - override func serviceChatMessageModels(_ chatQuery: ChatQueryParam) -> [Any] { - var chatModels: [ModelContent] = [] - for prompt in chatMessageDicts(chatQuery) { - if let openAIRole = prompt["role"], - let parts = prompt["content"] { - let role = getGeminiRole(from: openAIRole) - let chat = ModelContent(role: role, parts: parts) - chatModels.append(chat) - } - } - return chatModels - } - - // MARK: Private - - // Set Gemini safety level to BLOCK_NONE - private let blockNoneSettings = [ - SafetySetting(harmCategory: .harassment, threshold: .blockNone), - SafetySetting(harmCategory: .hateSpeech, threshold: .blockNone), - SafetySetting(harmCategory: .sexuallyExplicit, threshold: .blockNone), - SafetySetting(harmCategory: .dangerousContent, threshold: .blockNone), - ] - /// Get gemini role, currently only support "user" and "model", "model" is equal to OpenAI "assistant". https://ai.google.dev/gemini-api/docs/get-started/tutorial?lang=swift&hl=zh-cn#multi-turn-conversations-chat private func getGeminiRole(from openAIRole: String) -> String { if openAIRole == "assistant" { From 998103d6f1a350941cbef1a6c2063bdac1d88122 Mon Sep 17 00:00:00 2001 From: tisfeng Date: Wed, 3 Jul 2024 23:09:53 +0800 Subject: [PATCH 15/21] fix: Gemini and Built-in service cannot validate --- Easydict.xcodeproj/project.pbxproj | 2 +- Easydict/Swift/Service/BuiltInAI/BuiltInAIService.swift | 4 ++++ Easydict/Swift/Service/Gemini/GeminiService.swift | 4 ++++ Easydict/Swift/Service/OpenAI/LLMStreamService.swift | 9 +++++++++ .../ConfigurationView/StreamConfigurationView.swift | 6 +----- 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/Easydict.xcodeproj/project.pbxproj b/Easydict.xcodeproj/project.pbxproj index 04a94bfd2..529e81431 100644 --- a/Easydict.xcodeproj/project.pbxproj +++ b/Easydict.xcodeproj/project.pbxproj @@ -1198,9 +1198,9 @@ 03779F0D2BB256A7008D3C42 /* OpenAI */, 036D627F2BCAB5C6002C95C7 /* BuiltInAI */, 0A9AFBA92B7F8D6A0064C9A8 /* CustomOpenAI */, + C415C0AB2B450C4500A9D231 /* Gemini */, C4DD01E72B12B3B00025EE8E /* Tencent */, 2746AEBF2AF95040005FE0A1 /* Caiyun */, - C415C0AB2B450C4500A9D231 /* Gemini */, 62E2BF462B4082BA00E42D38 /* Ali */, ); path = Service; diff --git a/Easydict/Swift/Service/BuiltInAI/BuiltInAIService.swift b/Easydict/Swift/Service/BuiltInAI/BuiltInAIService.swift index 3d392b89d..89233e9ca 100644 --- a/Easydict/Swift/Service/BuiltInAI/BuiltInAIService.swift +++ b/Easydict/Swift/Service/BuiltInAI/BuiltInAIService.swift @@ -72,4 +72,8 @@ class BuiltInAIService: BaseOpenAIService { override var endpoint: String { defaultEndpoint } + + override var observeKeys: [Defaults.Key] { + [supportedModelsKey] + } } diff --git a/Easydict/Swift/Service/Gemini/GeminiService.swift b/Easydict/Swift/Service/Gemini/GeminiService.swift index f86c6863d..3f9015d50 100644 --- a/Easydict/Swift/Service/Gemini/GeminiService.swift +++ b/Easydict/Swift/Service/Gemini/GeminiService.swift @@ -56,6 +56,10 @@ public final class GeminiService: LLMStreamService { GeminiModel.allCases.map(\.rawValue) } + override var observeKeys: [Defaults.Key] { + [apiKeyKey, supportedModelsKey] + } + // https://ai.google.dev/available_regions override var unsupportedLanguages: [Language] { [ diff --git a/Easydict/Swift/Service/OpenAI/LLMStreamService.swift b/Easydict/Swift/Service/OpenAI/LLMStreamService.swift index 99c852aed..158f8e807 100644 --- a/Easydict/Swift/Service/OpenAI/LLMStreamService.swift +++ b/Easydict/Swift/Service/OpenAI/LLMStreamService.swift @@ -151,6 +151,15 @@ public class LLMStreamService: QueryService, ObservableObject { stringDefaultsKey(.dictionary) } + // In general, LLM services need to observe these keys to enable validation button. + var observeKeys: [Defaults.Key] { + [ + apiKeyKey, + endpointKey, + supportedModelsKey, + ] + } + var serviceUsageStatusKey: Defaults.Key { serviceDefaultsKey(.serviceUsageStatus, defaultValue: .default) } diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift index e4c383b33..367d719cb 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift @@ -67,11 +67,7 @@ struct StreamConfigurationView: View { var body: some View { ServiceConfigurationSecretSectionView( service: service, - observeKeys: [ - service.apiKeyKey, - service.endpointKey, - service.supportedModelsKey, - ] + observeKeys: service.observeKeys ) { if showNameSection { ServiceConfigurationInputCell( From 48f58d4cfbcbda4a1094754f58b431262ebbea64 Mon Sep 17 00:00:00 2001 From: tisfeng Date: Thu, 4 Jul 2024 16:33:08 +0800 Subject: [PATCH 16/21] fix: show different api key placeholders --- Easydict/App/Localizable.xcstrings | 35 ++++++++----------- .../Service/OpenAI/LLMStreamService.swift | 9 +++-- .../Swift/Service/OpenAI/OpenAIService.swift | 5 +++ .../StreamConfigurationView.swift | 2 +- 4 files changed, 27 insertions(+), 24 deletions(-) diff --git a/Easydict/App/Localizable.xcstrings b/Easydict/App/Localizable.xcstrings index bfbd48eb2..e011c6749 100644 --- a/Easydict/App/Localizable.xcstrings +++ b/Easydict/App/Localizable.xcstrings @@ -11,6 +11,16 @@ } } }, + "%@ API Key" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ API Key" + } + } + } + }, "about" : { "comment" : "about", "localizations" : { @@ -2405,7 +2415,7 @@ "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "完整接口地址" + "value" : "API 请求地址" } } } @@ -2442,23 +2452,6 @@ } } }, - "service.configuration.gemini.api_key.placeholder" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "xxxxxxxxxxxxx" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "xxxxxxxxxxxxx" - } - } - } - }, "service.configuration.input.placeholder" : { "localizations" : { "en" : { @@ -2544,13 +2537,13 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "https://api.openai.com/v1/chat/completions" + "value" : "The full request URL, for example https://api.openai.com/v1/chat/completions" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "https://api.openai.com/v1/chat/completions" + "value" : "完整请求 URL,例如 https://api.openai.com/v1/chat/completions" } } } @@ -2566,7 +2559,7 @@ "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "完整接口地址" + "value" : "API 请求地址" } } } diff --git a/Easydict/Swift/Service/OpenAI/LLMStreamService.swift b/Easydict/Swift/Service/OpenAI/LLMStreamService.swift index 158f8e807..32df50fff 100644 --- a/Easydict/Swift/Service/OpenAI/LLMStreamService.swift +++ b/Easydict/Swift/Service/OpenAI/LLMStreamService.swift @@ -9,6 +9,7 @@ import Combine import Defaults import Foundation +import SwiftUI // MARK: - LLMStreamService @@ -151,6 +152,10 @@ public class LLMStreamService: QueryService, ObservableObject { stringDefaultsKey(.dictionary) } + var serviceUsageStatusKey: Defaults.Key { + serviceDefaultsKey(.serviceUsageStatus, defaultValue: .default) + } + // In general, LLM services need to observe these keys to enable validation button. var observeKeys: [Defaults.Key] { [ @@ -160,8 +165,8 @@ public class LLMStreamService: QueryService, ObservableObject { ] } - var serviceUsageStatusKey: Defaults.Key { - serviceDefaultsKey(.serviceUsageStatus, defaultValue: .default) + var apiKeyPlaceholder: LocalizedStringKey { + "\(serviceType().rawValue) API Key" } func validModels(from supportedModels: String) -> [String] { diff --git a/Easydict/Swift/Service/OpenAI/OpenAIService.swift b/Easydict/Swift/Service/OpenAI/OpenAIService.swift index 44d1ce62b..c75d5c7e1 100644 --- a/Easydict/Swift/Service/OpenAI/OpenAIService.swift +++ b/Easydict/Swift/Service/OpenAI/OpenAIService.swift @@ -8,6 +8,7 @@ import Defaults import Foundation +import SwiftUI // MARK: - OpenAIService @@ -37,6 +38,10 @@ class OpenAIService: BaseOpenAIService { super.endpoint.isEmpty ? "https://api.openai.com/v1/chat/completions" : super.endpoint } + override var apiKeyPlaceholder: LocalizedStringKey { + "service.configuration.openai.api_key.placeholder" + } + override func configurationListItems() -> Any { StreamConfigurationView(service: self) } diff --git a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift index 367d719cb..aa4535592 100644 --- a/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift +++ b/Easydict/Swift/View/SettingView/Tabs/ServiceConfigurationView/ConfigurationView/StreamConfigurationView.swift @@ -82,7 +82,7 @@ struct StreamConfigurationView: View { ServiceConfigurationSecureInputCell( textFieldTitleKey: "service.configuration.openai.api_key.title", key: service.apiKeyKey, - placeholder: "service.configuration.openai.api_key.placeholder" + placeholder: service.apiKeyPlaceholder ) } From 58eb633ae00afb0cb9d8d269982888300eb4253f Mon Sep 17 00:00:00 2001 From: tisfeng Date: Thu, 4 Jul 2024 20:17:50 +0800 Subject: [PATCH 17/21] fix: remove unused ObservableObject --- .../Swift/Service/OpenAI/LLMStreamService+Configuration.swift | 2 -- Easydict/Swift/Service/OpenAI/LLMStreamService.swift | 4 +++- Easydict/objc/Service/Model/EZQueryService.h | 2 -- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Easydict/Swift/Service/OpenAI/LLMStreamService+Configuration.swift b/Easydict/Swift/Service/OpenAI/LLMStreamService+Configuration.swift index 205c68d01..4a8d1be00 100644 --- a/Easydict/Swift/Service/OpenAI/LLMStreamService+Configuration.swift +++ b/Easydict/Swift/Service/OpenAI/LLMStreamService+Configuration.swift @@ -73,8 +73,6 @@ extension LLMStreamService { } func notifyServiceConfigurationChanged(autoQuery: Bool = false) { - objectWillChange.send() - logInfo("service config changed: \(serviceType().rawValue), windowType: \(windowType.rawValue)") NotificationCenter.default.postServiceUpdateNotification( diff --git a/Easydict/Swift/Service/OpenAI/LLMStreamService.swift b/Easydict/Swift/Service/OpenAI/LLMStreamService.swift index 32df50fff..5e3eb197e 100644 --- a/Easydict/Swift/Service/OpenAI/LLMStreamService.swift +++ b/Easydict/Swift/Service/OpenAI/LLMStreamService.swift @@ -13,9 +13,11 @@ import SwiftUI // MARK: - LLMStreamService +// import SwiftUI + @objcMembers @objc(EZLLMStreamService) -public class LLMStreamService: QueryService, ObservableObject { +public class LLMStreamService: QueryService { // MARK: Public public override func isStream() -> Bool { diff --git a/Easydict/objc/Service/Model/EZQueryService.h b/Easydict/objc/Service/Model/EZQueryService.h index 9206e6acb..0345c377e 100644 --- a/Easydict/objc/Service/Model/EZQueryService.h +++ b/Easydict/objc/Service/Model/EZQueryService.h @@ -40,8 +40,6 @@ NS_SWIFT_NAME(QueryService) @property (nonatomic, copy, nullable) void (^autoCopyTranslatedTextBlock)(EZQueryResult *result, NSError *_Nullable error); -//@property (nonatomic, strong) id viewModel; - /// 支持的语言 - (NSArray *)languages; From cabdad6d4c9e484bc11b22d0b122f315e533409b Mon Sep 17 00:00:00 2001 From: tisfeng Date: Thu, 4 Jul 2024 20:18:40 +0800 Subject: [PATCH 18/21] style: format code --- .../EZBaseQueryViewController.m | 450 +++++++++--------- .../BaseQueryWindow/EZBaseQueryWindow.m | 14 +- 2 files changed, 232 insertions(+), 232 deletions(-) diff --git a/Easydict/objc/ViewController/Window/BaseQueryWindow/EZBaseQueryViewController.m b/Easydict/objc/ViewController/Window/BaseQueryWindow/EZBaseQueryViewController.m index f09fdaa29..0bcf5ed77 100644 --- a/Easydict/objc/ViewController/Window/BaseQueryWindow/EZBaseQueryViewController.m +++ b/Easydict/objc/ViewController/Window/BaseQueryWindow/EZBaseQueryViewController.m @@ -112,13 +112,13 @@ - (void)loadView { - (void)viewDidLoad { [super viewDidLoad]; - + [self setupUI]; } - (void)viewWillAppear { [super viewWillAppear]; - + [EZLog logWindowAppear:self.windowType]; } @@ -126,30 +126,30 @@ - (void)viewWillAppear { - (void)setupData { self.queryModel = [[EZQueryModel alloc] init]; self.queryModel.queryViewHeight = [self miniQueryViewHeight]; - + self.detectManager = [EZDetectManager managerWithModel:self.queryModel]; - + [self setupServices:[self latestServices]]; [self resetQueryAndResults]; } - (void)setupUI { [self tableView]; - + [self updateWindowViewHeight]; - + mm_weakify(self); [self setResizeWindowBlock:^{ mm_strongify(self); - + // Avoid recycling call, resize window --> update window height --> resize window if (self.lockResizeWindow) { -// MMLogInfo(@"lockResizeWindow"); + // MMLogInfo(@"lockResizeWindow"); return; } - + [self setNeedUpdateIframeHeightForAllResults]; - + [self reloadTableViewDataWithLock:NO completion:^{ // Update query view height manually, and update cell height. CGFloat queryViewHeight = [self.queryView heightOfQueryView]; @@ -158,37 +158,37 @@ - (void)setupUI { NSIndexSet *firstIndexSet = [NSIndexSet indexSetWithIndex:0]; [self.tableView noteHeightOfRowsWithIndexesChanged:firstIndexSet]; } - + [self updateWindowViewHeight]; }]; }]; - - + + NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; - + [defaultCenter addObserver:self selector:@selector(handleServiceUpdate:) name:EZServiceHasUpdatedNotification object:nil]; - + [defaultCenter addObserver:self selector:@selector(boundsDidChangeNotification:) name:NSViewBoundsDidChangeNotification object:[self.scrollView contentView]]; - + // ???: FIX [dcs_error] kDCSActiveDictionariesChangedDistributedNotification catched, but it seems does not work. [defaultCenter addObserver:self selector:@selector(activeDictionariesChanged:) name:kDCSActiveDictionariesChangedDistributedNotification object:nil]; - + [defaultCenter addObserverForName:NotificationName.didChangeFontSize object:nil queue:NSOperationQueue.mainQueue usingBlock:^(NSNotification *_Nonnull notification) { mm_strongify(self); [self reloadTableViewData:^{ [self updateAllResultCellHeight]; }]; }]; - + [defaultCenter addObserver:self selector:@selector(modifyLanduage:) name:NSNotification.languagePreferenceChanged object:nil]; } @@ -200,32 +200,32 @@ - (void)modifyLanduage:(NSNotification *)notification { - (void)setupServices:(NSArray *)allServices { NSMutableArray *serviceTypes = [NSMutableArray array]; NSMutableArray *services = [NSMutableArray array]; - + self.youdaoService = nil; EZServiceType defaultTTSServiceType = Configuration.shared.defaultTTSServiceType; - + for (EZQueryService *service in allServices) { if (service.enabled) { [self resetService:service]; - + [services addObject:service]; [serviceTypes addObject:service.serviceType]; - + [self trySetupSubscribersForService:service oldService:nil]; } - + EZServiceType serviceType = service.serviceType; if ([serviceType isEqualToString:EZServiceTypeYoudao]) { self.youdaoService = service; } - + if ([serviceType isEqualToString:defaultTTSServiceType]) { _defaultTTSService = service; } } self.services = services; self.serviceTypes = serviceTypes; - + self.audioPlayer = [[EZAudioPlayer alloc] init]; if (!self.youdaoService) { self.youdaoService = [self serviceWithType:EZServiceTypeYoudao]; @@ -234,7 +234,7 @@ - (void)setupServices:(NSArray *)allServices { - (void)dealloc { MMLogInfo(@"dealloc: %@", self); - + [NSNotificationCenter.defaultCenter removeObserver:self]; [NSNotificationCenter.defaultCenter removeObserver:self name:NotificationName.didChangeFontSize object:nil]; } @@ -250,19 +250,19 @@ - (void)handleServiceUpdate:(NSNotification *)notification { EZWindowType windowType = [userInfo[EZWindowTypeKey] integerValue]; NSString *serviceType = userInfo[EZServiceTypeKey]; BOOL autoQuery = [userInfo[EZAutoQueryKey] boolValue]; - + MMLogInfo(@"handle service update notification: %@, userInfo: %@", serviceType, userInfo); - + // If window is deallocing, we should not continue to update. if (GlobalContext.shared.subscribeWindowType == EZWindowTypeNone && self.windowType == EZWindowTypeMain) { return; } - + if ([serviceType length] != 0) { [self updateService:serviceType autoQuery:autoQuery]; return; } - + if (!userInfo || windowType == self.windowType || windowType == EZWindowTypeNone) { [self resetAllCellWithServices:[self latestServices] completion:^{ if (autoQuery) { @@ -285,7 +285,7 @@ - (NSScrollView *)scrollView { NSScrollView *scrollView = [[NSScrollView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:scrollView]; _scrollView = scrollView; - + scrollView.wantsLayer = YES; scrollView.layer.cornerRadius = EZCornerRadius_8; [scrollView excuteLight:^(NSScrollView *scrollView) { @@ -293,20 +293,20 @@ - (NSScrollView *)scrollView { } dark:^(NSScrollView *scrollView) { scrollView.backgroundColor = [NSColor ez_mainViewBgDarkColor]; }]; - + [scrollView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.view).offset(0); make.left.right.bottom.equalTo(self.view); - + CGSize miniWindowSize = [EZLayoutManager.shared minimumWindowSize:self.windowType]; make.width.mas_greaterThanOrEqualTo(miniWindowSize.width); make.height.mas_greaterThanOrEqualTo(miniWindowSize.height); }]; - + scrollView.hasVerticalScroller = YES; scrollView.verticalScroller.controlSize = NSControlSizeSmall; [scrollView setAutomaticallyAdjustsContentInsets:NO]; - + CGFloat bottomInset = EZHorizontalCellSpacing_10 - EZVerticalCellSpacing_7 / 2; scrollView.contentInsets = NSEdgeInsetsMake(0, 0, bottomInset, 0); } @@ -317,26 +317,26 @@ - (NSTableView *)tableView { if (!_tableView) { NSTableView *tableView = [[NSTableView alloc] initWithFrame:self.scrollView.bounds]; _tableView = tableView; - + [tableView excuteLight:^(NSTableView *tableView) { tableView.backgroundColor = [NSColor ez_mainViewBgLightColor]; } dark:^(NSTableView *tableView) { tableView.backgroundColor = [NSColor ez_mainViewBgDarkColor]; }]; - + tableView.style = NSTableViewStylePlain; - + NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:EZColumnId]; self.column = column; column.resizingMask = NSTableColumnUserResizingMask | NSTableColumnAutoresizingMask; [tableView addTableColumn:column]; - + tableView.delegate = self; tableView.dataSource = self; tableView.rowHeight = 40; [tableView setAutoresizesSubviews:YES]; [tableView setColumnAutoresizingStyle:NSTableViewUniformColumnAutoresizingStyle]; - + tableView.headerView = nil; tableView.intercellSpacing = CGSizeMake(2 * EZHorizontalCellSpacing_10, EZVerticalCellSpacing_7); tableView.gridColor = NSColor.clearColor; @@ -363,10 +363,10 @@ - (EZAudioPlayer *)audioPlayer { - (void)setInputText:(NSString *)inputText { // !!!: Rewrite property copy setter. Avoid text being affected. _inputText = [inputText copy]; - + self.queryModel.inputText = _inputText; - - + + [self updateQueryViewModelAndDetectedLanguage:self.queryModel]; } @@ -391,23 +391,23 @@ - (void)startQueryText:(NSString *)text { - (void)startQueryText:(NSString *)text actionType:(EZActionType)actionType { MMLogInfo(@"query actionType: %@", actionType); - + if (text.trim.length == 0) { MMLogWarn(@"query text is empty"); return; } - + self.inputText = text; self.queryModel.actionType = actionType; self.queryView.isTypingChinese = NO; - + if ([self handleEasydictScheme:text]) { return; } - + // Before starting new query, we should stop the previous query. [self.queryModel stopAllService]; - + // Close all resultView before querying new text. [self closeAllResultView:^{ self.inputText = text; @@ -421,97 +421,97 @@ - (BOOL)handleEasydictScheme:(NSString *)text { if (!isEasydictScheme) { return NO; } - + [self.schemeParser openURLScheme:text completion:^(BOOL isSuccess, NSString *_Nullable returnValue, NSString *_Nullable actionKey) { NSString *message = isSuccess ? @"Success" : @"Failed"; if (returnValue.length > 0) { message = returnValue; } - + [EZToast showToast:message]; - + if (!isSuccess) { return; } - + [self clearInput]; - + // If write, need to update. if (actionKey && [self.schemeParser isWriteActionKey:actionKey]) { // Besides current window, other pages need to be notified, such as the settings service page. [NSNotificationCenter.defaultCenter postServiceUpdateNotification]; } }]; - + return YES; } - (void)startOCRImage:(NSImage *)image actionType:(EZActionType)actionType { MMLogInfo(@"start OCR Image: %@, actionType: %@", @(image.size), actionType); - + self.queryModel.OCRImage = image; self.queryModel.actionType = actionType; - + self.queryView.isTypingChinese = NO; [self.queryView startLoadingAnimation:YES]; - + // Hide previous tips view first. [self showTipsView:NO completion:nil]; - + mm_weakify(self); [self.detectManager ocrAndDetectText:^(EZQueryModel *_Nonnull queryModel, NSError *_Nullable error) { mm_strongify(self); // !!!: inputText should be used here, not queryText, queryText may be modified, such as easydict://query?text=xxx NSString *inputText = queryModel.inputText; MMLogInfo(@"ocr result: %@", inputText); - + NSDictionary *dict = @{ @"detectedLanguage" : queryModel.detectedLanguage, @"actionType" : actionType, }; [EZLog logEventWithName:@"ocr" parameters:dict]; - - + + if (actionType == EZActionTypeScreenshotOCR) { [inputText copyToPasteboardSafely]; - + dispatch_block_on_main_safely(^{ [EZToast showSuccessToast]; }); - + return; } - - + + if (actionType == EZActionTypeOCRQuery) { [self.queryView startLoadingAnimation:NO]; - + self.inputText = inputText; - + // Show detected language, even auto self.queryModel.showAutoLanguage = YES; - + [self updateQueryTextAndParagraphStyle:inputText actionType:actionType]; - + if (error) { NSString *errorMsg = [error localizedDescription]; self.queryView.alertText = errorMsg; return; } - + if (Configuration.shared.autoCopyOCRText) { [inputText copyToPasteboardSafely]; } - + [self.queryView highlightAllLinks]; - + if ([self.inputText isURL]) { // Append a whitespace to beautify the link. self.inputText = [self.inputText stringByAppendingString:@" "]; - + return; } - + BOOL autoSnipTranslate = Configuration.shared.autoQueryOCRText; if (autoSnipTranslate && queryModel.autoQuery) { [self startQueryText]; @@ -522,18 +522,18 @@ - (void)startOCRImage:(NSImage *)image actionType:(EZActionType)actionType { - (void)retryQuery { MMLogInfo(@"retry query"); - + [self.audioPlayer stop]; - + // Reset query view height. if (self.queryModel.OCRImage) { self.inputText = @""; } - + // Re-detect langauge when retry. self.queryModel.detectedLanguage = EZLanguageAuto; self.queryModel.needDetectLanguage = YES; - + [self closeAllResultView:^{ [self startQueryWithType:self.queryModel.actionType]; }]; @@ -544,7 +544,7 @@ - (void)focusInputTextView { if (self.queryView.window == self.baseQueryWindow) { // Need to activate the current application first. [NSApp activateIgnoringOtherApps:YES]; - + [self.baseQueryWindow makeFirstResponder:self.queryView.textView]; if (Configuration.shared.selectQueryTextWhenWindowActivate) { self.queryView.textView.selectedRange = NSMakeRange(0, self.inputText.length); @@ -557,20 +557,20 @@ - (void)clearInput { self.inputText = @""; self.queryModel.OCRImage = nil; [self.queryView setAlertTextHidden:YES]; - + [self.audioPlayer stop]; } - (void)clearAll { [self clearInput]; - + [self updateQueryCellWithCompletionHandler:^{ // !!!: To show closing animation, we cannot reset result directly. [self closeAllResultView:^{ [self resetQueryAndResults]; }]; }]; - + self.queryView.clearButtonHidden = YES; } @@ -603,22 +603,22 @@ - (void)togglePlayQueryText:(BOOL)play { [self.audioPlayer stop]; return; } - + void (^playAudioBlock)(void) = ^{ NSString *queryText = self.queryText; NSString *textLanguage = self.queryModel.queryFromLanguage; BOOL isEnglishWord = [queryText isEnglishWordWithLanguage:textLanguage]; - + // If query text is an English word, use Youdao TTS to play. EZQueryService *ttsService = isEnglishWord ? self.youdaoService : self.defaultTTSService; - + [self.audioPlayer playTextAudio:queryText language:textLanguage accent:nil audioURL:nil designatedService:ttsService]; }; - + // Before playing audio, we should detect the query text language. if (self.queryModel.hasQueryFromLanguage) { playAudioBlock(); @@ -639,7 +639,7 @@ - (void)stopAllResultAudio { - (void)updateQueryTextAndParagraphStyle:(NSString *)text actionType:(EZActionType)queryType { [self.queryView.textView updateTextAndParagraphStyle:text]; self.queryModel.actionType = queryType; - + if (text) { /** If user disabled auto query when getting selected text, we should close tips view after updating query text. @@ -661,20 +661,20 @@ - (void)showTipsView:(BOOL)isVisible { - (void)showTipsView:(BOOL)isVisible completion:(void (^)(void))completion { // when queryModel.queryText is Empty show tips - + if (!isVisible && !self.isTipsViewVisible) { if (completion) { completion(); } return; } - + self.isTipsViewVisible = isVisible; - + if (isVisible) { [self resetQueryAndResults]; } - + [self reloadTableViewData:completion]; } @@ -721,12 +721,12 @@ - (void)queryCurrentModel { MMLogWarn(@"query text is empty"); return; } - + MMLogInfo(@"query text: %@", self.queryText.truncated); - + // !!!: Reset all result before new query. [self resetAllResults]; - + if (self.queryModel.needDetectLanguage) { [self detectQueryText:^(NSString *_Nonnull language) { [self queryAllSerives:self.queryModel]; @@ -738,7 +738,7 @@ - (void)queryCurrentModel { - (void)queryAllSerives:(EZQueryModel *)queryModel { MMLogInfo(@"query: %@ --> %@", queryModel.queryFromLanguage, queryModel.queryTargetLanguage); - + self.firstService = nil; for (EZQueryService *service in self.services) { BOOL enableAutoQuery = service.enabledQuery && service.enabledAutoQuery && service.queryTextType != EZQueryTextTypeNone; @@ -746,17 +746,17 @@ - (void)queryAllSerives:(EZQueryModel *)queryModel { MMLogInfo(@"service disabled: %@", service.serviceType); continue; } - + [self queryWithModel:queryModel service:service]; - + if (!self.firstService) { self.firstService = service; [self autoCopyTranslatedTextOfService:service]; } } - + [[EZLocalStorage shared] increaseQueryCount:self.inputText]; - + // Auto play query text if it is an English word. [self autoPlayEnglishWordAudio]; } @@ -767,21 +767,21 @@ - (void)queryWithModel:(EZQueryModel *)queryModel service:(EZQueryService *)serv MMLogError(@"query error: %@", error); } result.error = [EZError errorWithNSError:error]; - + // Auto convert to traditional Chinese if needed. if (service.autoConvertTraditionalChinese && [self.queryModel.queryTargetLanguage isEqualToString:EZLanguageTraditionalChinese]) { [service.result convertToTraditionalChineseResult]; } - + BOOL hideResult = !result.manulShow && !result.hasTranslatedResult && result.isWarningErrorType; if (hideResult) { result.isShowing = NO; } - -// MMLogInfo(@"update service: %@, %@", service.serviceType, result); + + // MMLogInfo(@"update service: %@, %@", service.serviceType, result); [self updateCellWithResult:result reloadData:YES]; - + if (service.autoCopyTranslatedTextBlock) { service.autoCopyTranslatedTextBlock(result, error); } @@ -800,19 +800,19 @@ - (void)queryWithModel:(EZQueryModel *)queryModel MMLogWarn(@"queryText is empty"); return; } - -// MMLogInfo(@"query service: %@", service.serviceType); - + + // MMLogInfo(@"query service: %@", service.serviceType); + EZQueryResult *result = service.result; - + // Show result if it has been queried. result.isShowing = YES; result.isLoading = YES; - + [self updateResultLoadingAnimation:result]; - + [service startQuery:queryModel completion:completion]; - + [EZLocalStorage.shared increaseQueryService:service]; } @@ -831,8 +831,8 @@ - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { // View-base 设置某个元素的具体视图 - (nullable NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(nullable NSTableColumn *)tableColumn row:(NSInteger)row { -// MMLogInfo(@"tableView for row: %ld", row); - + // MMLogInfo(@"tableView for row: %ld", row); + if (row == 0) { self.queryView = [self createQueryView]; self.queryView.windowType = self.windowType; @@ -840,7 +840,7 @@ - (nullable NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(null self.queryView.queryModel = self.queryModel; return self.queryView; } - + if (self.windowType != EZWindowTypeMini && row == 1) { EZSelectLanguageCell *selectLanguageCell = [self.tableView makeViewWithIdentifier:EZSelectLanguageCellId owner:self]; if (!selectLanguageCell) { @@ -849,18 +849,18 @@ - (nullable NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(null } selectLanguageCell.queryModel = self.queryModel; self.selectLanguageCell = selectLanguageCell; - + mm_weakify(self); [selectLanguageCell setEnterActionBlock:^(EZLanguage _Nonnull from, EZLanguage _Nonnull to) { mm_strongify(self); self.queryModel.userSourceLanguage = from; self.queryModel.userTargetLanguage = to; - + [self retryQuery]; }]; return selectLanguageCell; } - + // show tips view if (row == 2 && self.isTipsViewVisible) { EZTableTipsCell *tipsCell = [self.tableView makeViewWithIdentifier:EZTableTipsCellId owner:self]; @@ -871,10 +871,10 @@ - (nullable NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(null self.tipsCell = tipsCell; return tipsCell; } - + EZResultView *resultCell = [self resultCellAtRow:row]; resultCell.windowType = self.windowType; - + return resultCell; } @@ -884,7 +884,7 @@ - (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger) - (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row { CGFloat height; - + if (row == 0) { height = self.queryModel.queryViewHeight; } else if (row == 1 && self.windowType != EZWindowTypeMini) { @@ -905,8 +905,8 @@ - (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row { height = EZResultViewMiniHeight; } } -// MMLogInfo(@"row: %ld, height: %@", row, @(height)); - + // MMLogInfo(@"row: %ld, height: %@", row, @(height)); + return height; } @@ -937,14 +937,14 @@ - (void)reloadTableViewDataWithLock:(BOOL)lockFlag completion:(void (^)(void))co completion(); } }]; - + [self.tableView reloadData]; [CATransaction commit]; } - (void)closeAllResultView:(void (^)(void))completionHandler { [self.queryModel stopAllService]; - + // !!!: Need to update all result cells, even it's not showing, it may show error image. NSArray *allResults = [self resetAllResults]; [self updateCellWithResults:allResults reloadData:YES completionHandler:completionHandler]; @@ -972,7 +972,7 @@ - (void)updateCellWithResults:(NSArray *)results reloadData:(BO isFinished = result.webViewManager.wordResultViewHeight > 0; } result.isLoading = !isFinished; - + NSIndexSet *indexSet = [self indexSetOfResult:result]; if (indexSet) { [rowIndexes addIndexes:indexSet]; @@ -996,28 +996,28 @@ - (void)updateTableViewRowIndexes:(NSIndexSet *)rowIndexes reloadData:(BOOL)reloadData animate:(BOOL)animateFlag completionHandler:(void (^)(void))completionHandler { -// MMLogInfo(@"updateTableViewRowIndexes: %@", rowIndexes); - + // MMLogInfo(@"updateTableViewRowIndexes: %@", rowIndexes); + // !!!: Since the caller may be in non-main thread, we need to dispatch to main thread, but canont always use dispatch_async, it will cause the animation not smooth. dispatch_block_on_main_safely(^{ if (reloadData) { // !!!: Note: For NSView-based table views, this method drops the view-cells in the table row, but not the NSTableRowView instances. - + // ???: need to check. - + [self.tableView reloadDataForRowIndexes:rowIndexes columnIndexes:[NSIndexSet indexSetWithIndex:0]]; } - + CGFloat duration = animateFlag ? EZUpdateTableViewRowHeightAnimationDuration : 0; - + [NSAnimationContext runAnimationGroup:^(NSAnimationContext *_Nonnull context) { context.duration = duration; // !!!: Must first notify the update tableView cell height, and then calculate the tableView height. -// MMLogInfo(@"noteHeightOfRowsWithIndexesChanged: %@", rowIndexes); + // MMLogInfo(@"noteHeightOfRowsWithIndexesChanged: %@", rowIndexes); [self.tableView noteHeightOfRowsWithIndexesChanged:rowIndexes]; [self updateWindowViewHeight]; } completionHandler:^{ -// MMLogInfo(@"completionHandler, updateTableViewRowIndexes: %@", rowIndexes); + // MMLogInfo(@"completionHandler, updateTableViewRowIndexes: %@", rowIndexes); if (completionHandler) { completionHandler(); } @@ -1048,7 +1048,7 @@ - (void)updateSelectLanguageCell { if (offset == 1) { return; } - + NSIndexSet *rowIndexes = [NSMutableIndexSet indexSetWithIndex:offset - 1]; [self.tableView reloadDataForRowIndexes:rowIndexes columnIndexes:[NSIndexSet indexSetWithIndex:0]]; } @@ -1104,14 +1104,14 @@ - (NSUInteger)rowIndexOfResult:(EZQueryResult *)result { - (void)resetCellWithService:(EZQueryService *)service autoQuery:(BOOL)autoQuery { [self resetService:service]; - + EZQueryResult *newResult = [service resetServiceResult]; - + [self updateCellWithResult:newResult reloadData:YES completionHandler:^{ if (autoQuery) { // Make enabledQuery = YES before retry, it may be closed manually. service.enabledQuery = YES; - + [self queryWithModel:self.queryModel service:service]; } }]; @@ -1132,15 +1132,15 @@ - (void)updateService:(NSString *)serviceType autoQuery:(BOOL)autoQuery { [self updateCellWithResult:service.result reloadData:YES completionHandler:nil]; return; } - + EZQueryService *updatedService = [EZLocalStorage.shared service:serviceType windowType:self.windowType]; [self trySetupSubscribersForService:updatedService oldService:service]; NSInteger index = [self.serviceTypes indexOfObject:serviceType]; newServices[index] = updatedService; self.services = newServices.copy; - + [self resetCellWithService:updatedService autoQuery:autoQuery]; - + return; } } @@ -1158,22 +1158,22 @@ - (void)resetAllCellWithServices:(NSArray *)allServices completion:(void (^)(voi - (void)trySetupSubscribersForService:(EZQueryService *)service oldService:(nullable EZQueryService *)oldService { // TODO: We should set subscribers when init EZLLMStreamService. - + /** We only setup subscribers in `one` query window, we do not need extra notification in other place when init(), like settings. - + When notify a service configuration changed, it will init a new service, this is bad. But for some strange reason, the old service can not be deallocated, this will cause a memory leak, and we also need to cancel old services subscribers. - + This code is so ugly, we should fix it later. */ - + BOOL enableSubscribe = GlobalContext.shared.subscribeWindowType == EZWindowTypeNone || GlobalContext.shared.subscribeWindowType == self.windowType; - + if ([service isKindOfClass:EZLLMStreamService.class] && enableSubscribe) { [((EZLLMStreamService *)service) setupSubscribers]; [((EZLLMStreamService *)oldService) cancelSubscribers]; - + GlobalContext.shared.subscribeWindowType = self.windowType; } } @@ -1183,7 +1183,7 @@ - (void)trySetupSubscribersForService:(EZQueryService *)service oldService:(null - (void)resetQueryAndResults { [self resetAllResults]; - + if (self.inputText.length) { self.inputText = @""; } @@ -1203,13 +1203,13 @@ - (nullable EZResultView *)resultCellOfResult:(EZQueryResult *)result { if (index != NSNotFound) { NSInteger row = index + [self resultCellOffset]; EZResultView *resultCell = [[[self.tableView rowViewAtRow:row makeIfNecessary:NO] subviews] firstObject]; - + // ???: Why is it possible to return a EZSelectLanguageCell ? if ([resultCell isKindOfClass:[EZResultView class]]) { return resultCell; } } - + return nil; } @@ -1230,19 +1230,19 @@ - (void)cancelDelayDetectQueryText { /// Detect query text, and update select language cell. - (void)detectQueryText:(nullable void (^)(NSString *language))completion { [self cancelDelayDetectQueryText]; - + [self.detectManager detectText:self.queryText completion:^(EZQueryModel *queryModel, NSError *error) { // `self.queryModel.detectedLanguage` has already been updated inside the method. - + // Show detected language button if has queryText, even detect language is auto. BOOL showAutoLanguage = YES; if (self.queryText.length == 0) { showAutoLanguage = NO; } self.queryModel.showAutoLanguage = showAutoLanguage; - + [self updateQueryViewModelAndDetectedLanguage:queryModel]; - + if (completion) { completion(queryModel.detectedLanguage); } @@ -1251,7 +1251,7 @@ - (void)detectQueryText:(nullable void (^)(NSString *language))completion { - (void)updateQueryViewModelAndDetectedLanguage:(EZQueryModel *)queryModel { self.queryView.clearButtonHidden = (queryModel.inputText.length == 0) && ([self allShowingResults].count == 0); - + self.queryView.queryModel = queryModel; [self updateQueryCell]; [self updateSelectLanguageCell]; @@ -1267,7 +1267,7 @@ - (NSArray *)allShowingResults { [results addObject:result]; } } - + return results; } @@ -1291,7 +1291,7 @@ - (void)setNeedUpdateIframeHeightForAllResults { - (void)disableReplaceTextButton { for (EZQueryService *service in self.services) { service.result.showReplaceButton = NO; - + EZResultView *resultView = [self resultCellOfResult:service.result]; resultView.wordResultView.replaceTextButton.enabled = NO; } @@ -1306,49 +1306,49 @@ - (EZQueryView *)createQueryView { queryView = [[EZQueryView alloc] initWithFrame:[self tableViewContentBounds]]; queryView.identifier = EZQueryViewId; } - + // placeholder, just for new user. NSString *placeholderText = NSLocalizedString(@"placeholder", nil); if (EZLocalStorage.shared.queryCount > 100) { placeholderText = @""; } queryView.placeholderText = placeholderText; - + queryView.audioButton.audioPlayer = self.audioPlayer; - + mm_weakify(self); [queryView setUpdateInputTextBlock:^(NSString *text, CGFloat queryViewHeight) { mm_strongify(self); -// MMLogInfo(@"UpdateQueryTextBlock"); - + // MMLogInfo(@"UpdateQueryTextBlock"); + // !!!: The code here is a bit messy, so you need to be careful about changing it. - + // But, since there are cases where the query text is set manually, such as query selected text, where the query text is set first and then the input text is modified, the query cell must be updated for such cases. - + // Reduce the update frequency, update only when the queryText or height changes. if ([self.inputText isEqualToString:text] && self.queryModel.queryViewHeight == queryViewHeight) { return; } - + NSString *oldInputText = self.inputText; self.inputText = text; - + // Only detect when query text is changed. if (![self.inputText.trim isEqualToString:oldInputText.trim]) { [self delayDetectQueryText]; } - + self.queryModel.queryViewHeight = queryViewHeight; [self updateQueryCell]; }]; - + [queryView setEnterActionBlock:^(NSString *text) { mm_strongify(self); // tips view hidden once user tap entry self.isTipsViewVisible = NO; [self startQueryText:text]; }]; - + [queryView setPasteTextBlock:^(NSString *_Nonnull text) { mm_strongify(self); [self detectQueryText:^(NSString *_Nonnull language) { @@ -1357,35 +1357,35 @@ - (EZQueryView *)createQueryView { } }]; }]; - + [queryView setPlayAudioBlock:^(NSString *text) { mm_strongify(self); [self togglePlayQueryText]; }]; - + [queryView setCopyTextBlock:^(NSString *text) { [text copyAndShowToast:YES]; }]; - + [queryView setClearBlock:^(NSString *_Nonnull text) { mm_strongify(self); - + // Close tips view when user clicking clear button. self.isTipsViewVisible = NO; - + [self clearAll]; }]; - + [queryView setSelectedLanguageBlock:^(EZLanguage language) { mm_strongify(self); - + EZLanguage detectedLanguage = self.queryModel.detectedLanguage; if (![detectedLanguage isEqualToString:language]) { self.queryModel.detectedLanguage = language; [self retryQuery]; - + [self updateSelectLanguageCell]; - + NSDictionary *dict = @{ @"autoDetect" : detectedLanguage, @"userSelect" : language, @@ -1393,35 +1393,35 @@ - (EZQueryView *)createQueryView { [EZLog logEventWithName:@"change_detected_language" parameters:dict]; } }]; - + return queryView; } - (EZResultView *)resultCellAtRow:(NSInteger)row { EZQueryService *service = [self serviceAtRow:row]; EZResultView *resultCell = [self.tableView makeViewWithIdentifier:EZResultViewId owner:self]; - + if (!resultCell) { resultCell = [[EZResultView alloc] initWithFrame:[self tableViewContentBounds]]; resultCell.identifier = EZResultViewId; } - + EZQueryResult *result = service.result; resultCell.result = result; [self setupResultCell:resultCell]; - + WKWebView *webView = nil; if ([service.serviceType isEqualToString:EZServiceTypeAppleDictionary]) { EZAppleDictionary *appleDictService = (EZAppleDictionary *)service; - + EZWebViewManager *webViewManager = result.webViewManager; webView = webViewManager.webView; resultCell.wordResultView.webView = webView; - + BOOL needLoadHTML = result.isShowing && result.HTMLString.length && !webViewManager.isLoaded; if (needLoadHTML) { webViewManager.isLoaded = YES; - + NSURL *htmlFileURL = [NSURL fileURLWithPath:appleDictService.htmlFilePath]; webView.navigationDelegate = resultCell.wordResultView; [webView loadFileURL:htmlFileURL allowingReadAccessToURL:TTTDictionary.userDictionaryDirectoryURL]; @@ -1429,25 +1429,25 @@ - (EZResultView *)resultCellAtRow:(NSInteger)row { [webViewManager updateAllIframe]; } } - + return resultCell; } - (void)setupResultCell:(EZResultView *)resultView { EZQueryResult *result = resultView.result; EZQueryService *service = result.service; - + mm_weakify(self); [resultView setQueryTextBlock:^(NSString *_Nonnull word) { mm_strongify(self); [self startQueryText:word]; }]; - + [resultView setRetryBlock:^(EZQueryResult *result) { mm_strongify(self); [self resetCellWithService:service autoQuery:YES]; }]; - + // !!!: Avoid capture result, the block paramter result is different from former result. [resultView setClickArrowBlock:^(EZQueryResult *newResult) { mm_strongify(self); @@ -1455,9 +1455,9 @@ - (void)setupResultCell:(EZResultView *)resultView { if (!isShowing) { [newResult.service.audioPlayer stop]; } - + service.enabledQuery = isShowing; - + // If there is no result, try to query with current servie. if (isShowing && !newResult.hasShowingResult) { if (self.queryModel.needDetectLanguage) { @@ -1470,7 +1470,7 @@ - (void)setupResultCell:(EZResultView *)resultView { } else { // If alreay has result, just update cell. [self updateCellWithResult:newResult reloadData:YES]; - + // if hide result view, we need to notify to update reused cell height. if (!isShowing) { [self.tableView reloadData]; @@ -1495,11 +1495,11 @@ - (NSInteger)resultCellOffset { offset = 2; } } - + if (self.isTipsViewVisible) { offset += 1; } - + return offset; } @@ -1540,46 +1540,46 @@ - (void)updateWindowViewHeightWithLock:(BOOL)lockFlag if (lockFlag) { self.lockResizeWindow = YES; } - -// MMLogInfo(@"updateWindowViewHeightWithLock"); - + + // MMLogInfo(@"updateWindowViewHeightWithLock"); + CGFloat tableViewHeight = [self getScrollViewContentHeight]; CGFloat height = [self getRestrainedScrollViewHeight:tableViewHeight]; -// MMLogInfo(@"getRestrainedScrollViewHeight: %@", @(height)); - + // MMLogInfo(@"getRestrainedScrollViewHeight: %@", @(height)); + CGSize maxWindowSize = [EZLayoutManager.shared maximumWindowSize:self.windowType]; - + CGFloat titleBarHeight = EZTitlebarHeight_28; // system title bar height is 28 - + CGFloat scrollViewHeight = height + self.scrollView.contentInsets.top + self.scrollView.contentInsets.bottom; scrollViewHeight = MIN(scrollViewHeight, maxWindowSize.height - titleBarHeight); - + // Diable change window height manually. [self.scrollView mas_updateConstraints:^(MASConstraintMaker *make) { make.height.mas_greaterThanOrEqualTo(scrollViewHeight); make.height.mas_lessThanOrEqualTo(scrollViewHeight); }]; - + CGFloat showingWindowHeight = scrollViewHeight + titleBarHeight; showingWindowHeight = MIN(showingWindowHeight, maxWindowSize.height); - + // Since chaneg height will cause position change, we need to adjust y to keep top-left coordinate position. NSWindow *window = self.view.window; - + CGFloat deltaHeight = window.height - showingWindowHeight; CGFloat y = window.y + deltaHeight; - + CGRect newFrame = CGRectMake(window.x, y, window.width, showingWindowHeight); CGRect safeFrame = [EZCoordinateUtils getSafeAreaFrame:newFrame inScreen:nil]; - + // ???: why set window frame will change tableView height? // ???: why this window animation will block cell rendering? // [self.window setFrame:safeFrame display:NO animate:animateFlag]; [self.baseQueryWindow setFrame:safeFrame display:NO]; - + // Restore tableView height. self.tableView.height = tableViewHeight; - + if (animateFlag) { // Animation cost time. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(EZUpdateTableViewRowHeightAnimationDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ @@ -1588,35 +1588,35 @@ - (void)updateWindowViewHeightWithLock:(BOOL)lockFlag } else { self.lockResizeWindow = NO; } - -// MMLogInfo(@"window frame: %@", @(window.frame)); + + // MMLogInfo(@"window frame: %@", @(window.frame)); } - (CGFloat)getRestrainedScrollViewHeight:(CGFloat)scrollViewContentHeight { CGFloat height = scrollViewContentHeight; - + CGSize minimumWindowSize = [EZLayoutManager.shared minimumWindowSize:self.windowType]; CGSize maximumWindowSize = [EZLayoutManager.shared maximumWindowSize:self.windowType]; - + height = MAX(height, minimumWindowSize.height); height = MIN(height, maximumWindowSize.height); - + return height; } /// Manually calculate tableView row height. - (CGFloat)getScrollViewContentHeight { CGFloat scrollViewContentHeight = 0; - + NSInteger rowCount = [self numberOfRowsInTableView:self.tableView]; for (int i = 0; i < rowCount; i++) { CGFloat rowHeight = [self tableView:self.tableView heightOfRow:i]; -// MMLogInfo(@"row: %d, Height: %.1f", i, rowHeight); + // MMLogInfo(@"row: %d, Height: %.1f", i, rowHeight); scrollViewContentHeight += (rowHeight + EZVerticalCellSpacing_7); } -// MMLogInfo(@"scrollViewContentHeight: %.1f", scrollViewContentHeight); - - + // MMLogInfo(@"scrollViewContentHeight: %.1f", scrollViewContentHeight); + + return scrollViewContentHeight; } @@ -1624,10 +1624,10 @@ - (CGFloat)getScrollViewContentHeight { - (CGFloat)getContentHeight { // Modify scrollView height to 0, to get actual tableView content height, avoid blank view. self.scrollView.height = 0; - + CGFloat documentViewHeight = self.scrollView.documentView.height; // actually is tableView height -// MMLogInfo(@"documentView height: %@", @(documentViewHeight)); - + // MMLogInfo(@"documentView height: %@", @(documentViewHeight)); + return documentViewHeight; } @@ -1643,12 +1643,12 @@ - (void)autoPlayEnglishWordAudio { if (!Configuration.shared.autoPlayAudio) { return; } - + BOOL isEnglishWord = [self.queryText isEnglishWordWithLanguage:self.queryModel.queryFromLanguage]; if (!isEnglishWord) { return; } - + MMLogInfo(@"Auto play English word audio: %@", self.queryText); [self togglePlayQueryText:YES]; } @@ -1661,13 +1661,13 @@ - (void)autoCopyTranslatedTextOfService:(EZQueryService *)service { service.autoCopyTranslatedTextBlock = nil; return; } - + [service setAutoCopyTranslatedTextBlock:^(EZQueryResult *result, NSError *error) { if (!result.HTMLString.length) { [result.copiedText copyToPasteboard]; return; } - + mm_weakify(result); [result setDidFinishLoadingHTMLBlock:^{ mm_strongify(result); diff --git a/Easydict/objc/ViewController/Window/BaseQueryWindow/EZBaseQueryWindow.m b/Easydict/objc/ViewController/Window/BaseQueryWindow/EZBaseQueryWindow.m index a74424024..fa5c6bbcc 100644 --- a/Easydict/objc/ViewController/Window/BaseQueryWindow/EZBaseQueryWindow.m +++ b/Easydict/objc/ViewController/Window/BaseQueryWindow/EZBaseQueryWindow.m @@ -82,7 +82,7 @@ - (void)setQueryViewController:(EZBaseQueryViewController *)viewController { - (void)setPin:(BOOL)pin { _pin = pin; - + // !!!: Do not use kCGMaximumWindowLevel, otherwise it will obscure the tooltip. NSWindowLevel level = self.pin ? kCGUtilityWindowLevel : kCGNormalWindowLevel; self.level = level; @@ -105,7 +105,7 @@ - (NSTimeInterval)animationResizeTime:(NSRect)newFrame { - (void)dealloc { MMLogInfo(@"dealloc query window: %@", self); - + // We should reset subscribeWindowType when query window dealloc. if (GlobalContext.shared.subscribeWindowType == self.windowType) { GlobalContext.shared.subscribeWindowType = EZWindowTypeNone; @@ -117,7 +117,7 @@ - (void)dealloc { #pragma mark - NSWindowDelegate, NSNotification - (void)windowDidBecomeKey:(NSNotification *)notification { -// MMLogInfo(@"windowDidBecomeKey: %@", self); + // MMLogInfo(@"windowDidBecomeKey: %@", self); // We need to update the window type when the window becomes the key window. [EZWindowManager.shared updateFloatingWindowType:self.windowType isShowing:YES]; @@ -128,15 +128,15 @@ - (void)windowDidBecomeKey:(NSNotification *)notification { } - (void)windowDidResignKey:(NSNotification *)notification { -// MMLogInfo(@"windowDidResignKey: %@", self); + // MMLogInfo(@"windowDidResignKey: %@", self); // Close floating window when losing focus if it's not pinned or main window. [EZWindowManager.shared closeFloatingWindowIfNotPinned:self.windowType exceptWindowType:EZWindowTypeMain]; } - (void)windowDidResize:(NSNotification *)aNotification { -// MMLog(@"windowDidResize: %@, windowType: %ld", @(self.frame), self.windowType); - + // MMLog(@"windowDidResize: %@, windowType: %ld", @(self.frame), self.windowType); + [[EZLayoutManager shared] updateWindowFrame:self]; if (self.resizeWindowBlock) { @@ -158,7 +158,7 @@ - (BOOL)windowShouldClose:(NSWindow *)sender { // Window is hidden or showing. - (void)windowDidChangeOcclusionState:(NSNotification *)notification { -// MMLogInfo(@"window Did Change Occlusion State"); + // MMLogInfo(@"window Did Change Occlusion State"); // Window is obscured if (self.occlusionState != NSWindowOcclusionStateVisible) { From 18f9592b4d1d6d268e9633adec4bdb19f0e9e94f Mon Sep 17 00:00:00 2001 From: tisfeng Date: Thu, 4 Jul 2024 21:33:37 +0800 Subject: [PATCH 19/21] chore: update SwiftFormat to 0.54 --- .swiftformat | 7 +++++-- Podfile | 2 +- Podfile.lock | 8 ++++---- Pods/Manifest.lock | 8 ++++---- Pods/Pods.xcodeproj/project.pbxproj | 4 ++-- Pods/SwiftFormat/CommandLineTool/swiftformat | Bin 3854432 -> 4157824 bytes Pods/SwiftFormat/README.md | 13 ++++++++----- 7 files changed, 24 insertions(+), 18 deletions(-) diff --git a/.swiftformat b/.swiftformat index 71562a9ad..59076a3ce 100644 --- a/.swiftformat +++ b/.swiftformat @@ -85,7 +85,7 @@ strongifiedSelf --indent 4 --maxwidth 120 --typeattributes prev-line ---varattributes same-line +--storedvarattrs same-line --voidtype tuple --wraparguments before-first --wrapparameters before-first @@ -105,4 +105,7 @@ strongifiedSelf # Following is by Lava ---ifdef no-indent \ No newline at end of file +--ifdef no-indent + +# Why doesn't this work? +--modifierorder public,override, \ No newline at end of file diff --git a/Podfile b/Podfile index 10562a015..979ffbfa8 100644 --- a/Podfile +++ b/Podfile @@ -13,7 +13,7 @@ target 'Easydict' do pod 'JLRoutes', '~> 2.1' # Swift format - pod 'SwiftFormat/CLI', '~> 0.53.2' + pod 'SwiftFormat/CLI', '~> 0.54' pod 'SwiftLint', '~> 0.54.0' end diff --git a/Podfile.lock b/Podfile.lock index 88a90eaea..bae33f8b7 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -16,7 +16,7 @@ PODS: - KVOController (1.2.0) - Masonry (1.1.0) - ReactiveObjC (3.1.1) - - SwiftFormat/CLI (0.53.10) + - SwiftFormat/CLI (0.54.0) - SwiftLint (0.54.0) DEPENDENCIES: @@ -25,7 +25,7 @@ DEPENDENCIES: - KVOController (~> 1.2.0) - Masonry (~> 1.1.0) - ReactiveObjC (~> 3.1.1) - - SwiftFormat/CLI (~> 0.53.2) + - SwiftFormat/CLI (~> 0.54) - SwiftLint (~> 0.54.0) SPEC REPOS: @@ -44,9 +44,9 @@ SPEC CHECKSUMS: KVOController: d72ace34afea42468329623b3379ab3cd1d286b6 Masonry: 678fab65091a9290e40e2832a55e7ab731aad201 ReactiveObjC: 011caa393aa0383245f2dcf9bf02e86b80b36040 - SwiftFormat: 5967522a8e82d562b2508363d3ddec424fee1e9e + SwiftFormat: 0e0b577434e6aa63bc82a8905b40d9597b8452d4 SwiftLint: c1de071d9d08c8aba837545f6254315bc900e211 -PODFILE CHECKSUM: 3c89974b4597474c7f2881849bf1cc4d5b0c774f +PODFILE CHECKSUM: b38d6c42d6418a0fcc74bc0514c2f683236f940f COCOAPODS: 1.14.2 diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index 88a90eaea..bae33f8b7 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -16,7 +16,7 @@ PODS: - KVOController (1.2.0) - Masonry (1.1.0) - ReactiveObjC (3.1.1) - - SwiftFormat/CLI (0.53.10) + - SwiftFormat/CLI (0.54.0) - SwiftLint (0.54.0) DEPENDENCIES: @@ -25,7 +25,7 @@ DEPENDENCIES: - KVOController (~> 1.2.0) - Masonry (~> 1.1.0) - ReactiveObjC (~> 3.1.1) - - SwiftFormat/CLI (~> 0.53.2) + - SwiftFormat/CLI (~> 0.54) - SwiftLint (~> 0.54.0) SPEC REPOS: @@ -44,9 +44,9 @@ SPEC CHECKSUMS: KVOController: d72ace34afea42468329623b3379ab3cd1d286b6 Masonry: 678fab65091a9290e40e2832a55e7ab731aad201 ReactiveObjC: 011caa393aa0383245f2dcf9bf02e86b80b36040 - SwiftFormat: 5967522a8e82d562b2508363d3ddec424fee1e9e + SwiftFormat: 0e0b577434e6aa63bc82a8905b40d9597b8452d4 SwiftLint: c1de071d9d08c8aba837545f6254315bc900e211 -PODFILE CHECKSUM: 3c89974b4597474c7f2881849bf1cc4d5b0c774f +PODFILE CHECKSUM: b38d6c42d6418a0fcc74bc0514c2f683236f940f COCOAPODS: 1.14.2 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index 0cd7f5e0c..f4dc6acb2 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 60; + objectVersion = 55; objects = { /* Begin PBXAggregateTarget section */ @@ -1543,7 +1543,7 @@ LastUpgradeCheck = 1500; }; buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; - compatibilityVersion = "Xcode 15.0"; + compatibilityVersion = "Xcode 13.0"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( diff --git a/Pods/SwiftFormat/CommandLineTool/swiftformat b/Pods/SwiftFormat/CommandLineTool/swiftformat index e1e26447cb1f34836827b8116a745eb617aedd28..bfd28635c8e0b895cc2ce648b7834a4ce199448b 100755 GIT binary patch delta 1901087 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%0ADGQJn4N%o+dCS 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 C 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

I`Z&!!z^4d&Hdsx20sga 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

k^`7u3dcf@EZ7c>An&pgm`T&{P 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

n=DcN8x7-X8U%h2?_qmdJn`Y!|)MuRd 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