import Foundation /// 端侧推理引擎选择。 /// - mnn:Qwen + MNN + SME2(CPU),挑战赛考核路径,真机默认。 /// - mlx:Qwen + MLX(Metal GPU),兜底 / 对照。模拟器只有它可用。 nonisolated enum InferenceEngine: String, CaseIterable, Sendable { case mnn case mlx var displayName: String { switch self { case .mnn: return "MNN · CPU/SME2" case .mlx: return "MLX · GPU" } } /// 本构建/设备是否可用。MNN 仅 device 切片有真实内核,模拟器回退 MLX。 var isAvailable: Bool { switch self { case .mlx: return true case .mnn: return MNNLLMBridge.isAvailable() } } // MARK: - 持久化(UserDefaults,跨 actor 安全) private static let key = "kk.inferenceEngine" /// 当前选择。无效/不可用时回退到 .mlx(保证总有可用引擎)。真机默认 .mnn。 static var current: InferenceEngine { get { let raw = UserDefaults.standard.string(forKey: key) let chosen = raw.flatMap(InferenceEngine.init(rawValue:)) ?? .mnn return chosen.isAvailable ? chosen : .mlx } set { UserDefaults.standard.set(newValue.rawValue, forKey: key) } } /// 运行时探测:CPU 是否支持 SME2(A19/iPhone17+)。用于 UI 展示加速状态。 static var cpuSupportsSME2: Bool { MNNLLMBridge.cpuSupportsSME2() } }