Agent Sandbox Registry

python-sdk

细粒度能力

docs/zh/guide/fine-grained-capabilities.md

细粒度能力

每条路由只有一个端点 id,每个端点一条规则,决定它能不能被调用,以及路径、命令、大小和频率限制。规则前面没有第二道门。agents-cli 只放开会话相关的几条 Agents 路由,POST /shell 和 POST /v1/agents 保持关闭,用的就是这一层。

设计评审稿在 细粒度能力设计。路径和命令的执行细节在 文件与命令控制。Agents 请求和响应在 Agents API。完整路由表在 Agents API 参考。

一个开关:端点

端点 id(upload、files_list、agents_sessions_create)是所有环节共用的单位:策略、审计日志、GET /capabilities 和客户端。组只是一组端点 id 的名字。写 groups: [file_ops]、group:file_ops、table.enable_group(CapabilityGroup.FILE_OPS) 或 ABX_SERVER_ENABLED_GROUPS=file_ops,都会展开成该组声明的端点 id,得到同一份逐端点规则。

默认值:core 永远开着。agents、dev_tools、browser 是可选组,默认关。file_ops、process、terminal、system、commands 默认开。health、capabilities、capabilities_check 不能关掉。

规则来自五层,按端点合并:

层 来源 能打开 能关闭
default 内置的可选组 否 是(可选组)
code 模板 commands.py 里的 default_table().enable_group() / disable_group() 是 是
preset preset: 是 是
policy 策略文档的 groups、defaults、endpoints 是 是
environment ABX_SERVER_ENABLED_GROUPS 是 否

更具体的选择器优先:精确 id 优于 glob,glob 优于 group:<name>。同样具体时,后面的层优先;同一层里只要有一条 enabled: false,该端点就是关的。所以策略里的 endpoints.code_run.enabled: false,即使环境变量打开了 dev_tools,它也仍然是关的。

拒绝会指出是哪条规则拒绝的。404 正文带 code: endpoint_disabled 和 rule,例如 policy:endpoints.shell、policy:groups.process、preset:read-only、code:enable_group:file_ops、default:opt-in:browser。GET /capabilities 逐端点报告同一个 rule。它的 groups 和 group_summary 由端点状态推导({"file_ops": {"enabled": 11, "total": 12}}),不单独存储。

ABX_SERVER_ENABLED_GROUPS 是唯一的组环境变量,值是逗号分隔的组名,例如 agents,dev_tools。未知名字会让进程带着拼写建议退出。没有用来关闭组的变量,请写 groups: {process: false} 或 endpoints 规则。

如何启动

三种入口,服务端用同一份文档。无效文档会阻止启动,不会退回成全部允许。

template.yaml 的 server: 块。工具链把它编译成 /etc/agent-sandbox/server-policy.json。可用的键:version、preset、base_dir、groups、defaults、auth、endpoints、description。groups 可以是要打开的组列表,也可以是组到 true/false 的映射。

server:
  endpoints:
    "*":
      enabled: false
    agents_sessions_create:
      enabled: true
    agents_sessions_events_create:
      enabled: true
    agents_sessions_items_list:
      enabled: true
    agents_runtimes_list:
      enabled: true

组的简写,列表或映射:

server:
  groups: [agents, dev_tools]     # 等价于 {agents: true, dev_tools: true}
server:
  groups:
    process: false
    terminal: false

内联 JSON:

export ABX_SERVER_POLICY='{"groups":["agents"],"endpoints":{"*":{"enabled":false},"agents_sessions_create":{"enabled":true}}}'

或文件:

export ABX_SERVER_POLICY_FILE=/etc/agent-sandbox/server-policy.json
agent-sandbox-server check-config --policy /etc/agent-sandbox/server-policy.json

查找顺序:ABX_SERVER_POLICY,然后 ABX_SERVER_POLICY_FILE,然后默认路径上的策略文件。都没有时用内置默认:可选组关,其余全开,没有逐端点限制。

Python:

from agent_sandbox.server import SandboxServer, ServerPolicy

policy = ServerPolicy.only(
    "agents_sessions_create",
    "agents_sessions_events_create",
    "agents_sessions_items_list",
    "agents_runtimes_list",
)
SandboxServer(policy=policy).serve(port=9000)

