敏感信息¶
当任务需要数据库密码、API Key、仓库 Token 或 SSH 私钥,而您不希望将这些值发送给模型时,可以使用敏感信息功能。将文本或文件配置为当前会话的变量,再在任务提示词中告诉 Agent 变量名称和用途。Agent 执行命令时可以使用变量,模型只会看到名称和类型,不会获得您通过此入口提交的原始值。
在 Web 中配置变量¶
进入 Agent 的普通任务会话,点击会话标题栏中的锁形图标敏感信息。新任务的空白输入页不展示该入口,请先发送不含秘密值的任务说明,建立会话后再配置变量。Agent 需要在线并支持此功能,当前用户需要具备会话发消息权限;已完成任务、只读记录,以及自动化和任务接入的共享会话不支持配置。
弹窗中的已配置变量只展示名称和类型,不展示或回填原始值,也不支持下载已上传的文件。
添加变量¶
- 点击添加变量。
- 填写变量名称,例如
API_TOKEN或SSH_KEY_FILE。名称以字母或下划线开头,仅包含字母、数字和下划线,最多 128 个字符。 - 在变量值中输入文本,默认隐藏显示;也可以点击上传文件选择本地文件。上传后会显示文件名和大小,可重新选择或移除文件。单项内容不能为空,且不能超过 256 KiB。
- 点击添加变量,等待 Agent 确认接收。添加同名变量时,需要确认替换。
- 返回任务对话,只说明变量名和用途,例如“连接 MySQL,密码从 MYSQL_PASSWORD 读取”。添加变量本身不会执行任务,需在对话中明确要求 Agent 继续。
文本会作为命令子进程的环境变量提供;上传的文件保存在 Agent 的私有目录中,对应变量的值为 Agent 本地文件路径。文件内容请通过上传文件提供,勿将其粘贴到普通聊天或作为普通附件上传。
编辑与删除¶
- 编辑:在列表中点击目标变量的编辑图标,输入新值或上传文件,确认替换并保存。变量名不可修改,后续命令使用新内容;已启动的命令可能仍持有旧值。
- 删除:在列表中点击删除图标并确认。后续命令无法再使用该变量,不会删除您本机的源文件。
操作失败时,可以在当前表单中修改后手动重试;关闭、返回列表、切换会话或操作成功后,输入会被清空。未收到 Agent 确认时,不代表确定未保存;列表只能确认名称和类型,不能证明新值已生效,也不会自动重试任务。
最佳实践:用 API Token 查询外部系统¶
假设您希望 Agent 查询内部发布系统,汇总生产环境最近 24 小时的失败发布。该系统需要 API Token,但您不希望 Token 原文进入模型输入,可以按以下顺序操作:
- 准备仅有发布记录查询权限、有效期较短的 Token,并确认 Agent 所在环境可以访问该系统。
- 新建普通任务,先发送:“我要查询内部发布系统的失败记录,稍后通过敏感信息提供 Token,请先不要调用接口。”
- 打开敏感信息 > 添加变量,名称填写
RELEASE_API_TOKEN,变量值粘贴真实 Token。确认 Agent 已接收后,返回对话。 - 发送下面的任务提示词,将示例地址替换为团队实际接口;聊天中只写变量名,不粘贴 Token 原文。
请查询 https://release.example.com/api/releases,汇总生产环境最近 24 小时的失败发布,列出服务、发布时间、失败原因和需要跟进的事项。
接口使用 Bearer Token 认证。请从当前会话的环境变量 RELEASE_API_TOKEN 读取 Token,用于命令请求的 Authorization 头,不要输出 Token 原文,也不要将其写入文件。
只进行查询,不重试发布、不回滚、不修改配置。接口返回不全、无权限或访问失败时,请说明限制,不要根据空结果推断没有失败发布。
Agent 在命令执行时使用该变量完成认证,模型不需要知道 Token 的具体值。接口响应中的业务数据仍会用于分析,请确认这些数据适合交给当前模型处理。任务结束后删除变量或关闭会话;Agent 断线或重启后需重新添加。
同样的方法也适用于数据库密码或其他 API Key:用 MYSQL_PASSWORD、SERVICE_API_KEY 等明确名称配置变量,在提示词中说明目标服务、变量用途和允许的操作范围。不要为了方便同时提供无关系统的密钥。
obscli¶
聊天中输入 /credentials,菜单只提供 Write 和 Delete。当前会话自动绑定一个 Agent,不用复制 UUID。选择 Write 后,在同一个私密表单填写 Key 和 Value,Tab 切换字段,Enter 提交;默认文本输入,Value 始终隐藏。已有名称也使用 Write,提交前确认覆盖,不另设替换操作。
等待服务响应时,可按 Ctrl+C 或连续两次 Esc 取消等待;期间输入和粘贴的内容会被丢弃,不进入聊天草稿、日志或缓存。取消已发送的写请求不代表撤销服务端操作,请核实结果后再重试。
文件同样使用这个表单:Ctrl+T 切换为 file(切换类型会清空 Value),在 Value 输入 @ 路径。支持绝对路径、~/ 和相对路径,方向键选择、Tab 补全、Shift+Tab 返回 Key;只匹配当前目录前缀,包含隐藏文件,不递归搜索。选中文件后显示路径和大小,确认才上传;obscli 不支持粘贴文本作为文件。
界面不显示凭据列表或刷新。查询时在普通聊天中说“列出当前会话的凭据名称和类型”,Agent 不会返回值。Delete 输入准确名称后确认;失败保留输入供手动重试,也可选择 Edit key and value 重新填写,取消、关闭或成功后清空。交互 TUI 的内置菜单、提示和错误统一使用英文,用户输入与模型回复保持原文。
添加 git-rg Token¶
只读任务推荐提供低权限的 GITRG_TOKEN;需要创建 Draft PR/MR 时提供 GITRG_WRITE_TOKEN。git-rg v0.6.0 起,一个同时具备读取和发布权限的写 Token 就可完成编辑流程;同时提供两个 Token 时,读取优先使用读 Token。v0.5.0 访问私有仓库时,读取和 dry-run 仍需单独的读 Token。
GitHub 在 Fine-grained personal access tokens 创建;GitLab 在目标项目的 Settings > Access tokens 创建 project access token。
| 会话凭据名称 | 用途 | GitHub 最小权限 | GitLab 最小权限 |
|---|---|---|---|
GITRG_TOKEN |
搜索、列出 refs、读取完整文件和 dry-run | 细粒度 personal access token;Repository access 只选择目标仓库;Contents: Read-only。Metadata: Read-only 由 GitHub 自动授予 |
优先使用只限目标项目的 project access token;Reporter 角色;read_api scope |
GITRG_WRITE_TOKEN |
创建同仓库新分支、commit 和 Draft PR/MR;v0.6.0 起也可在读 Token 缺失时用于读取和 dry-run | 细粒度 personal access token;Repository access 只选择目标仓库;Contents: Read and write、Pull requests: Read and write |
只限目标项目的 project access token;Developer 角色;api scope |
GitHub 只有在变更计划确实修改 .github/workflows/ 时,才给写 Token 增加 Workflows: Read and write。GitLab 的 write_repository 只覆盖 Git 仓库访问,不能代替 git-rg 创建 commit 和 MR 所需的 REST API api scope。来源分支保护规则、组织策略或自建实例策略仍可能拒绝操作;优先允许专用身份创建非保护来源分支,不要直接把 Token 提升为 Maintainer 或 Owner。
创建 Token 时选择最短的实用有效期,并限制到实际使用的单个仓库或项目。GitHub classic PAT 的 repo scope 和 GitLab 不限项目的 personal access token 权限更宽,只有平台版本或组织策略不支持上述仓库级 Token 时才使用。GitLab 无法创建 project access token 时,优先建立只加入目标项目的专用机器人账号,再用该账号的 personal access token 配置相同 scope 和最低项目角色;不要复用能访问多个项目的日常个人账号。
采用双 Token 配置时,在 obscli 当前聊天中分别写入:
- 输入
/credentials,选择Write。 - Key 填写
GITRG_TOKEN,Value 粘贴只读 Token,按 Enter 提交。 - 再次输入
/credentials并选择Write。 - Key 填写
GITRG_WRITE_TOKEN,Value 粘贴独立写 Token,按 Enter 提交。 - 在普通聊天中说“列出当前会话的凭据名称和类型”,确认两个名称都存在;不要要求显示值。
采用 v0.6.0 起支持的单写 Token 编辑流程时,只写入 GITRG_WRITE_TOKEN;只读任务则只需 GITRG_TOKEN。Agent 的读取命令使用 --auth env,并在子进程中清除 GITHUB_TOKEN、GH_TOKEN 和 GITLAB_TOKEN。清除这些 provider Token 后,读取按 GITRG_TOKEN、GITRG_WRITE_TOKEN 的顺序选择;被平台拒绝的 Token 不会触发换身份重试。
dry-run 不修改远端,但可能使用写 Token 执行读取。确实要匿名访问公开仓库时,命令子进程必须清除上述 provider Token 及两个 git-rg Token;只省略 GITRG_TOKEN 不保证匿名。每次发布仍须用户明确授权并传入 --enable-write,写 Token 存在本身不授权发布。Token 不要放进聊天消息、仓库 URL、变更计划、命令参数或仓库文件。会话关闭、Agent 重启或连接断开后,需要重新提交。
以下独立子命令保留用于自动化和兼容。名称和 ID 是示例,秘密值不写在命令行中。
# 提示输入变量名和秘密值;秘密值隐藏输入。
obscli session credential put --workspace-uuid WS --session-uuid SESSION --agent-uuid AGENT
# 提前指定变量名,随后隐藏输入 Token。
obscli session credential put --workspace-uuid WS --session-uuid SESSION --agent-uuid AGENT --name GITRG_TOKEN
# 远程修改代码使用独立写 Token;仍需在任务中明确授权发布 Draft PR/MR。
obscli session credential put --workspace-uuid WS --session-uuid SESSION --agent-uuid AGENT --name GITRG_WRITE_TOKEN
# 文件在 Agent 上以私有权限保存,变量值为 Agent 本地文件路径。
obscli session credential put --workspace-uuid WS --session-uuid SESSION --agent-uuid AGENT --name SSH_KEY_FILE --file ./id_ed25519
# 只列举名称和类型,不能取回值。
obscli session credential list --workspace-uuid WS --session-uuid SESSION --agent-uuid AGENT
obscli session credential delete --workspace-uuid WS --session-uuid SESSION --agent-uuid AGENT --name GITRG_TOKEN
自动化输入可使用 --stdin 从安全输入源读取文本;字节原样保留,包括末尾换行。不要用含秘密字面量的命令或参数提供值,否则可能进入本机 shell 历史。
一次性任务导入¶
obscli run --import-credential /secure/credentials.json 在发送任务前导入凭据。JSON 示例:
{
"kv": {"DB_PASSWORD": "your-password", "GITRG_TOKEN": "your-read-token", "GITRG_WRITE_TOKEN": "your-write-token"},
"files": {"SSH_KEY_FILE": "./id_ed25519"}
}
obscli run --agent-uuid "$AGENT" \
--import-credential /secure/credentials.json \
--prompt '使用 DB_PASSWORD 和 SSH_KEY_FILE 执行任务'
仅支持 JSON,kv 与 files 均可省略一个。相对文件路径以 JSON 所在目录为基准;不展开 $VARIABLE、~ 或执行 shell。名称不能重复(包括跨 kv/files),值必须是非空字符串,文件必须是可读普通文件。JSON 文件最大 8 MiB,最多 64 个名称,单项最大 256 KiB,解码后的凭据累计最大 8 MiB。
客户端先检查全部输入,再创建空会话、上传并等待每项确认;全部确认后才发送 prompt。任一上传失败或未确认都不启动任务,不自动重试,并尝试关闭会话清理已接收的凭据;关闭失败会明确报告。原 JSON 和本地文件由用户管理,客户端不会删除,建议以 0600 权限保存。命令行只包含导入文件路径,正文不进入聊天、模型或应用日志。
上传不会自动触发任务。接收成功后,在普通聊天中说明用途并要求继续。例如:“使用 DB_PASSWORD 连接生产 PostgreSQL,用户名 readonly”。LLM 下一次正常调用会得到变量名称及类型,并沿用现有 shell 语法:
PGPASSWORD="$DB_PASSWORD" psql -h db.example.com -U readonly
git-rg --auth env -F 'timeout' github:OWNER/REPO
ssh -i "$SSH_KEY_FILE" deploy@host
有效期与权限¶
- 同名提交替换旧值;后续命令使用新值,已运行命令可能仍持有旧值。
- 当前普通会话中有发消息权限的用户均可管理变量,自动化和任务接入的共享会话不支持。当前按单会话单 Agent 自动绑定,其他会话不继承。
- 文本只存在 Agent 内存。文件目录权限 0700、文件权限 0600,归 Agent 运行账号所有;第一版文件存储要求 Unix 权限语义,Windows Agent 拒绝文件凭据,Windows 客户端仍可上传给 Unix Agent。
- 会话关闭或 Agent 重启后凭据失效。异常退出遗留文件在下次启动清理,不恢复。
- Agent 与 Beak 连接断开时同样撤销凭据;重连后需重新提交,避免漏掉断线期间的关闭事件。重新打开会话不会恢复旧值。
- 每会话最多 64 个名称;单项最多 256 KiB。每会话累计提交最多 8 MiB,删除不会重置计数。不再建立脱敏片段。
- Agent 离线时立即失败,不排队。确认超时表示结果未确认;查询清单或同名重新提交,不要把超时当成确定未保存。
- 第一版携带凭据的命令返回时清理同一进程组内的后台子进程,不用于启动长期后台服务。
普通命令自动获得会话变量及文件路径,现有 shell 审批策略继续生效。工具主动输出的凭据按原文进入历史、日志、trace 和模型,不做字串替换。文件删除不保证抵御磁盘取证、快照或备份恢复。同系统账号及管理员不属于文件权限的隔离对象。
凭据只注入所属会话启动的命令子进程,不修改 Agent 全局环境,其他会话不会自动继承。但同一 Agent 的会话通常共用系统账号;具备不受限 shell 权限的其他会话可能主动读取该账号拥有的文件,进程环境的读取还受操作系统权限控制。会话分发隔离不能替代独立账号、容器或操作系统沙箱。
Beak 服务端只做短暂内存转发。部署方也须避免反向代理、APM 请求正文采集或 Redis 命令调试记录这些请求;生产连接使用 HTTPS/WSS。