feat(AI): MNN 模型纳入下载体系 ModelKind.mnnLLM(Phase 4)
文本 MNN 模型用 taobao-mnn/Qwen3.5-2B-MNN 官方预转换格式(~1.10GiB), 不再从头转换(避开多模态转文本风险,官方转更可靠)。 - ModelStore.ModelKind 新增 .mnnLLM = "Qwen3.5-2B-MNN" - ModelManifest:.mnnLLM 文件清单(config.json/llm_config.json/llm.mnn/ llm.mnn.weight 1.1GB/tokenizer.txt/visual.mnn,HF API 实测字节) - AIRuntime:mnnModelFolder + 就绪判定改走 ModelStore.isComplete(.mnnLLM) - ModelManagementView:subtitle 加 .mnnLLM 文案(仅此一处,未动其它 WIP) - ModelManifestTests:+4 条 mnnLLM 断言(文件数/总字节/必需文件/URL) 模拟器 ModelManifestTests TEST SUCCEEDED。下载经现有链路,需上传到 file.myv0.com/Qwen3.5-2B-MNN/(CDN 清单随附)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -38,7 +38,7 @@ actor AIRuntime {
|
||||
private(set) var mnnStatus: Status = .notReady
|
||||
/// MNN 模型目录(下载/旁路导入到 Models/Qwen3.5-2B-MNN)。
|
||||
nonisolated static var mnnModelFolder: URL {
|
||||
ModelStore.shared.rootURL.appendingPathComponent("Qwen3.5-2B-MNN", isDirectory: true)
|
||||
ModelStore.shared.localURL(for: .mnnLLM)
|
||||
}
|
||||
|
||||
// MARK: - 串行推理闸门(§3.1 OOM 防护的真正落地)
|
||||
@@ -92,8 +92,7 @@ actor AIRuntime {
|
||||
func prepare() async throws {
|
||||
// 选了 MNN 且模型已就绪才走 MNN;否则(选 MLX,或 MNN 模型尚未下载)回退 MLX,
|
||||
// 保证过渡期 App 始终可用。引擎指示器(Phase 5)展示实际生效后端。
|
||||
let mnnReady = FileManager.default.fileExists(
|
||||
atPath: Self.mnnModelFolder.appendingPathComponent("config.json").path)
|
||||
let mnnReady = ModelStore.shared.isComplete(for: .mnnLLM)
|
||||
if InferenceEngine.current == .mnn, mnnReady {
|
||||
try await prepareMNN()
|
||||
return
|
||||
@@ -147,8 +146,7 @@ actor AIRuntime {
|
||||
if mnnStatus == .ready { return }
|
||||
|
||||
let folder = Self.mnnModelFolder
|
||||
let config = folder.appendingPathComponent("config.json").path
|
||||
guard FileManager.default.fileExists(atPath: config) else {
|
||||
guard ModelStore.shared.isComplete(for: .mnnLLM) else {
|
||||
mnnStatus = .error("MNN 模型未就绪")
|
||||
throw AIRuntimeError.notReady
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user