ServerPolicy.only 先把 "*" 关掉,再打开列出的 id,并保留 core 端点。agents-cli 的 commands.py 就是这个调用。only 还接受 "transfer"(上传下载的四个 id)和 "group:<name>"。

不写策略文档、在 commands.py 里打开整组:

from agent_sandbox.server import CapabilityGroup, default_table

default_table().enable_group(CapabilityGroup.DEV_TOOLS)

enable_group 和 disable_group 是仅有的代码级开关。disable_group(CORE) 会抛错。

选择器

写法 匹配
agents_sessions_create 这一个端点 id
files_* 名字匹配这个 glob 的端点
group:file_ops 这一组里的端点
* 全部端点
@defaults 策略里的 defaults 块,先于各端点

同样具体、同一层里的多条匹配规则冲突时,enabled: false 优先。更具体的选择器可以再打开该端点。

一条规则里能写什么

键 作用
enabled true 或 false
scopes 调用者必须全部具备。* 表示全部,files:* 表示该名字空间
paths.allow 绝对路径列表。给出之后取代 base_dir,成为这条端点的边界
paths.deny 目录前缀或 glob。不含 / 的模式匹配路径分量,如 *.pem。拒绝优先
paths.read_only true 时这条端点上的写和删除被拒绝
paths.symlinks within(目标必须留在边界内)或 never
limits 见下表。大小可写 5MB、1MiB
params 见下表。拒绝类列表在多层之间取并集
audit off、deny、all

所有端点都能写的 limits:max_request_bytes、rate_per_minute、max_concurrency。

Agents 端点已经在内置目录里,默认 scope 是 agents:use。和 upload 一样,可以把某一个端点 id 单独设为 enabled: true。这些端点没有 paths,也没有专用 params,所以除此之外只能写 enabled、scopes、audit 和上面三个通用 limits。写上 paths 或专用 params 时,策略加载失败。

预设,写在你的端点规则之前:

预设 效果
default 不额外限制(可选组保持关闭)
transfer-only 只留 upload、download、files_upload_stream、files_download_stream
read-only 关掉 process、terminal、dev_tools、browser,并关掉写端点和 env_set
hardened 关掉上述组,文件路由拒绝 /proc、/sys、/dev、.ssh、.env、*.pem、私钥文件名
locked 只留 list_commands 和 run_command

组名:core、commands、file_ops、process、terminal、system、dev_tools、browser、agents。core 不能关。

同一个身份既能读有路径范围的文件,又能跑 shell、process_start、code_run 或 PTY 时,检查会给出 L1 警告。进程可以绕过路径规则。Agents 会话由服务端自己拉起 CLI,不需要为此打开 process 组。

端点目录

下表是端点声明表(agent_sandbox.server.endpoints.ENDPOINTS)。路由表、策略和 GET /capabilities 都由它派生。pty_connect 是 WebSocket 升级,在 PTY 端口上提供。Agents 行的 scope 是 agents:use。可配项比带路径的文件路由少,因为这些接口不接收路径或专用参数。

