185 lines
5.3 KiB
Swift
185 lines
5.3 KiB
Swift
import Foundation
|
||
|
||
enum RecognitionLanguage: String, CaseIterable {
|
||
case chineseSimplified = "zh-CN"
|
||
case english = "en-US"
|
||
case chineseTraditional = "zh-TW"
|
||
case japanese = "ja-JP"
|
||
case korean = "ko-KR"
|
||
|
||
var displayName: String {
|
||
switch self {
|
||
case .chineseSimplified: return "简体中文"
|
||
case .english: return "English"
|
||
case .chineseTraditional: return "繁體中文"
|
||
case .japanese: return "日本語"
|
||
case .korean: return "한국어"
|
||
}
|
||
}
|
||
}
|
||
|
||
enum LLMMode {
|
||
case input // 语音输入纠错
|
||
case assist // AI 助手对话
|
||
}
|
||
|
||
enum TriggerMode: String {
|
||
case input = "input" // 语音输入
|
||
case assist = "assist" // AI 助手
|
||
}
|
||
|
||
struct LLMConfig {
|
||
var enabled: Bool
|
||
var baseURL: String
|
||
var apiKey: String
|
||
var model: String
|
||
|
||
var isConfigured: Bool {
|
||
!baseURL.isEmpty && !apiKey.isEmpty && !model.isEmpty
|
||
}
|
||
}
|
||
|
||
final class Config {
|
||
static let shared = Config()
|
||
|
||
private init() {}
|
||
|
||
private let defaults = UserDefaults.standard
|
||
|
||
private enum Keys {
|
||
static let language = "recognition_language"
|
||
static let triggerMode = "trigger_mode"
|
||
|
||
// 输入模式 LLM(语音输入纠错)
|
||
static let inputLLMEnabled = "input_llm_enabled"
|
||
static let inputLLMBaseURL = "input_llm_base_url"
|
||
static let inputLLMAPIKey = "input_llm_api_key"
|
||
static let inputLLMModel = "input_llm_model"
|
||
|
||
// 助手模式 LLM(AI 助手对话)
|
||
static let assistLLMEnabled = "assist_llm_enabled"
|
||
static let assistLLMBaseURL = "assist_llm_base_url"
|
||
static let assistLLMAPIKey = "assist_llm_api_key"
|
||
static let assistLLMModel = "assist_llm_model"
|
||
}
|
||
|
||
var language: RecognitionLanguage {
|
||
get {
|
||
guard let raw = defaults.string(forKey: Keys.language),
|
||
let lang = RecognitionLanguage(rawValue: raw) else {
|
||
return .chineseSimplified
|
||
}
|
||
return lang
|
||
}
|
||
set {
|
||
defaults.set(newValue.rawValue, forKey: Keys.language)
|
||
}
|
||
}
|
||
|
||
// MARK: - 触发模式(菜单栏切换)
|
||
|
||
var triggerMode: TriggerMode {
|
||
get {
|
||
guard let raw = defaults.string(forKey: Keys.triggerMode),
|
||
let mode = TriggerMode(rawValue: raw) else {
|
||
return .input
|
||
}
|
||
return mode
|
||
}
|
||
set {
|
||
defaults.set(newValue.rawValue, forKey: Keys.triggerMode)
|
||
}
|
||
}
|
||
|
||
// MARK: - 输入模式配置(语音输入纠错)
|
||
|
||
var inputLLM: LLMConfig {
|
||
get {
|
||
LLMConfig(
|
||
enabled: defaults.bool(forKey: Keys.inputLLMEnabled),
|
||
baseURL: defaults.string(forKey: Keys.inputLLMBaseURL) ?? "",
|
||
apiKey: defaults.string(forKey: Keys.inputLLMAPIKey) ?? "",
|
||
model: defaults.string(forKey: Keys.inputLLMModel) ?? ""
|
||
)
|
||
}
|
||
set {
|
||
defaults.set(newValue.enabled, forKey: Keys.inputLLMEnabled)
|
||
defaults.set(newValue.baseURL, forKey: Keys.inputLLMBaseURL)
|
||
defaults.set(newValue.apiKey, forKey: Keys.inputLLMAPIKey)
|
||
defaults.set(newValue.model, forKey: Keys.inputLLMModel)
|
||
}
|
||
}
|
||
|
||
// 兼容旧版本
|
||
var llmEnabled: Bool {
|
||
get { inputLLM.enabled }
|
||
set {
|
||
var cfg = inputLLM
|
||
cfg.enabled = newValue
|
||
inputLLM = cfg
|
||
}
|
||
}
|
||
|
||
var llmBaseURL: String {
|
||
get { inputLLM.baseURL }
|
||
set {
|
||
var cfg = inputLLM
|
||
cfg.baseURL = newValue
|
||
inputLLM = cfg
|
||
}
|
||
}
|
||
|
||
var llmAPIKey: String {
|
||
get { inputLLM.apiKey }
|
||
set {
|
||
var cfg = inputLLM
|
||
cfg.apiKey = newValue
|
||
inputLLM = cfg
|
||
}
|
||
}
|
||
|
||
var llmModel: String {
|
||
get { inputLLM.model }
|
||
set {
|
||
var cfg = inputLLM
|
||
cfg.model = newValue
|
||
inputLLM = cfg
|
||
}
|
||
}
|
||
|
||
var isLLMConfigured: Bool { inputLLM.isConfigured }
|
||
|
||
// MARK: - Control 键模式配置(AI 助手)
|
||
|
||
var assistLLM: LLMConfig {
|
||
get {
|
||
LLMConfig(
|
||
enabled: defaults.bool(forKey: Keys.assistLLMEnabled),
|
||
baseURL: defaults.string(forKey: Keys.assistLLMBaseURL) ?? "",
|
||
apiKey: defaults.string(forKey: Keys.assistLLMAPIKey) ?? "",
|
||
model: defaults.string(forKey: Keys.assistLLMModel) ?? ""
|
||
)
|
||
}
|
||
set {
|
||
defaults.set(newValue.enabled, forKey: Keys.assistLLMEnabled)
|
||
defaults.set(newValue.baseURL, forKey: Keys.assistLLMBaseURL)
|
||
defaults.set(newValue.apiKey, forKey: Keys.assistLLMAPIKey)
|
||
defaults.set(newValue.model, forKey: Keys.assistLLMModel)
|
||
}
|
||
}
|
||
|
||
func getLLMConfig(for mode: LLMMode) -> LLMConfig {
|
||
switch mode {
|
||
case .input: return inputLLM
|
||
case .assist: return assistLLM
|
||
}
|
||
}
|
||
|
||
func setLLMConfig(_ config: LLMConfig, for mode: LLMMode) {
|
||
switch mode {
|
||
case .input: inputLLM = config
|
||
case .assist: assistLLM = config
|
||
}
|
||
}
|
||
}
|