feat(AI): 切换模型下载源至魔搭官方仓库

- 添加 modelScopeRepo 函数,为不同模型类型配置魔搭官方仓库ID
- 修改 fileURL 函数,主模型(MNN/MLX)优先使用魔搭官方源,
  已废弃的VL模型回退自建镜像
- 更新文档注释,说明魔搭OSS支持Range请求和断点续传特性

refactor(i18n): 优化AI相关界面文本和提示信息

- 新增数值验证相关的国际化字符串
- 调整AI整理失败提示文案,更明确表达原意
- 更新AI解读不可用提示,引导用户前往模型管理页面
- 补充删除操作的相关确认提示文本
- 添加录音权限错误提示和识别失败重试建议

chore(i18n): 清理过时的解析失败提示文本
```
This commit is contained in:
link2026
2026-06-17 09:00:09 +08:00
parent de19d7abcd
commit 52db6fb85a
2 changed files with 67 additions and 8 deletions

View File

@@ -11,10 +11,21 @@ struct ModelFile: Equatable, Sendable {
/// ,
/// docs/superpowers/specs/2026-05-29-model-download-design.md A
nonisolated enum ModelManifest {
/// Caddy ( HTTPS )
/// Caddy `.vl`(,)退; / MLX
/// IP( App ATS ): http://101.132.124.52:5244/
static let baseURL = URL(string: "https://file.myv0.com/")!
/// (ModelScope) id;`resolve/master` 302 OSS,
/// OSS Range,穿( 206 + )(2026-06 )
/// :MNN `MNN`( HuggingFace taobao-mnn);MLX 沿 mlx-community
static func modelScopeRepo(for kind: ModelKind) -> String? {
switch kind {
case .mnnLLM: return "MNN/Qwen3.5-2B-MNN"
case .llm: return "mlx-community/Qwen3.5-2B-4bit"
case .vl: return nil // , / ,
}
}
static func files(for kind: ModelKind) -> [ModelFile] {
switch kind {
case .llm:
@@ -79,9 +90,14 @@ nonisolated enum ModelManifest {
files(for: kind).reduce(0) { $0 + $1.bytes }
}
/// URL = baseURL / <> / <>
/// URL MNN / MLX `resolve/master`;
/// `.vl` 退()
static func fileURL(for kind: ModelKind, file: ModelFile) -> URL {
baseURL
if let repo = modelScopeRepo(for: kind) {
return URL(string: "https://modelscope.cn/models/\(repo)/resolve/master/")!
.appendingPathComponent(file.path)
}
return baseURL
.appendingPathComponent(kind.rawValue, isDirectory: true)
.appendingPathComponent(file.path)
}