Agent Zero 备份恢复预览接口深度解析:/backup_restore_preview 的请求契约与安全实现
Agent Zero 备份恢复预览接口深度解析/backup_restore_preview 的请求契约与安全实现【免费下载链接】agent-zeroAgent Zero AI framework项目地址: https://gitcode.com/GitHub_Trending/ag/agent-zero本篇围绕 Agent Zero 仓库中api/backup_restore_preview.py端点及其文件级 DOX 档案 api/backup_restore_preview.py.dox.md 展开讲清该“恢复前预览dry run”接口的路由与安全契约、multipart 请求/响应结构以及其底层 helpers/backup.py 中preview_restore的路径翻译、模式匹配与清理扫描原理。读完你可以完整复现一次备份恢复预览调用并理解预览结果中每个字段待删除、待恢复、跳过文件是如何计算出来的。端点在备份体系中的位置Agent Zero 将持久化用户数据集中在usr/目录统一管理备份子系统围绕这一目录构建。从源码结构看备份相关端点在 api/ 目录下呈扁平文件组织每个*.py端点配套一个同名*.py.dox.mdDOX 档案记录职责、契约与副作用该规范在 api/AGENTS.md 中被明确约定。备份流程由四个端点协作完成api/backup_create.py创建备份归档api/backup_inspect.py检查归档内metadata.json元数据api/backup_restore_preview.py恢复前预览计算“如果现在执行恢复会发生什么”api/backup_restore.py真正执行恢复。预览端点的价值在于恢复动作可能覆盖现有文件、甚至按clean_before_restore策略先删除一批文件属于高风险操作。通过先调用预览接口用户可以或前端可以在真正提交恢复前看到完整的“删除/恢复/跳过”清单。DOX 档案 api/backup_restore_preview.py.dox.md 将其职责概括为“handle backup restore preview requests”并记录了实现类BackupRestorePreview的三个成员requires_auth(cls)、requires_loopback(cls)、async process(self, input, request)。路由注册与安全契约端点类 api/backup_restore_preview.py 继承自 helpers/api.py 中的ApiHandlerclass BackupRestorePreview(ApiHandler): classmethod def requires_auth(cls) - bool: return True classmethod def requires_loopback(cls) - bool: return FalseApiHandler基类定义了各安全开关的默认行为见 helpers/api.py类方法默认值本端点含义requires_authTrueTrue显式声明需要登录态未通过认证会被重定向到登录页requires_loopbackFalseFalse显式声明不限制仅回环地址访问requires_csrf跟随requires_auth()即True需要携带有效 CSRF tokenrequires_api_keyFalse未覆盖即False不要求X-API-KEY头get_methods[POST]未覆盖即POST仅接受 POST 请求路由并不为每个端点单独注册而是由 helpers/api.py 中register_api_route挂载一条/api/path:path通配规则请求到达后按路径在api/path.py内置或plugins/name/api/handler.py插件中动态定位处理器类再按类上的开关依次包裹csrf_protect、requires_api_key、requires_auth、requires_loopback装饰器最后调用handle_request执行process。对BackupRestorePreview而言DOX 档案中“Preserve authentication, CSRF, loopback, and API-key checks”的工作指引正对应这套机制由于requires_auth()返回Truerequires_csrf()随之默认为True因此该接口既要求登录会话也要求请求头X-CSRF-Token与 cookie 中的 token 一致校验逻辑见 helpers/api.py。requires_loopback()显式返回False表明预览接口允许经隧道等远程链路访问这与“上传备份文件、查看即将发生什么”的低破坏性语义一致——真正执行删除/覆盖的恢复端点才需要更强的访问约束。此外handle_request的约定helpers/api.py是process返回dict时统一序列化为 200 JSON返回Response实例时直接透传抛异常则被捕获并以 500 文本返回。DOX 中“Usehelpers.api.Responsefor non-JSON responses, files, redirects, or status-specific replies”的指引即源于此。请求契约multipart 表单字段process的实现api/backup_restore_preview.py读取的是request.files与request.form即要求客户端以multipart/form-data提交。字段含义与默认值如下表单字段必填类型/取值说明backup_file是文件.zip归档缺失时返回{success: False, error: No backup file provided}文件名空串返回No file selectedmetadata否JSON 字符串默认{}用户在界面中编辑过的备份元数据从中取include_patterns、exclude_patterns两个键作为恢复过滤模式JSON 解析失败返回Invalid metadata JSONoverwrite_policy否字符串默认overwrite文件冲突策略。从源码看预览侧仅显式处理skip目标已存在则跳过实际恢复端点还支持backup先把旧文件改名成.backup.时间戳再覆盖见 helpers/backup.pyclean_before_restore否字符串默认false小写后与true比较得出布尔值开启后会额外计算恢复前需要删除的文件清单这里值得注意的一个细节是metadata的双重视角它一方面作为用户编辑后的元数据user_edited_metadata整体传给preview_restore另一方面其中的include_patterns/exclude_patterns又被单独抽出作为本次恢复的模式过滤条件。也就是说用户可以不改动归档内原始元数据仅凭界面里的模式编辑器来决定“只恢复哪些路径”。响应契约成功时process将BackupService.preview_restore的结果投影为如下 JSON 结构api/backup_restore_preview.py{ success: true, files: [ ... ], files_to_delete: [ ... ], files_to_restore: [ ... ], skipped_files: [ ... ], total_count: 0, delete_count: 0, restore_count: 0, skipped_count: 0, backup_metadata: { ... }, overwrite_policy: overwrite, clean_before_restore: false }各字段语义files删除操作与恢复操作的合并列表files_to_delete files_to_restore对应预览页展示的完整操作流files_to_delete仅当clean_before_restoretrue时非空每条含path、real_path、action: delete、reason: clean_before_restorefiles_to_restore每条含archive_path归档内路径、original_path、target_path翻译到当前系统后的落地路径、action: restoreskipped_files被跳过的文件reason取值not_matched_by_pattern未命中恢复模式或file_exists_skip_policy目标已存在且策略为skiptotal_count/delete_count/restore_count/skipped_count上述三类操作的计数backup_metadata返回的是用户编辑后的元数据若提供了metadata表单字段供前端继续展示与确认overwrite_policy、clean_before_restore回显本次预览所用参数保证前端展示的与后端计算的严格一致。失败路径只有两类表单校验失败与preview_restore抛出的异常统一包装为{success: False, error: ...}。其中BackupService对无效归档给出的异常消息是可辨识的非 zip 包报Invalid backup file: not a valid zip archive元数据损坏报Invalid backup file: corrupted metadata见 helpers/backup.py。preview_restore 的底层实现原理真正的计算全部在 helpers/backup.py 的BackupService.preview_restorehelpers/backup.py中完成端点本身只是薄封装。其执行链条如下落地临时文件tempfile.mkdtemp()建临时目录把上传的backup_file存为backup.zipfinally块保证无论成功失败都清理临时文件因此预览过程对文件系统是只读的不会改动任何用户数据这也是 DOX 档案中“副作用区域”描述应与源码保持同步、随行为变化而更新的原因。读取并选择元数据从归档读取metadata.json得到original_backup_metadata若请求携带了用户编辑过的元数据则优先使用backup_metadata user_edited_metadata if user_edited_metadata else original_backup_metadata。元数据内嵌了备份时的environment_info含原系统的agent_zero_root这是跨机器恢复的基础。构建恢复过滤器当提供了 include/exclude 模式时先用_translate_patternshelpers/backup.py把“备份机器上的绝对路径前缀”替换为“当前机器的agent_zero_root前缀”再用pathspec.PathSpec.from_lines(gitwildmatch, ...)构建 gitignore 风格匹配器——include 模式原样加入exclude 模式加!前缀。逐文件决策对归档内每个条目排除metadata.json与checksums.json经_translate_restore_pathhelpers/backup.py将归档路径翻译为当前系统的目标路径——同样基于元数据中environment_info.agent_zero_root做前缀替换无法识别的路径原样保留若restore_spec存在且翻译后路径不匹配计入skipped_filesnot_matched_by_pattern若目标已存在且overwrite_policy skip计入skipped_filesfile_exists_skip_policy否则计入files_to_restore。清理扫描可选clean_before_restoretrue时调用_find_files_to_clean_with_user_metadatahelpers/backup.py它把用户编辑后的 include/exclude 模式翻译到当前系统后复用test_patterns在磁盘上实际扫描命中的现存文件转成action: delete的操作项。注意此处只收集清单删除动作只会在真正调用 api/backup_restore.py 执行恢复时发生。汇总返回合并删除与恢复操作生成files与各计数连同回显参数一并返回。这套“先翻译、再匹配、后决策”的流程解释了为什么备份归档可以跨机器迁移无论备份是在/home/user/a0还是/data/project/a0下创建的只要元数据里记录了原agent_zero_root预览和恢复都会把路径重映射到当前安装位置。前端调用示例WebUI 备份设置页的“恢复 dry run”按钮即该端点的主要调用方。webui/components/settings/backup/backup-store.js 的dryRunRestore构造请求const formData new FormData(); formData.append(backup_file, this.backupFile); // 选中的备份 zip formData.append(metadata, this.getEditorValue()); // 元数据编辑器当前值 formData.append(overwrite_policy, this.overwritePolicy); formData.append(clean_before_restore, this.cleanBeforeRestore); const response await fetchApi(/backup_restore_preview, { method: POST, body: formData });响应成功后前端按files_to_delete→files_to_restore→skipped_files的顺序把操作清单渲染到日志区形如RESTORE: original_path - target_path最后输出一行汇总Summary: N to delete, M to restore, K skipped。这段前端代码是理解响应各字段用途最直观的参照。验证与注意事项按 DOX 档案 api/backup_restore_preview.py.dox.md 的 Verification 一节该端点未找到按名直接引用的测试仓库指引为“选择最近的行为测试或做针对性 smoke check”。与备份子系统相关的测试是 tests/test_backup_large_archives.py可作为行为回归的邻近参照改动端点契约时还应按 api/AGENTS.md 的要求同步更新同目录 DOX 档案。metadata表单字段必须是合法 JSON 字符串可以是{}但include_patterns/exclude_patterns的取值是绝对路径模式如agent_zero_root/usr/**因为模式匹配前只做了根路径翻译与首斜杠剥离不做相对路径归一化。预览接口只读不写它不落盘备份内容、不删除任何文件可以放心反复调用但它仍要求登录与 CSRF token通过隧道远程访问时也应保留这一认证链。DOX 档案中列出的“imported dependency areas:helpers.api,helpers.backup,json,werkzeug.datastructures”与 api/backup_restore_preview.py 顶部的 import 一一对应其中FileStorage仅用于对request.files[backup_file]的类型标注可作为阅读源码时的依赖地图。【免费下载链接】agent-zeroAgent Zero AI framework项目地址: https://gitcode.com/GitHub_Trending/ag/agent-zero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考