[Feature Request] 支持 ov cp 复制文件/目录并复用底层向量 #4120
KCHENPENGFEI
started this conversation in
Ideas
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
背景
OpenViking 当前已经支持
ls、tree、rm、mv等文件系统操作,但缺少cp。在实际使用中,同一份资源(文件、图片、音视频或目录)经常需要出现在多个
viking://路径下。当前只能对相同源重复执行add-resource,这会重复触发下载/上传、解析、VLM 理解、摘要生成和 embedding,不仅耗时,也会产生不必要的模型调用与计算成本。如果资源已经被 OpenViking 完整处理过,复制其文件树、派生内容、元数据和向量记录,就可以直接得到一个可检索的副本,无需重新走资源入库流水线。
为什么值得做
以一份已经完成解析和索引的视频为例:
第二次导入会重复执行昂贵的处理步骤。更合理的方式是:
ov add-resource ./demo.mp4 --to viking://resources/project-a/demo.mp4 ov cp viking://resources/project-a/demo.mp4 \ viking://resources/project-b/demo.mp4cp的收益包括:ls/tree/rm/mv/cp的直觉;从当前实现看,这个方向也有较好的基础:底层 AGFS 已提供
cp,VikingFS 的mv已采用“复制文件树 → 更新向量 URI → 删除源”的流程,并在 URI 变化时复用已有向量而不重新 embedding。cp需要在此基础上新增“克隆向量记录并保留源记录”的能力,而不是重新设计完整复制链路。建议的 CLI
单文件复制
目录递归复制
建议首期行为:
ov cp;-r/--recursive,否则返回错误;viking://路径之间复制。核心语义:文件与向量一起复制
cp不能只复制底层文件,否则目标 URI 虽然可以被ls/read看到,却无法得到与源一致的检索结果。复制范围应包括:
.abstract.md、.overview.md等语义派生文件;向量复制建议采用 clone 语义:
uri、parent_uri以及其他路径派生字段改写为目标 URI;mv当前使用的源记录删除步骤。对于目录,以上规则递归应用到整个子树。复制出的节点不应重新解析、调用 VLM 或重新 embedding。由于目标父目录新增了子项,目标路径祖先的 L0/L1 摘要可能需要走现有增量刷新机制;这类父目录刷新应与“复制子树本身无需重新处理”区分开。
一致性与失败语义
建议将文件副本和向量副本视为一次逻辑操作:
-r;如果向量复制失败,应清理尚未提交的目标文件和目标向量,源始终保持不变。至少需要保证操作失败后不会留下“文件存在但不可检索”或“向量存在但文件不存在”的半成品。
目录复制应考虑大规模子树,不应把全部文件内容或向量一次性加载到内存;建议分页枚举并批量复制,同时返回可观测的复制数量、向量数量和失败阶段。是否需要异步 task、进度查询和断点恢复,可以根据目录规模另行确定。
与
mv的关系两者可以共享大部分内部能力,但语义不同:
建议先抽象一个可复用的复制事务,再分别实现
mv和cp,避免两套文件遍历、路径锁和失败回滚逻辑逐渐分叉。非目标(首期)
cp重新解析、重新生成摘要或强制重新 embedding;viking://之间的上传/下载也纳入cp;这仍由add-resource和get负责。待讨论问题
--force、--no-clobber,还是目录 merge 语义?viking://引用,应该保持指向源,还是将指向源子树内部的引用改写到目标子树?cp(from_uri, to_uri, recursive=False),以保证 CLI 只是薄封装?建议的验收标准
ov cp能复制单文件,源文件保持不变;ov cp -r能完整复制目录、空目录和全部后代节点;-r的ov cp会明确失败;ls/tree/read/stat/find/search;All reactions