feat(iOS): 更新MNN后端模型配置优化性能 将MNN主模型从Qwen3.5-4B(~2.64GiB)降级为Qwen3.5-2B(~1.1GiB),因为4B版本 实测运行过慢,影响用户体验。iPhone17+/SME2设备使用2B模型,保留MLX 兜底方案用于模拟器和备用场景,确保AI推理性能和存储效率的平衡。 ```
93 lines
3.3 KiB
Swift
93 lines
3.3 KiB
Swift
import Foundation
|
|
import Observation
|
|
|
|
/// 「身体档案」里的快捷问答:点一下把一句常用问题填进输入框。
|
|
/// 内置 3 条(不可删),用户可自定义追加(可删)。
|
|
struct QuickPrompt: Identifiable, Codable, Equatable {
|
|
let id: UUID
|
|
var title: String // chip 上显示的短标签
|
|
var prompt: String // 点击后填入输入框的完整问题
|
|
var isBuiltin: Bool
|
|
|
|
init(id: UUID = UUID(), title: String, prompt: String, isBuiltin: Bool) {
|
|
self.id = id
|
|
self.title = title
|
|
self.prompt = prompt
|
|
self.isBuiltin = isBuiltin
|
|
}
|
|
}
|
|
|
|
/// 快捷问答存储:内置常量 + 自定义条目(UserDefaults JSON,无 SwiftData schema 迁移风险)。
|
|
/// 自定义条目只是 UI 便利项、不是健康记录,故不进 SwiftData。
|
|
@Observable
|
|
final class QuickPromptStore {
|
|
static let shared = QuickPromptStore()
|
|
|
|
private let defaults = UserDefaults.standard
|
|
private let storageKey = "kk.quickPrompts.custom.v1"
|
|
|
|
private(set) var custom: [QuickPrompt]
|
|
|
|
private init() {
|
|
if let data = defaults.data(forKey: storageKey),
|
|
let decoded = try? JSONDecoder().decode([QuickPrompt].self, from: data) {
|
|
custom = decoded
|
|
} else {
|
|
custom = []
|
|
}
|
|
}
|
|
|
|
/// 内置在前、自定义在后,供 chip 行展示。
|
|
var all: [QuickPrompt] { Self.builtins + custom }
|
|
|
|
/// 追加一条自定义问答。空白忽略;标签自动取问题前几个字。
|
|
func add(prompt rawPrompt: String) {
|
|
let trimmed = rawPrompt.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
guard !trimmed.isEmpty else { return }
|
|
custom.append(QuickPrompt(title: Self.deriveTitle(trimmed),
|
|
prompt: trimmed,
|
|
isBuiltin: false))
|
|
persist()
|
|
}
|
|
|
|
/// 删除一条自定义问答(内置不可删)。
|
|
func delete(_ p: QuickPrompt) {
|
|
guard !p.isBuiltin else { return }
|
|
custom.removeAll { $0.id == p.id }
|
|
persist()
|
|
}
|
|
|
|
private func persist() {
|
|
if let data = try? JSONEncoder().encode(custom) {
|
|
defaults.set(data, forKey: storageKey)
|
|
}
|
|
}
|
|
|
|
/// 自定义条目的短标签:压成单行,取前 8 个字,超出补省略号。
|
|
static func deriveTitle(_ prompt: String) -> String {
|
|
let oneLine = prompt.replacingOccurrences(of: "\n", with: " ")
|
|
.trimmingCharacters(in: .whitespaces)
|
|
let head = oneLine.prefix(8)
|
|
return oneLine.count > 8 ? "\(head)…" : String(head)
|
|
}
|
|
|
|
/// 内置 3 条(首屏):覆盖「就诊 / 解读 / 速查」三类,数据依赖稳、不碰诊断红线。
|
|
static let builtins: [QuickPrompt] = [
|
|
QuickPrompt(
|
|
title: "就诊摘要",
|
|
prompt: "根据我最近的身体症状,结合历史指标,整理一份让门诊医生快速了解我情况的就诊摘要。",
|
|
isBuiltin: true
|
|
),
|
|
QuickPrompt(
|
|
title: "趋势解读",
|
|
prompt: "把我血压最近半年的变化讲清楚:是变好还是变差、要注意什么。",
|
|
isBuiltin: true
|
|
),
|
|
QuickPrompt(
|
|
title: "速答清单",
|
|
prompt: "把我的过敏史、正在吃的药、慢性病整理成一句话清单,方便就诊时快速回答医生。",
|
|
isBuiltin: true
|
|
),
|
|
]
|
|
}
|