跳转至

一步构建环境

Issue:https://github.com/morluto/rea/issues/4933

结果

构建一个智能体环境捆绑包需要三条命令和一个手写的视图请求,该请求将整个捕获内容内联嵌入,因此较大的捕获会被计入内联输入。默认情况下,视图不应用任何选择性加入的模板规则,而已发布的由捕获构建的环境全部使用相同的四条规则,并且本地捕获以其来源主机命名(127-0-0-1-3105)。没有任何机制报告一个环境从其状态中提供哪些工具,或某个写入工具为何被保留。

rea environment-build <capture> [directory] 通过一个离线步骤构建捆绑包并报告其提供的内容。新的 environment-coverage 分析视图可以对任何捕获报告相同的摘要,因此智能体可以在构建之前检查录制内容。

要求

  • 捕获必须是 .har 文件,其检查方式与 inspect-web-network-capture 检查捕获的方式相同,或者是来自 inspect_web_network_capture 或 capture_browser_scenario 的捕获 Evidence JSON;任何其他扩展名都会在读取之前被拒绝,并且保存为 .json 的 HAR 文档会被拒绝并附有提示。
  • 清单以保留的 Evidence 的形式从内存中的捕获投影出来,默认规则为 after-uid-literal、opaque-token、sibling-variance 和 prefix-variance,除非 --template-rule 或 --format-rules-only 选择了其他规则;规则按视图的顺序应用,重复的规则会被拒绝,正如视图拒绝它那样。
  • 对于同一捕获路径,每个捆绑包文件都与 inspect-web-network-capture --format json、inspect-analysis-view --format json(以视图顺序应用相同规则)以及 environment-export(构建的名称)写入的内容逐字节相同,包括 Evidence id。Evidence 被序列化一次,进入一个大小精确的缓冲区,该缓冲区的字节既经过认证又被发送。
  • 名称取 --name,否则取清单的名称,除非来源是环回名称或 IP 字面量:此时使用捕获文件的名称,并发出警告;如果某个文件名无法产生可移植的捆绑包名称,则会被拒绝,并提示使用 --name。
  • 报告携带导出的工具数量、状态、包来源和文件,以及捕获和清单的标识、coverage、警告和下一条命令,命令以 shell 引号引用。coverage 统计从状态回答并重放的读取工具(按视图原因分类),并将写入工具列为已提供或已保留,附带其原因、计划记录、矛盾的读取和提示;当状态不可用时,它为 null。
  • 每个写入原因都带有一个提示;没有提示的原因将导致编译失败。
  • 以凭据命名的标头名称、查询参数名称以及持有某个值的 JSON 或表单正文成员,会以计数和前 20 个记录或事件指针的形式被报告,绝不报告值本身,也绝不拒绝构建;扫描在深度嵌套的正文上不会导致栈溢出。正文根据其记录的媒体类型读取为表单(application/x-www-form-urlencoded,由 URLSearchParams 解析)或 JSON(replay 解析为 JSON 的媒体类型);没有媒体类型、或媒体类型不属于上述任一种类的正文,如果以 { 或 [ 开头则视为 JSON,如果包含 = 且没有空白字符则视为表单,因此纯文本和空正文不会产生任何指针。浏览器场景按事件而不是按记录进行扫描:每个保留的请求和响应网络内容事件的标头值和正文都会被扫描,包括其请求在浏览器附加之前就已开始的响应,以及无法归属于某一个请求和响应的事务;每个事务 URL 的查询参数也会被扫描一次;其指针指明事件在 events.items 中的索引(event 4 response /token)。每个重复表单字段的每次出现都会被计数,正如每个重复的标头或查询参数也会被计数一样。如果 HAR 请求以结构化表单参数记录且没有文本,或 mitmproxy 的 SaveHar 记录了 null 文本,则按这些参数进行扫描。超过 4 MiB 扫描限制(以 UTF-8 字节计算)的文本正文,包括仅作为前缀解码的响应体,不会被扫描;它们会以 credential-scan-incomplete 警告的形式报告,包含计数和前 20 个记录或事件及 side 指针(record 3 response、event 4 response),绝不包含内容,也绝不拒绝构建。二进制正文不包含 JSON 或表单文本,因此既不会被扫描,也不会被报告。
  • 被检查的 HAR 的 Evidence 和投影出的清单在任一者被序列化之前,会对照实时堆余量进行解析和封装的准入检查,正如捕获 Evidence 文件在读取之前所做的那样;无法容纳的对象会在写入任何内容之前以 resource_constraint 被拒绝。
  • 空的或包含 NUL 的捕获、目录或包 tarball 参数会被作为无效输入拒绝;它永远不会被解析为工作目录。
  • 在捆绑阶段之前不会写入任何内容;--dry-run 不写入任何内容,而是报告构建将写入的文件,并拒绝构建所拒绝的包 tarball,同时执行构建在复制 tarball 之前会做的接收、读取和哈希,然后释放 tarball,因此无法读取内容的 tarball 会被拒绝:无法确认的关闭会被报告为不完整的清理,从而保留其所有者。目录必须不存在或为空。
  • SIGINT 会在阶段之间以及干运行的最后一步之后进行检查:在捆绑阶段之前取消的构建不会写入任何内容,而在写入期间取消的构建会指明已写入的捆绑包。
  • environment-coverage 视图使用相同的规则汇总 environment-state 视图,拒绝它所拒绝的内容,并且是推断视图。它不应用服务时的目录和状态准入检查,并在限制说明中说明这一点。
  • real-agentenv 通道使用 environment-build 构建其捆绑包。

非目标

  • 不改变三个现有命令的契约,也不改变任何视图推导出的内容或任何环境提供服务的内容。
  • 不启动浏览器,也不访问网络:场景需先使用 capture-browser-scenario 录制。
  • 不支持 --replace,不因凭据名称而拒绝,也不重写捕获的绝对路径,因为 Evidence 标识包含该路径。
  • 没有 MCP 导出工具;那是一个单独的变更。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 rea2/rea