预发布/持续构建版本:这是一个实验性构建版本,并非稳定版本。
ui : 从 HF Hub 发现并下载模型 (#29584) * common : 解析 - 下载标签并列出已缓存的 sidecar 文件 现在当没有模型文件匹配 Q4_0-mtp 风格的标签时,会解析对应的 sidecar 文件,因此单独的 draft 或 mmproj 下载会真正拉取该文件。已缓存的 sidecar 文件会作为独立条目列出,以便状态在重启后保留,删除此类标签只会删除对应的 sidecar。 Assisted-by: pi:zai-org/GLM-5.3 * ui : 在 markdown 中可选地渲染经过净化的原始 HTML 为 MarkdownContent 添加 allowHtml 属性:markdown 中的原始 HTML 在经过 DOMPurify 净化后直接渲染,而不是被转义为字面文本。默认行为仍为转义。 Assisted-by: pi:GLM-5.3-Flash * ui : 添加发现模型的组件 Discover 界面:包含搜索和骨架屏的精选目录列表,带有 readme、元数据、 Hub 统计数据和下载选项的详情面板,以及替代普通进度条的独立下载进度条。 量化下载按钮通过新增的 xs 触发器来设置其选择框的尺寸,因此该选择框获得 了这一尺寸以及柔和的边框外观。当仓库获取失败时,store 保持未完成状态, 以便下次挂载时重试。 Assisted-by: pi:llama.cpp/DeepSeek-V4.1-Flash * ui : 将发现视图放入模型管理器 管理器对话框新增了第二个视图:点击 Discover Models 操作按钮后,表格淡出, 带指南针标记的标题随之滑动,发现界面淡入;点击箭头按钮可返回表格。 Assisted-by: pi:llama.cpp/DeepSeek-V4.1-Flash # Conflicts: # tools/ui/src/lib/components/ui/button/button.svelte * ui : 添加 Enable Discover Models 设置 该开关控制浏览和下载 HuggingFace GGUF 模型的功能,因此它声明在 discover 层;上层管理器层中的仓库树查找会从此处读取该设置。 Assisted-by: pi:llama.cpp/DeepSeek-V4.1-Flash * ui : 从暂停点恢复模型下载 已停止的下载会保留其部分文件而不是删除它,因此重新提交该标签即可恢复 从磁盘。现在第一条进度记录会携带恢复偏移量,暂停的快照会延续到恢复后的条目中,且暂停一经请求即刻生效。 Assisted-by: pi * ui : 在发现列表中置顶下载项 发现侧边栏将正在运行的下载列在推荐模型之上,并在查询激活时退让。已暂停的下载会保留在管理器表格中,可在其中恢复或删除。 Assisted-by: pi * ui : 使恢复已暂停的下载生效 重新提交已暂停下载的标签会命中路由器的“已存在”检查,因为已暂停的下载在下一次刷新前会将其条目标记为 DOWNLOADED:现在未被运行的下载条目会被替换并恢复。当请求仍然失败时,UI 会保留已暂停的行,而不是将其删除并显示为已完成。 Assisted-by: pi * ui : 记住未完成的模型下载 不完整的文件以其内容哈希命名,因此路由器重启后,磁盘上没有任何信息表明它属于哪个模型。路由器现在会保存它启动的下载的标签,在下载完成或被删除时清除标签,并将剩余的列为仍在下载中而不启动任何任务。UI 在每次列表获取时将这些标签视为已暂停,因此刷新或新开页面会显示未完成的下载,并可以从磁盘上已有的文件恢复它。 Assisted-by: pi * ui : 在芯片上显示已暂停下载的状态 已暂停的量化芯片在静止时显示为已暂停,就像运行中的芯片显示其转圈动画一样,并在悬停时提供恢复操作。选择器的下载行在其取消按钮旁增加了一个在发现中查看操作。 Assisted-by: pi * ui : 默认折叠下载选项 可复制的下载命令默认折叠,以便让选项行处于首位;展开它仍然只需一次点击。 Assisted-by: pi * ui : 将决策模型排除在中心列表之外 决策模型以校准后的概率而非文本作答,因此 llama-ui 无法运行它们:中心数据层将它们从 目录,以及每一次搜索,均按决策模型标签或文本分类流水线进行键控。 Assisted-by: pi * ui : 将下载标签读取为 quant 与 sidecar 现在 `:-` 标签会解析为其 quant 和 sidecar,而不再是单个不透明的 quant token,并且 ModelsService.draftSidecarsByRepo 会按 repo 收集路由器列表中仅含 sidecar 的条目,取代模型存储中的内联副本。 Assisted-by: pi * ui : 将 draft 下载归组到其主模型之下 被跟踪的下载按 repo 分组:主权重领先,draft sidecar 作为紧凑的子行嵌入其条目内,在选择器、发现列表和管理器表格中均如此。主模型的控件可暂停、恢复和取消整个簇,管理器的下载行可选中进入配置面板。 Assisted-by: pi * ui : 从表格行对被跟踪的下载进行操作 表格将其簇的 draft 子行传递给模型行。一行的操作会级联暂停和恢复,进行中的行提供 Cancel download,暂停的行保留 Delete from disk,确认对话框的文案随状态变化。 Assisted-by: pi * ui : 为下载提供专属的配置面板 选中一个被跟踪的下载会以下载模式打开该面板:实时的暂停、恢复和取消进度,以及 See in Discover,而不是一个没有文件的模型无法提供的元数据和加载操作。 Assisted-by: pi * ui : 让发现详情自取数据并具备响应式 ModelsDiscoverDetailsContainer 负责详情、树和 readme 的获取,以便发现视图之外的宿主也能渲染该面板,且详情布局通过容器查询适配窄面板,而非视口断点。 Assisted-by: pi * ui : 随主模型一起下载匹配的 draft 主 quant 下载现在会以即发即忘方式拉取 repo 提供的最优先类型的 quant 匹配 draft(DFlash 先于 MTP),这样当主模型下载完成时推测解码已就绪。手动 draft 芯片仍然可用;选项 行在窄面板中也会折叠为单列。 Assisted-by: pi * ui : 默认关闭 discover 并将其与 hub 设置耦合 Discover Models 默认不勾选。启用它会打开 Hugging Face Hub 设置,禁用它会将其重新关闭,因此该复选框从不说谎;discover 关闭时,hub 设置仍可独立用于显示数据。加载时以同样方式纠正存储和重置状态。 Assisted-by: pi * ui : 在管理器视图上打开管理模型对话框 对话框现在在管理器上打开,而不是返回上一个视图;在设置允许的情况下,discover 条目仍然落在发现视图上,且 discover 界面跟随该设置的状态。 Assisted-by: pi * ui : 为发现搜索框的焦点环留出空间 固定搜索栏从面板边缘内缩,使焦点环保持在滚动容器内,并且行在不透明栏后面滚动而不是穿过它。 Assisted-by: pi * common: 在列表中确定 sidecar 名称并丢弃未完成的分部 中缀或末尾的 sidecar token 具有歧义:draft heads 会用到它(Model-MTP-BF16.gguf),内嵌 heads 的完整模型也会用到它(Model-Q8D-MTP.gguf)。这样的名称只有紧跟在同家族无 token 的主权重旁时才是 sidecar,而名称中任意位置的 mmproj 或 imatrix,或前导 token,可单独决定(mmproj_f16.gguf)。 quant 标签总是带有其位数,因此以非 quant 命名的 sidecar(mtp-Model-it.gguf)会获得裸标签:列表、计划和删除都使用它。imatrix 标签会解析为其自身的计划槽位,会被下载但从不接入参数。 remove 以与下载相同的方式解析该标签,并删除每个计划 blob 的分部文件,因此取消正在运行的下载或清理先前运行遗留的未完成下载,磁盘上不会留下任何东西。路由器在调用期间传递其 token 并释放其锁,并以原子写入记录未完成的下载。 llama download 在 仅含 sidecar 的计划上成功并打印其路径。 * ui : 将对话框视图和 draft 状态移入枚举与常量 模型对话框的视图成为 ModelsDialogView 枚举,draft 子行的状态并入 ModelRowDownloadState,视图淡化和复制反馈重置移至 ui 常量,对话框的罗盘标记来自 DISCOVER_ICON。 Assisted-by: pi * ui : 移除未使用的 discover 界面 死代码 openDiscoverModels 孪生函数、被注释掉的命令分隔线、详情面板未使用的 onClose 及其标题栏的关闭按钮,以及一个多余的类型转换被移除;命令的复制反馈改用共享的重置常量。 Assisted-by: pi * ui : 精简下载选项注释并突出聊天模板 选项面板及其芯片所承载的冗长注释缩减为不明显的缘由,聊天模板对话框通过 SyntaxHighlightedCode 以 jinja 渲染,而不是普通的 pre 块。 Assisted-by: pi * common: 只有 .gguf 文件才是 sidecar,mmproj/imatrix 按完整单词匹配 一个命名为 sidecar 样式的非 GGUF 文件(quantization-mmproj-Q8_0.json)会被选为 mmproj,而模型名称较长单词内部的 sidecar 词(Phi-2-OmniMatrix.i1-Q4_K_M.gguf)会导致模型被丢弃。 * ui: 按 quant 去重 draft sidecar 徽章 draft sidecar 徽章在不考虑 quant 的情况下按类型和 repo 去重,因此当 draft 以两个 quant 缓存时只剩一个徽章,而删除另一个主 quant 时找不到徽章来移除其 sidecar。同时恢复了在 clusters 方法落在其上方时丢失的 getDownloadEntries 文档。 Assisted-by: pi (zai-org/GLM-5.3-Flash) * ui: 采用 incomplete 下载状态并弃用 paused-ids 注册表 存储从一个它没有本地状态的下载中条目推断出未完成的下载,这会把另一个标签页中运行的下载误读为已暂停,并提供服务器会拒绝的恢复操作。列表现在带有 "incomplete" 状态,因此采用逻辑直接以它为键。 暂停的 id 不再需要 保留在 localStorage 中:服务器在重启后仍然记住它们,而且进度快照在重新加载后本来就是过期的。过期的 localStorage 键已被移除。 Assisted-by: pi (zai-org/GLM-5.3-Flash) * ui: 对暂停和取消级联进行量化匹配 暂停、恢复和取消会级联到仓库的每个 draft sidecar,而删除只会影响量化匹配的那些,因此取消一个 Q4_0 下载也会杀死属于另一个量化主文件的 Q8_0 draft。现在每次级联都只作用于量化匹配的 draft,与删除所影响的内容保持一致。 Assisted-by: pi (zai-org/GLM-5.3-Flash) * ui: 合并重复的 draft 子行标记 已下载和进行中的分支重复了完全相同的连接符、标签和徽章标记;一个带条件尾部的代码块让两个状态保持同步。 Assisted-by: pi (zai-org/GLM-5.3-Flash) * ui: 从经过清理的模型卡片 html 中清除定位样式 style 属性对 KaTeX 输出保持允许,这让第三方卡片能够在应用上绘制一个固定覆盖层。清理钩子现在会丢弃 position:fixed 和 position:absolute 值,而不影响 KaTeX 布局样式。 Assisted-by: pi (zai-org/GLM-5.3-Flash) * ui: 让 discover 挂载时的 fetch 只运行一次并复用共享的 repoOf 辅助函数 fetch() 在挂载副作用内同步切换其加载标志,导致每次切换都会重新运行 fetch 并无休止地重试失败的目录仓库;现在该副作用不再追踪这次调用。本地的 repoOf 副本和重复的 services 导入被共享辅助函数取代。 Assisted-by: pi (zai-org/GLM-5.3-Flash) * ui: 将 spec-type 映射收窄到 draft sidecar SPEC_TYPE 为它从不用于索引的辅助 sidecar 携带了空条目;现在映射和命令组件通过 draftBadgeOf 辅助函数将徽章类型定义为 draft sidecar,而不是使用类型断言。 Assisted-by: pi (zai-org/GLM-5.3-Flash) * ui: 为决策模型标签和 markdown 缓存键命名 决策模型 hub 标签和流水线标签移入 huggingface 常量中,与其他流水线标签放在一起,并且 markdown 转换缓存前缀改用具名形式,取代了原本的单字母裸标记。 Assisted-by: pi (zai-org/GLM-5.3-Flash) * ui: 通过一个真值检查读取 discover 设置 有三处使用 !== false 读取该设置,一处使用 Boolean();现在这四处都以相同方式读取它。 Assisted-by: pi (zai-org/GLM-5.3-Flash) * ui: 将模型对话框视图与其枚举进行比较 模板在三处将视图状态与 'manage' 字面量进行比较,而脚本使用的是枚举。 Assisted-by: pi (zai-org/GLM-5.3-Flash) * nit: 移除 draft sidecar 徽章前的 `+` * server: 将未完成的下载列为 incomplete 一个从未完成的下载被报告为 "downloading",与正在进行的下载状态相同,因此客户端无法区分运行中的下载和已死掉的下载。unfinished-downloads 中记住的标签现在列在一个专门的 "incomplete" 状态下,不带实例。 Assisted-by: pi (zai-org/GLM-5.3-Flash) * server: 像 -hf 那样连同其 sidecar 一起下载模型 解析逻辑回归到 master。POST /models 接受要随模型一起拉取的 sidecar 种类(默认为 mmproj),下载子进程以 -hf 标志的形式接收它们,由服务器选择文件。/models 仅列出真实模型,每个模型列出其在磁盘上拥有的 sidecar,未完成的下载在重启后保留其 sidecar。已停止的下载会保留其部分文件供下次尝试使用,DELETE 通过下载所遵循的同一计划清除它们。 * ui: 将 sidecar 作为其模型的参数下载 下载选项保留其芯片,但芯片不再发布 sidecar 标签:store 将其映射到其模型和要拉取的 sidecar 种类,量化芯片在同一下载中带上其配套 draft,draft 徽章来自每个缓存模型所列出的 sidecar。 服务器在再次发布缓存模型时补上其缺少的 sidecar,DELETE 可移除缓存模型的单个 sidecar。 * ui : 在 draft 徽章中镜像服务器的 sidecar 查找逻辑 服务器通过权重所在目录中的大小写敏感的 `-` 标记来解析 sidecar。UI 之前对该标记的匹配过于宽松,因此徽章可能提供服务器永远不会拉取的 draft。 Assisted-by: DeepSeek-V4.1-Flash * ui : 在模型下载时附带提交其 sidecar 种类 store 为每个模型保留一个下载:芯片的种类随模型自身的 sidecar 一起提交,一个下载行不再为每个 sidecar 展开成单独一行。Draft 徽章目前不携带自己的量化,因此缓存模型的 sidecar 永远不会以模型的量化来标注。 Assisted-by: DeepSeek-V4.1-Flash * ui : 将量化的 draft 并入其下载芯片 每个量化一个芯片,其 draft 徽章显示在其中,其大小涵盖两个文件。该 draft 是服务器会选择的文件:同一目录、精确的量化,否则是最接近的位深,因此一个 4-bit 模型可以与一个 16-bit 头配对。 Assisted-by: DeepSeek-V4.1-Flash * ui : 从管理器和选择器中移除 draft 下载行 下载再次变为每个模型一行:draft 随之一起,行内容直接从列表中读取磁盘上的 sidecar,而不是将 sidecar 条目与其模型配对。暂停、恢复和取消作用于模型自身的下载。 Assisted-by: DeepSeek-V4.1-Flash * ui : 让 discover 下载列表每个模型保持一行 列表以每个正在下载的模型一行开头,其 sidecar 作为子行显示。一行只对服务器能够解析的 draft 种类显示徽章,因此徽章永远不会比其查找会选中的文件存在得更久。 Assisted-by: DeepSeek-V4.1-Flash * ui : 让 discover 芯片在深色模式下保持可读 元数据芯片、聊天模板按钮和 View on Hugging Face 链接在对话框背景上带有淡淡的边框且没有底色,因此几乎不可见。它们现在采用三级按钮底色,其图标大小随 size-* 变化,使变体的基础规则不会影响它们。 Assisted-by: DeepSeek-V4.1-Flash * ui : 携带 draft 通过下载选项 每个主量化一个芯片,上面带有其草稿标记以及芯片涵盖两个文件的下载状态。草稿位于一个可选的复选框之后,带有一个内联类型选择,且每一行打开自己的命令:它固定该行的量化并只命名草稿类型,因此 -hfd 已被移除。 Assisted-by: DeepSeek-V4.1-Flash * ui :使详情骨架与已加载面板对齐 与已加载视图相同的根内边距和容器上下文,因此容器查询的解析方式一致。下载选项卡片对其内部块而非其自身添加内边距,readme 获得自己的卡片,并用一行描述代替目录段落。 Assisted-by: DeepSeek-V4.1-Flash * common :丢弃已移除边车文件的残片 仅移除一个边车文件会遗留下载在 blobs/ 中为该边车文件规划的 .downloadInProgress 文件。移除操作通过与下载相同的计划清除它们,且测试覆盖了一个已完成的草稿与一个未完成的草稿并存的情况:未完成者的残片被清除,而模型保留其文件。 Assisted-by: DeepSeek-V4.1-Flash * server :说明下载被拒绝的原因 一个正在下载或正在运行的模型此前会回答"already exists"。现在它会说明是哪种情况:"is already downloading",或 "is running, unload it first",两者都在可恢复检查之前。路由器测试覆盖了这两种情况。 Assisted-by: DeepSeek-V4.1-Flash * ui :每次点击只发布一次下载 对同一芯片的两次快速点击会发布两次,而第二次的答案是"already exists"。存储将模型标记为待处理,在其待处理或请求进行中时提前返回,并在服务器应答前将其视为请求进行中,因此芯片立即显示下载。新的客户端测试固定了这些流程:双击只产生一次 POST,当列表报告该模型时芯片显示为已下载,恢复操作保留其边车文件,取消操作丢弃整个下载,以及重新加载恢复暂停状态。 Assisted-by: DeepSeek-V4.1-Flash * ui :保持普通下载行的高度与 其他 下载行的 sub-lines 包装器即使内容为空也会被渲染,因此其内边距使该行比普通行更高,叠加的进度条就落在那段空白区域。现在它仅在有 sub-lines 时才渲染,在选择器和发现列表中均是如此,并且选择器行采用了其相邻行的手机端内边距。 Assisted-by: DeepSeek-V4.1-Flash * ui : 对仓库的草稿只标记一次 已加载模型的参数与已缓存模型的列表会以不同措辞报告同一草稿,一个带有文件的量化信息,另一个只有种类名称,因此合同时两者都保留,仓库行将同一种类显示了两次。现在徽章按种类合并,以参数一方的为准,因为它知道量化信息,并且测试固定了一个真实仓库的两个来源。 Assisted-by: DeepSeek-V4.1-Flash * server : 报告预设或下载中途的 sidecar 预设中同时提到的模型被注册为预设,因此其草稿从未被报告,任何行都无法为其添加徽章。下载中途的也同样没有报告,尽管它所拉取种类的记录就在那里:现在这些记录优先于计划,计划通过预设的 hf-repo 解析,而 models 目录不参与其中。 Assisted-by: DeepSeek-V4.1-Flash * ui : 为下载的草稿添加徽章并从该行打开其模型 正在下载的草稿现在会为模型 id 添加徽章,与已落地的草稿一样,而磁盘上的草稿保留其已勾选的 sub-line。行本身可打开模型,其旁边的状态槽用于暂停或恢复,管理器会解析对下载行的聚焦,从而打开其面板。 Assisted-by: DeepSeek-V4.1-Flash * common : 报告仅有 partial 的已移除 sidecar 仅移除 sidecar 本身会丢弃 partial 清除的结果,因此一个仅以 .downloadInProgress blob 形式落地的 sidecar 会返回 false,UI 也就没有理由重新获取。现在清除结果被合并到返回值中,并且测试覆盖了仅有 partial 的移除情况。 Assisted-by: DeepSeek-V4.1-Flash * ui : 忽略 下载 POST 仍在进行中 在服务器响应之前,芯片显示为正在下载状态,因此快速的第二次点击 卸载了一个尚未开始的模型,并使该存储既不处于进行中也不处于暂停状态。 当 POST 处于挂起状态时,暂停操作会在触及 feed 或 paused 标记之前提前返回。 客户端测试保持 POST 打开并对其进行固定。 Assisted-by: DeepSeek-V4.1-Flash * ui : 将缺失的 draft 作为独立芯片提供 对于磁盘上已有但没有其 draft 的模型,之前无法添加 draft:量化芯片 携带了 draft,因此它看起来像是同时下载两者。现在量化芯片仅保持 其自身状态,其关联的 draft 只在随之下载或已在磁盘上时显示, 而缺少 draft 的已下载量化会获得一个自己的芯片——badge、size、 download——以该类型发布模型,这样服务器会保留磁盘上已有的文件 并拉取 draft。 Assisted-by: DeepSeek-V4.1-Flash * server : 根据磁盘上的文件列出暂停的 sidecar 下载 磁盘上一个 sidecar 下载已停止的模型会保留其未完成的记录, 而列表将该记录计划中的类型报告为仿佛已在磁盘上:UI 检查了一个 从未落盘的 draft,并且没有提供添加它的方式。 现在计划中的类型仅在该下载运行期间临时显示。 * chore: 清理注释 * server : 仅对能从 HF 仓库解析的模型列出 sidecars 本地文件上的预设没有 HF 仓库,但列表却将其名称当作仓库解析: 计划在无效的仓库格式上抛出异常,导致 GET /models 对所有模型都失败。 现在 sidecars 来自预设所指名的仓库或缓存模型所列出的仓库, 而本地文件列出时不包含它们。 * common : 修复下载取消回归问题 Signed-off-by: Adrien Gallouët * common : 在移除 sidecars 时保留模型的部分文件 Signed-off-by: Adrien Gallouët * server : 单一 sidecar 表和一个未完成下载类 响应 @ggerganov 的评审意见。 sidecar 类型统一存放在 common/download 中的一张表里,将每个名称映射到 其下载 option and plan file;服务器会验证它、通过它构建选项 并列出缓存的 sidecar,而不是使用自己的列表。 未完成的下载进入 server_unfinished_downloads,这是一个拥有自己互斥锁的记录, 每个条目对应一个结构体,server_models 通过 unfinished_downloads_get 和 unfinished_downloads_remove 将其暴露出来。 * common:一个 sidecar 表,以及保留共享文件的删除操作 解析、缓存列表和删除都遵循同一张 sidecar 类型表, 因此一种类型只需声明一次,包括其文件关键字、是否为草稿、 其选项文件和计划文件。服务器为它接受的类型、 默认 sidecar 和子进程标志读取同一张表。 删除一个 tag 会保留另一个缓存 tag 仍在加载的文件, 例如以被删除的量化命名的 mmproj。单独删除一个 sidecar 则会作用于解析它的每个 tag。 一个未完成的下载在开始时记录其分片文件的确切路径。 删除操作会不经询问 hub 直接删除这些文件,并保留另一个已记录下载 同样写入的分片。记录在子进程被启动后获取,文件在 models 锁下删除, 因此删除期间同一 tag 的下载无法启动。 * server:丢弃过期的分片,并拒绝解析不到任何内容的 tag 重新记录一次下载会删除新计划不再写入的较早记录的分片, 例如较早的 hub 修订版的分片,或新请求中省略的 sidecar 的分片。 一个解析不到仓库任何文件的已发布 tag 会在下载开始前被拒绝。 删除模型遵循单一路径,无论重新加载是否在等待期间删除了其条目。 * server:修复路由器下载测试之间的 CI 竞态 pytest 工作进程在一个共享缓存上并行运行,因此一个下载测试 可能找到另一个测试刚刚获取的文件而看不到进度, 或者从另一个测试写入的未完成下载记录开始。现在每个下载测试 都在自己的空缓存上运行。 * server:拒绝未知名称的 DELETE,并在 load() 中决定下载 对一个既不是模型也不是已记录下载的名称进行的 DELETE 会进入 common_download_remove,并且在没有 tag 的情况下会清除整个 仓库缓存,包括已加载量化的文件或正在下载中的文件。这样的名称 现在返回未找到,与之前一样。 一个在现有条目上进行下载的 POST 在锁外检查其状态, 因此其间对同一模型的加载会导致其实例被杀死。现在这些检查 在 load() 中、锁下、紧接启动之前运行。测试的伪造加载时间 仅适用于模型加载,因为下载工作进程不加载任何模型。 * server:在 /models API 中添加 incomplete_sidecars 一个添加到缓存模型然后暂停的 sidecar 保留了其记录, 但列表只显示完整的模型,因此新的 UI 丢失了暂停状态。现在模型条目 携带 incomplete_sidecars,即其未完成下载尚未写入的类型; 携带该类型的 POST 会恢复一个,携带它的 DELETE 会删除其分片。 * common:当恢复下载得到 416 时删除保留的分片 既然分片在多次尝试之间得以保留,一个旧的或完整的分片 会使每次重试都以相同的 416 失败。 删除它,以便下一次尝试可以从零开始。 Signed-off-by: Adrien Gallouët * common:当恢复下载得到 200 时删除保留的分片 一个忽略范围请求的服务器会对恢复请求回答 200, 保留的分片随后会像 416 一样使每次尝试以相同方式失败。也将其删除, 以便下一次尝试不带范围从头开始。 * server:拒绝与正在进行的下载共享分片的下载 两个共享文件的量化下载(mmproj 或按最接近位数选择的 mtp) 会追加到同一个分片并重命名包含交错字节的文件。 现在,一个计划写入的某个分片与正在运行的下载所写分片相同的下载 会被拒绝,直到那个下载完成。 * common:在恢复分片下载之前检查已保存的 etag 在恢复之前,将分片保存的 etag 与服务器当前提供的 etag 进行比较。如果它缺失或不同,则重新开始, 这样恢复的下载绝不会混合来自文件两个版本的字节。 Signed-off-by: Adrien Gallouët --------- Signed-off-by: Adrien Gallouët Co-authored-by: Pascal Co-authored-by: Adrien Gallouët网站: - https://llama.app
证明(Attestations): - https://github.com/ggml-org/llama.cpp/attestations/56975123
macOS/iOS: - macOS Apple Silicon (arm64) - macOS Apple Silicon (arm64, 启用 KleidiAI) DISABLED - macOS Intel (x64) - iOS XCFramework
Linux: - Ubuntu x64(CPU) - Ubuntu arm64(CPU) - Ubuntu s390x(CPU) - Ubuntu x64(Vulkan) - Ubuntu arm64(Vulkan) - Ubuntu x64(CUDA 12) - CUDA 12.8 库 - Ubuntu x64(CUDA 13) - CUDA 13.4 库 - Ubuntu arm64(CUDA 13) - CUDA 13.4 库 - Ubuntu x64(ROCm 10.0) - Ubuntu x64(OpenVINO) - Ubuntu x64(SYCL FP32) - Ubuntu x64(SYCL FP16) - Linux arm64(Snapdragon:CPU、Adreno GPU、Hexagon NPU) - 设置指南
Android: - Android arm64(CPU) - Android arm64(Snapdragon:CPU、Adreno GPU、Hexagon NPU) - 设置指南
Windows 操作系统: - Windows x64(CPU 版) - Windows arm64(CPU 版) - Windows arm64(OpenCL Adreno 版) - Windows x64(CUDA 12 版) - CUDA 12.4 DLL 文件 - Windows x64(CUDA 13 版) - CUDA 13.4 DLL 文件 - Windows arm64(CUDA 13 版) - CUDA 13.4 DLL 文件 - Windows x64(Vulkan 版) - Windows arm64(Vulkan 版) - Windows x64(OpenVINO 版) - Windows x64(SYCL 版) - Windows x64(ROCm 10.0 版)
openEuler: - 已禁用 - openEuler x86 架构(310p) - openEuler x86 架构(910b,ACL Graph) - openEuler aarch64 架构(310p) - openEuler aarch64 架构(910b,ACL Graph)
UI: - UI