组 方法 路径 端点 id scope 可配项
agents GET /v1/agents/sessions/{id}/artifacts/{artifact_id}/content agents_artifacts_content agents:use enabled、scopes、audit;仅通用 limits
agents DELETE /v1/agents/sessions/{id}/artifacts/{artifact_id} agents_artifacts_delete agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/sessions/{id}/artifacts/{artifact_id} agents_artifacts_get agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/sessions/{id}/artifacts agents_artifacts_list agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/environments/{environment_id}/connect agents_cannot_executor_channel agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/agents/environments/{environment_id}/register agents_cannot_executor_registration agents:use enabled、scopes、audit;仅通用 limits
agents DELETE /v1/models/{model} agents_cannot_models_delete agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/responses/input_tokens agents_cannot_responses_input_tokens agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/agents agents_definitions_create agents:use enabled、scopes、audit;仅通用 limits
agents DELETE /v1/agents/{agent_id} agents_definitions_delete agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/{agent_id} agents_definitions_get agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents agents_definitions_list agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/agents/{agent_id} agents_definitions_update agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/agents/environments/{environment_id}/files agents_environment_files_create agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/environments/{environment_id}/files agents_environment_files_list agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/agents/environments/templates agents_environment_templates_create agents:use enabled、scopes、audit;仅通用 limits
agents DELETE /v1/agents/environments/templates/{environment_template_id} agents_environment_templates_delete agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/environments/templates/{environment_template_id} agents_environment_templates_get agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/environments/templates agents_environment_templates_list agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/agents/environments/templates/{environment_template_id} agents_environment_templates_update agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/agents/environments agents_environments_create agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/environments/{environment_id} agents_environments_get agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/environments agents_environments_list agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/files agents_files_create agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/models/{model} agents_models_get agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/models agents_models_list agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/responses/{response_id}/cancel agents_responses_cancel agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/responses/compact agents_responses_compact agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/responses agents_responses_connect agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/responses agents_responses_create agents:use enabled、scopes、audit;仅通用 limits
agents DELETE /v1/responses/{response_id} agents_responses_delete agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/responses/{response_id} agents_responses_get agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/responses/{response_id}/input_items agents_responses_input_items agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/runtimes agents_runtimes_list agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/agents/sessions agents_sessions_create agents:use enabled、scopes、audit;仅通用 limits
agents DELETE /v1/agents/sessions/{id} agents_sessions_delete agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/agents/sessions/{id}/events agents_sessions_events_create agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/sessions/{id}/events agents_sessions_events_stream agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/sessions/{id} agents_sessions_get agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/sessions/{id}/items agents_sessions_items_list agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/sessions agents_sessions_list agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/sessions/{id}/turns/{turn_id} agents_sessions_turns_get agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/sessions/{id}/turns/{turn_id}/items agents_sessions_turns_items_list agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/sessions/{id}/turns agents_sessions_turns_list agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/agents/sessions/{id} agents_sessions_update agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/sessions/{id}/subagents/{subagent_id} agents_subagents_get agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/sessions/{id}/subagents/{subagent_id}/items agents_subagents_items_list agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/sessions/{id}/subagents agents_subagents_list agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/sessions/{id}/subagents/{subagent_id}/turns/{turn_id} agents_subagents_turns_get agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/sessions/{id}/subagents/{subagent_id}/turns/{turn_id}/items agents_subagents_turns_items_list agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/sessions/{id}/subagents/{subagent_id}/turns agents_subagents_turns_list agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/agents/sessions/{id}/traces agents_traces_list agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/vaults/{vault_id}/credentials agents_vault_credentials_create agents:use enabled、scopes、audit;仅通用 limits
agents DELETE /v1/vaults/{vault_id}/credentials/{credential_id} agents_vault_credentials_delete agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/vaults/{vault_id}/credentials/{credential_id} agents_vault_credentials_get agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/vaults/{vault_id}/credentials agents_vault_credentials_list agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/vaults/{vault_id}/credentials/{credential_id} agents_vault_credentials_update agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/vaults agents_vaults_create agents:use enabled、scopes、audit;仅通用 limits
agents DELETE /v1/vaults/{vault_id} agents_vaults_delete agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/vaults/{vault_id} agents_vaults_get agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/vaults agents_vaults_list agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/vaults/{vault_id} agents_vaults_update agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/webhook_event_types agents_webhook_event_types agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/webhook_endpoints agents_webhooks_create agents:use enabled、scopes、audit;仅通用 limits
agents DELETE /v1/webhook_endpoints/{webhook_endpoint_id} agents_webhooks_delete agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/webhook_endpoints/{webhook_endpoint_id} agents_webhooks_get agents:use enabled、scopes、audit;仅通用 limits
agents GET /v1/webhook_endpoints agents_webhooks_list agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/webhook_endpoints/{webhook_endpoint_id}/rotate_secret agents_webhooks_rotate_secret agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/webhook_endpoints/{webhook_endpoint_id}/test agents_webhooks_test agents:use enabled、scopes、audit;仅通用 limits
agents POST /v1/webhook_endpoints/{webhook_endpoint_id} agents_webhooks_update agents:use enabled、scopes、audit;仅通用 limits
browser POST /browser/click browser_click browser:use 仅通用 limits
browser GET /browser/console browser_console browser:use 仅通用 limits
browser GET /browser/content browser_content browser:use 仅通用 limits
browser POST /browser/evaluate browser_evaluate browser:evaluate 会执行程序
browser POST /browser/navigate browser_navigate browser:use params:block_private_networks、url_allow、url_deny;会执行程序
browser POST /browser/pdf browser_pdf browser:use 仅通用 limits
browser POST /browser/screenshot browser_screenshot browser:use 仅通用 limits
browser POST /browser/type browser_type browser:use 仅通用 limits
commands GET /commands list_commands commands:list 仅通用 limits
commands POST /commands/{name} run_command commands:run 仅通用 limits
core GET /capabilities capabilities core:read 不可关闭
core POST /capabilities/check capabilities_check core:read 不可关闭
core GET /health health — 不可关闭
dev_tools POST /code/run code_run devtools:run params:languages;limits:max_output_bytes、timeout_seconds;会执行程序
dev_tools GET /git/diff git_diff devtools:read paths
dev_tools GET /git/status git_status devtools:read paths
file_ops GET /download download files:read paths;limits:max_bytes
file_ops POST /files/archive files_archive files:read paths;limits:max_bytes、max_files
file_ops DELETE /files files_delete files:delete paths
file_ops GET /files/download-stream files_download_stream files:read paths;limits:max_bytes
file_ops GET /files/list files_list files:read paths;limits:max_depth、max_entries
file_ops POST /files/mkdir files_mkdir files:write paths
file_ops POST /files/move files_move files:write, files:delete paths
file_ops POST /files/search files_search files:read paths;limits:max_depth、max_results、timeout_seconds
file_ops GET /files/stat files_stat files:read paths
file_ops POST /files/upload-stream files_upload_stream files:write paths;params:allow_extensions、deny_extensions、overwrite;limits:max_bytes
file_ops GET /files/watch files_watch files:read paths;limits:max_duration_seconds
file_ops POST /upload upload files:write paths;params:allow_extensions、deny_extensions、overwrite;limits:max_bytes
process GET /process/{pid} process_detail process:read 仅通用 limits
process GET /process/list process_list process:read 仅通用 limits
process GET /process/{pid}/output process_output process:read 仅通用 limits
process POST /process/{pid}/signal process_signal process:manage params:allowed_signals
process POST /process/start process_start process:run paths;params:allow_commands、deny_commands;limits:max_output_bytes、max_processes、timeout_seconds;会执行程序
process POST /process/{pid}/stdin process_stdin process:manage 仅通用 limits
process POST /shell shell process:run paths;params:allow_commands、deny_commands;limits:max_output_bytes、max_processes、timeout_seconds;会执行程序
process POST /shell/stream shell_stream process:run paths;params:allow_commands、deny_commands;limits:max_output_bytes、max_processes、timeout_seconds;会执行程序
system GET /env env_get system:read params:allow_vars、deny_vars
system POST /env env_set system:write params:allow_vars、deny_vars
system GET /packages packages system:read 仅通用 limits
system GET /ports ports system:read 仅通用 limits
system GET /system/info system_info system:read 仅通用 limits
system GET /system/metrics system_metrics system:read 仅通用 limits
terminal WS /pty pty_connect terminal:use 仅通用 limits
terminal POST /pty/sessions pty_create_session terminal:use params:env_deny、shells;limits:max_sessions
terminal DELETE /pty/sessions/{id} pty_delete_session terminal:use 仅通用 limits
terminal GET /pty/sessions/{id} pty_detail terminal:use 仅通用 limits
terminal GET /pty/sessions pty_list_sessions terminal:use 仅通用 limits
terminal POST /pty/sessions/{id}/resize pty_resize terminal:use 仅通用 limits

和 Agents API 案例的关系

agents-cli 只启用:

端点 id 路由
agents_sessions_create POST /v1/agents/sessions
agents_sessions_get GET /v1/agents/sessions/{id}
agents_sessions_list GET /v1/agents/sessions
agents_sessions_events_create POST /v1/agents/sessions/{id}/events
agents_sessions_items_list GET /v1/agents/sessions/{id}/items
agents_runtimes_list GET /v1/agents/runtimes

本地 e2e 已确认:POST /shell 是 404,POST /v1/agents(定义)是 404,Codex 和 Qwen Code 的会话、事件、条目仍然 200 / 202。要再开放一条路由,把对应端点 id 加进 ServerPolicy.only 和 template.yaml 的 endpoints。