模型下载和嵌入指令的去重操作应应用于保留的完成作业中(与 #1213 相同的添加-去重行为)

作者: caweis创建于 2026年8月6日更新于 2026年9月13日
标签released on @rc
  1. 一个完成的模型下载永远阻止该模型。DownloadModelJob.dispatch 仅在其状态为failed(download_model_job.ts:168-175)时清除以前的任务。完成的记录被保留(removeOnComplete: false,第185行),没有其他东西删除它们;ollama_service.ts中的deleteModel仅调用Ollama API。重现:下载一个模型,让它完成,在UI中删除它,再次请求它。queue.add 根据已保留的完成任务进行去重,调度返回created: true,API 回复"为模型派发下载任务:…",没有工作程序运行。完成的任务不在下载列表中(它检索了等待中的/正在运行的/延迟的/失败的任务),因此也没有重试。模型无法重新安装,直到Redis被清除。扩展现有的清理,从state === 'failed' 扩展到任何非活动状态即可修复此问题。 2. 重试失败的模型下载可能会删除刚刚派发的任务。retryFailedJob 的模型分支先进行调度,然后删除(下载服务.ts:194-195)。调度的预清理删除失败的记录,并将一个新的等待任务按相同的任务ID放入队列;在旧句柄上调用job.remove() 后删除按ID,现在是新任务。如果工作程序首先锁定它,则删除抛出并被吞噬,因此重试是否存活是一个竞争。文件分支已经执行了删除-然后-调度(第205-207行);模型分支需要相同的顺序。 3. 文件的嵌入失败可能会无效。没有force 的初始EmbedFileJob.dispatch 固定了每个文件的任务ID(embed_file_job.ts:388-390)。失败的记录被保留(removeOnFail: { count: 20 }),并且job 已经存在 捕获不会触发,因为添加不会抛出。因此,对于文件的早期嵌入失败,POST /api/RAG/files/embed 使用force: false 将重复到保留的失败记录上,并返回 202 "为该文件排队索引。" 没有任何任务被排队。记录只有在20次新的失败后才会离开,在单用户机上可能永远不会。force: true 路径不受影响,因为它跳过了确定的ID。这些修复的版本,以便形状有用: caweis/project-nomad@f21d1cc(模型和嵌入预添加清理,重试顺序翻转)和 caweis/project-nomad@80be398(#1213 修复应用于每个 RunDownloadJob 防护)。分支的文件已分歧,因此它们不会应用为…

内容来源: Crosstalk-Solutions/project-nomad