根据提供的code differences信息,我发现没有具体的代码变更内容。因此生成一个通用的commit message:
``` docs(readme): 更新文档说明 - 添加项目使用说明 - 完善配置指南 ``` 注意:由于未提供具体的代码差异信息,以上为示例格式。请提供实际的代码变更内容以生成准确的commit message。
This commit is contained in:
@@ -1,10 +1,9 @@
|
||||
import SwiftUI
|
||||
|
||||
/// 推理引擎设置:本项目已切 Gemma-3n(端侧 4bit),主模型只走 MLX/GPU。
|
||||
/// MNN/SME2 路径已停用(Gemma-3n 无 MNN 转换模型),引擎行保留但 MNN 置灰。
|
||||
/// 切换只改持久化选择;下一次 AI 调用(prepare/generate)按新引擎加载。
|
||||
/// 推理引擎设置:本项目主模型 Gemma-3n(端侧 4bit),**端侧统一走 MLX/GPU**。
|
||||
/// MNN/SME2 LLM 引擎已移除(Gemma-3n 无 MNN 转换模型),不再提供引擎选择——
|
||||
/// 端侧只此一种,页面改为展示当前端侧后端 + 性能自检 + 云端 AI 开关。
|
||||
struct InferenceSettingsView: View {
|
||||
@AppStorage("kk.inferenceEngine") private var engineRaw = EnginePreference.auto.rawValue
|
||||
// 云端 AI(Gemini)开关与 key —— 键名与 CloudAI 对齐,@AppStorage 写入即被后端读到。
|
||||
@AppStorage("cloud_ai_gemini_enabled") private var cloudEnabled = false
|
||||
@AppStorage("cloud_ai_gemini_key") private var cloudKey = ""
|
||||
@@ -12,10 +11,6 @@ struct InferenceSettingsView: View {
|
||||
/// 性能自检改为当前页就地展开,不再 push 新页面。
|
||||
@State private var showSelfTest = false
|
||||
|
||||
private var selected: EnginePreference {
|
||||
EnginePreference(rawValue: engineRaw) ?? .auto
|
||||
}
|
||||
|
||||
/// 性能自检需要主模型(Gemma-3n,MLX)就绪。
|
||||
private var modelReady: Bool {
|
||||
modelService.states[.llm]?.phase == .ready
|
||||
@@ -33,9 +28,7 @@ struct InferenceSettingsView: View {
|
||||
.padding(.top, 4)
|
||||
.padding(.bottom, 6)
|
||||
|
||||
ForEach(EnginePreference.allCases, id: \.self) { engine in
|
||||
engineRow(engine)
|
||||
}
|
||||
localEngineCard
|
||||
|
||||
selfTestSection
|
||||
cloudSection
|
||||
@@ -48,6 +41,35 @@ struct InferenceSettingsView: View {
|
||||
.onAppear { modelService.refreshStates() }
|
||||
}
|
||||
|
||||
/// 端侧后端信息卡(只此一种,不可切换):MLX · Metal GPU,端侧 Gemma-3n E2B。
|
||||
private var localEngineCard: some View {
|
||||
HStack(spacing: 12) {
|
||||
ZStack {
|
||||
Circle().fill(Tj.Palette.amber.opacity(0.25))
|
||||
Image(systemName: "bolt.fill")
|
||||
.font(.tjScaled(18))
|
||||
.foregroundStyle(Tj.Palette.ink)
|
||||
}
|
||||
.frame(width: 44, height: 44)
|
||||
|
||||
VStack(alignment: .leading, spacing: 2) {
|
||||
Text("MLX · GPU")
|
||||
.font(.tjScaled(15, weight: .semibold))
|
||||
.foregroundStyle(Tj.Palette.text)
|
||||
Text("Metal GPU · 端侧推理 Gemma-3n E2B")
|
||||
.font(.tjScaled(12))
|
||||
.foregroundStyle(Tj.Palette.text3)
|
||||
.lineLimit(2)
|
||||
}
|
||||
Spacer()
|
||||
Image(systemName: "checkmark.circle.fill")
|
||||
.font(.tjScaled(18))
|
||||
.foregroundStyle(Tj.Palette.leaf)
|
||||
}
|
||||
.padding(14)
|
||||
.tjCard()
|
||||
}
|
||||
|
||||
/// 性能自检入口:它是「动作/工具」而非引擎选择,所以做成描边动作按钮(TjGhostButton),
|
||||
/// 从视觉类别上和上方引擎/状态卡区分开。模型未就绪时禁用并给出下载提示而非死链。
|
||||
@ViewBuilder
|
||||
@@ -97,75 +119,6 @@ struct InferenceSettingsView: View {
|
||||
}
|
||||
}
|
||||
|
||||
private func engineRow(_ engine: EnginePreference) -> some View {
|
||||
let available = isAvailable(engine)
|
||||
let isOn = (selected == engine)
|
||||
return Button {
|
||||
guard available else { return }
|
||||
engineRaw = engine.rawValue
|
||||
} label: {
|
||||
HStack(spacing: 12) {
|
||||
ZStack {
|
||||
Circle().fill(isOn ? Tj.Palette.amber.opacity(0.25) : Tj.Palette.sand2)
|
||||
Image(systemName: iconName(engine))
|
||||
.font(.tjScaled(18))
|
||||
.foregroundStyle(isOn ? Tj.Palette.ink : Tj.Palette.text2)
|
||||
}
|
||||
.frame(width: 44, height: 44)
|
||||
|
||||
VStack(alignment: .leading, spacing: 2) {
|
||||
Text(engine.displayName)
|
||||
.font(.tjScaled(15, weight: .semibold))
|
||||
.foregroundStyle(Tj.Palette.text)
|
||||
Text(subtitle(engine, available: available))
|
||||
.font(.tjScaled(12))
|
||||
.foregroundStyle(Tj.Palette.text3)
|
||||
.lineLimit(2)
|
||||
}
|
||||
Spacer()
|
||||
if isOn {
|
||||
Image(systemName: "checkmark.circle.fill")
|
||||
.font(.tjScaled(18))
|
||||
.foregroundStyle(Tj.Palette.leaf)
|
||||
}
|
||||
}
|
||||
.padding(14)
|
||||
.tjCard()
|
||||
.opacity(available ? 1 : 0.45)
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
.disabled(!available)
|
||||
}
|
||||
|
||||
/// .auto 永远可用;MLX 看自身可用性。MNN 已停用(Gemma-3n 无 MNN 模型),恒置灰。
|
||||
private func isAvailable(_ engine: EnginePreference) -> Bool {
|
||||
switch engine {
|
||||
case .auto: return true
|
||||
case .mnn: return false
|
||||
case .mlx: return InferenceEngine.mlx.isAvailable
|
||||
}
|
||||
}
|
||||
|
||||
private func iconName(_ engine: EnginePreference) -> String {
|
||||
switch engine {
|
||||
case .auto: return "wand.and.stars"
|
||||
case .mnn: return "cpu.fill"
|
||||
case .mlx: return "bolt.fill"
|
||||
}
|
||||
}
|
||||
|
||||
private func subtitle(_ engine: EnginePreference, available: Bool) -> String {
|
||||
switch engine {
|
||||
case .auto:
|
||||
// 已切 Gemma-3n,auto 恒解析为 MLX。
|
||||
return String(appLoc: "按本机配置选择 · 当前 MLX · GPU")
|
||||
case .mnn:
|
||||
return String(appLoc: "已停用:Gemma-3n 无 MNN 转换模型,统一走 MLX")
|
||||
case .mlx:
|
||||
return String(appLoc: "Metal GPU · 端侧推理 Gemma-3n E2B")
|
||||
}
|
||||
}
|
||||
|
||||
private var cloudConfigured: Bool {
|
||||
cloudEnabled && !cloudKey.trimmingCharacters(in: .whitespaces).isEmpty
|
||||
}
|
||||
|
||||
@@ -167,12 +167,8 @@ struct MeView: View {
|
||||
.buttonStyle(.plain)
|
||||
}
|
||||
|
||||
private var engineDetail: String {
|
||||
switch InferenceEngine.current {
|
||||
case .mnn: return InferenceEngine.cpuSupportsSME2 ? "MNN · SME2" : "MNN · CPU"
|
||||
case .mlx: return "MLX · GPU"
|
||||
}
|
||||
}
|
||||
/// 端侧统一走 MLX/GPU(Gemma-3n E2B);MNN/SME2 LLM 引擎已移除。
|
||||
private var engineDetail: String { "MLX · GPU" }
|
||||
|
||||
private var languageCard: some View {
|
||||
NavigationLink {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import SwiftUI
|
||||
|
||||
/// 性能自检:跑固定 prompt,展示当前后端(MNN·SME2 / MNN·NEON / MLX·GPU)的
|
||||
/// prefill / decode 实测速度,并按后端存档对比 —— 挑战赛考核点的可见证据(§12 卖点 2/6)。
|
||||
/// 性能自检:跑固定 prompt,展示当前端侧后端(MLX·GPU,Gemma-3n E2B)的
|
||||
/// prefill / decode 实测速度,并按后端存档对比 —— 端侧推理性能的可见证据(§12 卖点 2/6)。
|
||||
struct ModelSelfTestView: View {
|
||||
@State private var output = ""
|
||||
@State private var phase: Phase = .idle
|
||||
|
||||
Reference in New Issue
Block a user