Exec 工具集
宿主用 ProcessStartInfo.ArgumentList 启动进程(没有 bash -lc,也没有单行命令字符串)。工作目录是工作区根目录。子环境继承宿主进程,并额外收到五个变量,只为该进程改写:
| 变量 | 值 |
|---|---|
CRYSTAL_WORKSPACE |
绝对工作区根 |
CRYSTAL_SESSION |
当前会话 id |
CRYSTAL_APPROVAL |
当前审批模式(plan、default、edit、review、audit 或 full) |
CRYSTAL_TOOL_DATA |
此集合的绝对全局数据目录,{home}/data/tools/<directory> |
CRYSTAL_PROJECT_DATA |
此集合的绝对每工作区数据目录,<workspace>/.crystal/data/tools/<directory> |
不添加秘密。不为该工具设置 CRYSTAL_HOME。两个数据目录由宿主解析,并在工具首次运行时惰性创建。无法创建的目录不会被报告,因此缺失时请自行创建。它们与集合安装目录分开;不要在其中放秘密。
裸可执行文件名在集合目录中存在该文件时于目录内解析;否则可以 PATH 搜索。包含目录分隔符的相对路径必须留在集合目录内。绝对路径按给定使用。
最终 argv 是:集合 command + 此工具的 command + 从此工具 argv 映射来的标志。简写没有额外后缀。
Stdin JSON(stdin: true,默认):把围栏内的参数对象写成无 BOM 的 UTF-8 JSON,然后关闭 stdin。单工具或多工具集合的正文相同。子进程已经从 argv 知道自己是哪个子命令。
Argv(argv 映射):对每个出现的列出属性,追加 flag,然后是标量字符串形式。允许的 JSON 种类:字符串、数字、布尔。字符串数组对每个元素追加 flag value。对象、null 和混合数组以模型可见的英文错误拒绝该调用。属性顺序跟随文件中 argv 对象的顺序。
两者都用:stdin 得到完整的围栏对象,argv 得到前缀、后缀和映射的标量。
关闭 Stdin:stdin 仍然被重定向并关闭,因此子进程不会阻塞。
内容输出("output": "content",默认 text):stdout 必须是一个 UTF-8 JSON 对象。text 是可选字符串。images 是最多 8 个对象的可选数组。每张图像设置 mimeType(image/png、image/jpeg、image/gif 或 image/webp),以及 base64 或 path 中的恰好一个。base64 可以包含空白。path 必须是工作区内的普通文件;凭据路径、目录和管道被拒绝。字节必须匹配声明的类型和 20 MiB 的宿主限制。宿主只在图像将被附加时打开路径,该读取遵守取消。Stderr 追加到 text。非零退出使调用失败,且不附加图像。仅文本的回合上,包含图像的结果以 “This model cannot accept tool images.” 失败。支持图像的回合上,同一工具也注册为多模态工具,被接受的图像走现有标记路径。无效 JSON 使调用失败,并保留 stdout 预览。大图像应使用 path,因为 stdout 在解析前仍会被截断到工具输出上限。
非零退出是 ToolResultStatus.Failure。超时从进程启动开始,覆盖 stdin 写入、进程退出和 stdout/stderr 读取。内容 JSON 点名的图像文件不属于该进程超时。"timeoutSeconds": "unlimited" 禁用这次调用的超时;用户和回合取消仍然适用。超时、取消和 stdin 失败会在操作系统允许时杀死进程树。对于 output: text,stdout 然后 stderr 被连接、截断,并作为 ToolOutput 文本返回。
多个 exec 工具共享一个二进制文件时,应放在同一个集合中。这与多 ITool 程序集是同一单位:一次安装、一个 ALC 或一个可执行文件、多个目录条目。