> ## Documentation Index
> Fetch the complete documentation index at: https://agent-compass.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Daytona

Daytona provider 会为每次任务执行创建一个远程 sandbox，适合希望使用隔离的 Linux 工作区、又不想占用本地计算资源的评测。

匹配的 [Recipe](/zh/user_guide/other_features/recipes) 可以补充镜像和工作区等默认值；兼容的显式参数通常会保留。Daytona 需要可访问的服务端和具有 sandbox 权限的凭证。

## 使用前准备

1. 在 [Daytona 控制台](https://app.daytona.io/) 创建账号，并在 [API 密钥页面](https://app.daytona.io/dashboard/keys) 创建密钥。
2. 设置 `DAYTONA_API_KEY`。自托管或多目标部署还可以设置 `DAYTONA_API_URL` 和 `DAYTONA_TARGET`。
3. 不要将真实凭证提交到仓库；CI 中应使用密钥存储。

也可以在私有配置文件中填写 `api_key`、`api_url` 和 `target`。环境变量更适合本地终端和 CI。

<a id="运行一个任务" />

## 使用 `run` 验证配置

下面以 SWE-bench Verified 和 mini-swe-agent 为例。示例通过 [`sample_ids`](/zh/user_guide/modules/benchmarks/overview#共享-benchmark-字段) 只运行一个任务；匹配的 Recipe 会根据该任务选择 Daytona 可用的镜像和工作区：

```bash theme={"system"}
agentcompass run swebench_verified mini_swe_agent "$MODEL_NAME" \
  --env daytona \
  --benchmark-params '{"sample_ids":["astropy__astropy-12907"]}'
```

上面是 `agentcompass run` 的最小验证示例。模型端点等通用参数见 [`agentcompass run`](/zh/user_guide/using_agentcompass/cli/run)。

Daytona 同样支持 `agentcompass launch`。在编排文件的 `defaults.environment` 中设置所有请求共享的 Daytona 配置，或在 `requests[].environment` 中设置单个请求；`id: daytona` 与 Daytona 参数写在同一层。详见 [`launch` 的映射规则](/zh/user_guide/using_agentcompass/cli/launch#映射规则)。

<a id="provider-参数" />

## 参数参考

参数可以通过 `--env-params` 传入，也可以写在配置文件的 `environments.daytona` 中。

上面的示例继续使用环境变量中的 Daytona 凭证，并由 Recipe 补充任务镜像。将以下选项添加到该命令，可以为每个基于镜像创建的 sandbox 申请 2 vCPU、4 GiB 内存和 8 GiB 磁盘：

```bash theme={"system"}
--env-params '{"resources":{"cpu":2,"memory":4,"disk":8}}'
```

`resources` 只对 `image` 启动路径生效。显式设置 `snapshot`，或不设置启动来源而使用 Daytona 默认 snapshot 时，AgentCompass 都不会传递该字段。

### 连接与凭证

<div style={{overflowX:'auto'}}>
  <table style={{width:'100%', minWidth:'840px', tableLayout:'fixed'}}>
    <thead>
      <tr><th style={{width:'230px'}}>字段</th><th style={{width:'210px'}}>默认值</th><th>说明</th></tr>
    </thead>

    <tbody>
      <tr><td style={{width:'230px'}}><code>api\_key</code></td><td style={{width:'210px'}}><code>DAYTONA\_API\_KEY</code></td><td>Daytona API key。未显式设置时读取同名环境变量；也可以改用 JWT 鉴权。</td></tr>
      <tr><td style={{width:'230px'}}><code>api\_url</code></td><td style={{width:'210px'}}><code>DAYTONA\_API\_URL</code></td><td>Daytona API 根地址。环境变量也未设置时，SDK 默认使用 <code>[https://app.daytona.io/api](https://app.daytona.io/api)</code>。</td></tr>
      <tr><td style={{width:'230px'}}><code>target</code></td><td style={{width:'210px'}}><code>DAYTONA\_TARGET</code></td><td>Daytona 中配置的 target 标识，用于选择 sandbox 的执行位置或区域；未设置时使用组织的默认区域。</td></tr>
      <tr><td style={{width:'230px'}}><code>jwt\_token</code></td><td style={{width:'210px'}}><code>DAYTONA\_JWT\_TOKEN</code></td><td>JWT 鉴权令牌。使用 JWT 时还必须提供 <code>organization\_id</code>。</td></tr>
      <tr><td style={{width:'230px'}}><code>organization\_id</code></td><td style={{width:'210px'}}><code>DAYTONA\_ORGANIZATION\_ID</code></td><td>JWT 鉴权使用的组织 ID。</td></tr>
      <tr><td style={{width:'230px'}}><code>connection\_pool\_maxsize</code></td><td style={{width:'210px'}}><code>250</code></td><td>Daytona SDK 同时打开的 HTTP 连接数上限，必须是正整数；设为 JSON <code>null</code> 可以移除该上限。</td></tr>
    </tbody>
  </table>
</div>

鉴权至少需要配置 `api_key`，或同时配置 `jwt_token` 与 `organization_id`。

### 镜像与启动

<div style={{overflowX:'auto'}}>
  <table style={{width:'100%', minWidth:'760px', tableLayout:'fixed'}}>
    <thead>
      <tr><th style={{width:'230px'}}>字段</th><th style={{width:'130px'}}>默认值</th><th>说明</th></tr>
    </thead>

    <tbody>
      <tr><td style={{width:'230px'}}><code>image</code></td><td style={{width:'130px'}}>未设置</td><td>镜像仓库中的镜像名称，例如 <code>python:3.12</code>。Daytona 从该镜像创建 sandbox；只有此启动路径会应用 <code>resources</code>。</td></tr>
      <tr><td style={{width:'230px'}}><code>snapshot</code></td><td style={{width:'130px'}}>未设置</td><td>当前组织中处于 Active 状态的 Daytona snapshot 名称。sandbox 规格由 snapshot 决定，AgentCompass 不会传递 <code>resources</code>。</td></tr>
      <tr><td style={{width:'230px'}}><code>dockerfile</code></td><td style={{width:'130px'}}>未设置</td><td>预留字段；当前实现会报不支持。请先构建并发布镜像，再设置 <code>image</code>。</td></tr>
      <tr><td style={{width:'230px'}}><code>compose\_file</code></td><td style={{width:'130px'}}>未设置</td><td>预留字段；当前实现不支持通过 Docker Compose / DinD 启动 sandbox。</td></tr>
      <tr><td style={{width:'230px'}}><code>language</code></td><td style={{width:'130px'}}><code>python</code></td><td>Daytona 的代码执行语言，可选 <code>python</code>、<code>typescript</code> 或 <code>javascript</code>。未指定启动来源时用于选择默认 snapshot；自定义镜像仍须包含任务实际需要的运行时。</td></tr>
      <tr><td style={{width:'230px'}}><code>os\_user</code></td><td style={{width:'130px'}}>Daytona 默认值</td><td>sandbox 内执行命令的 OS 用户，必须已存在于镜像或 snapshot 中；留空时使用其默认用户。</td></tr>
    </tbody>
  </table>
</div>

`image`、`snapshot`、`dockerfile` 和 `compose_file` 只能设置一个；当前可用的启动来源只有 `image` 和 `snapshot`。两者都未设置时，Daytona 会使用 `language` 对应的默认 snapshot。要求预构建任务环境的 Benchmark 仍须由 Recipe 或显式参数提供兼容的 `image` / `snapshot`。

### 标识与元数据

<div style={{overflowX:'auto'}}>
  <table style={{width:'100%', minWidth:'760px', tableLayout:'fixed'}}>
    <thead>
      <tr><th style={{width:'220px'}}>字段</th><th style={{width:'100px'}}>默认值</th><th>说明</th></tr>
    </thead>

    <tbody>
      <tr><td style={{width:'220px'}}><code>name</code></td><td style={{width:'100px'}}>自动生成</td><td>sandbox 名称。固定名称可能在并发创建或上次 sandbox 尚未清理时发生冲突。</td></tr>
      <tr><td style={{width:'220px'}}><code>labels</code></td><td style={{width:'100px'}}><code>\{}</code></td><td>创建时写入 Daytona 的字符串键值映射，例如 <code>\{"batch":"nightly"}</code>；可用于记录所有者或评测批次。</td></tr>
    </tbody>
  </table>
</div>

### 工作区与环境变量

<div style={{overflowX:'auto'}}>
  <table style={{width:'100%', minWidth:'760px', tableLayout:'fixed'}}>
    <thead>
      <tr><th style={{width:'230px'}}>字段</th><th style={{width:'130px'}}>默认值</th><th>说明</th></tr>
    </thead>

    <tbody>
      <tr><td style={{width:'230px'}}><code>default\_workspace\_root</code></td><td style={{width:'130px'}}><code>workspace/</code></td><td>Benchmark 未指定任务工作目录时，Harness 使用的默认路径。AgentCompass 会在 sandbox 创建后确保该目录存在。</td></tr>
      <tr><td style={{width:'230px'}}><code>env\_variables</code></td><td style={{width:'130px'}}><code>\{}</code></td><td>环境变量映射，例如 <code>\{"DEBUG":"1"}</code>。变量名必须符合 <code>\[A-Za-z\_]\[A-Za-z0-9\_]\*</code>；值会转换为字符串，在创建 sandbox 时传给 Daytona，并合并到后续命令的环境中。</td></tr>
    </tbody>
  </table>
</div>

### 资源

<div style={{overflowX:'auto'}}>
  <table style={{width:'100%', minWidth:'760px', tableLayout:'fixed'}}>
    <thead>
      <tr><th style={{width:'230px'}}>字段</th><th style={{width:'150px'}}>默认值</th><th>说明</th></tr>
    </thead>

    <tbody>
      <tr><td style={{width:'230px'}}><code>resources</code></td><td style={{width:'150px'}}><code>\{}</code></td><td>Daytona 资源对象，仅在通过 <code>image</code> 创建 sandbox 时传递。支持的子字段如下。</td></tr>
      <tr><td style={{width:'230px'}}><code>resources.cpu</code></td><td style={{width:'150px'}}><code>1</code> vCPU</td><td>申请的 vCPU 数量，使用正整数。别名为 <code>resources.cpus</code>；实际可用上限由组织配置决定。</td></tr>
      <tr><td style={{width:'230px'}}><code>resources.memory</code></td><td style={{width:'150px'}}><code>1</code> GiB</td><td>申请的内存，单位为 GiB，使用正整数；实际可用上限由组织配置决定。</td></tr>
      <tr><td style={{width:'230px'}}><code>resources.disk</code></td><td style={{width:'150px'}}><code>3</code> GiB</td><td>申请的磁盘空间，单位为 GiB，使用正整数。别名为 <code>resources.storage</code>；实际可用上限由组织配置决定。</td></tr>
      <tr><td style={{width:'230px'}}><code>resources.gpu</code></td><td style={{width:'150px'}}>未设置</td><td>申请 GPU；Daytona 当前每个 sandbox 最多 1 块，因此值应为 <code>1</code>。还需设置 <code>ephemeral=true</code> 或 <code>auto\_delete\_interval=0</code>。别名为 <code>resources.gpus</code>；当前适配器不支持 <code>gpu\_type</code>，不能指定 GPU 型号。</td></tr>
    </tbody>
  </table>
</div>

优先使用表中的标准字段，不要同时设置一个字段及其别名。当前适配器不会把其他 `resources` 子字段传给 Daytona。资源值还必须符合组织的单 sandbox 上限；该上限以 Daytona 控制台和官方说明为准。

### 网络

<div style={{overflowX:'auto'}}>
  <table style={{width:'100%', minWidth:'720px', tableLayout:'fixed'}}>
    <thead>
      <tr><th style={{width:'220px'}}>字段</th><th style={{width:'100px'}}>默认值</th><th>说明</th></tr>
    </thead>

    <tbody>
      <tr><td style={{width:'220px'}}><code>network\_block\_all</code></td><td style={{width:'100px'}}>未设置</td><td>Daytona 原生出站防火墙开关。<code>true</code> 阻断全部出站访问；<code>false</code> 关闭 sandbox 级 block-all，但不能覆盖组织级策略。</td></tr>
      <tr><td style={{width:'220px'}}><code>network\_allow\_list</code></td><td style={{width:'100px'}}><code>\[]</code></td><td>允许访问的外部 IPv4 地址或 CIDR 数组，例如 <code>\["203.0.113.10","10.0.0.0/8"]</code>。设置后，其他外部 IP 目标会被阻断；裸 IPv4 会转换为 <code>/32</code>，最多 10 项，不支持 IPv6。</td></tr>
      <tr><td style={{width:'220px'}}><code>domain\_allow\_list</code></td><td style={{width:'100px'}}><code>\[]</code></td><td>允许访问的外部域名数组，例如 <code>\["api.example.com","\*.example.org"]</code>。设置后，其他外部域名会被阻断；最多 20 项，不要包含协议、端口或路径。</td></tr>
    </tbody>
  </table>
</div>

三种限制方式中只能启用一种：`network_allow_list` 与 `domain_allow_list` 不能同时非空，`network_block_all=true` 也不能与任一列表组合。这些字段只在 Environment 的共享基线策略为 `public` 时用于初始创建。为了让准备、agent 运行和验证阶段使用一致的规则，建议改用[通用网络策略](/zh/user_guide/modules/environments/configuration/network)，不要同时配置两套方式。

Daytona 的组织级网络策略始终优先于 sandbox 设置。按照 Daytona 当前的 tier 规则，Tier 1 和 Tier 2 不能在 sandbox 级覆盖组织限制；Tier 3 和 Tier 4 才能自定义或动态更新。阶段网络切换还要求凭证具有相应写权限，并且安装的 SDK 提供 `update_network_settings`。

### 生命周期与超时

<div style={{overflowX:'auto'}}>
  <table style={{width:'100%', minWidth:'760px', tableLayout:'fixed'}}>
    <thead>
      <tr><th style={{width:'220px'}}>字段</th><th style={{width:'100px'}}>默认值</th><th>说明</th></tr>
    </thead>

    <tbody>
      <tr><td style={{width:'220px'}}><code>auto\_stop\_interval</code></td><td style={{width:'100px'}}><code>15</code></td><td>运行中的 sandbox 在多长时间没有 Daytona 活动后自动停止，使用非负整数分钟；<code>0</code> 表示禁用。内部后台进程本身不一定会刷新该计时。</td></tr>
      <tr><td style={{width:'220px'}}><code>auto\_archive\_interval</code></td><td style={{width:'100px'}}>未设置</td><td>连续停止多少分钟后自动归档，使用非负整数。未设置时使用 Daytona 默认值（当前 container sandbox 为 7 天）；<code>0</code> 使用当前最大间隔 30 天。该功能仅适用于 container sandbox。</td></tr>
      <tr><td style={{width:'220px'}}><code>auto\_delete\_interval</code></td><td style={{width:'100px'}}>未设置</td><td>连续停止多少分钟后自动删除。未设置时禁用，<code>0</code> 表示停止后立即删除；AgentCompass 只接受非负整数。</td></tr>
      <tr><td style={{width:'220px'}}><code>ephemeral</code></td><td style={{width:'100px'}}><code>false</code></td><td>设为 <code>true</code> 时，Daytona 会将 <code>auto\_delete\_interval</code> 设为 <code>0</code>，sandbox 一旦停止就会删除；此时 <code>auto\_archive\_interval</code> 不会生效。</td></tr>
      <tr><td style={{width:'220px'}}><code>delete\_on\_close</code></td><td style={{width:'100px'}}><code>true</code></td><td>AgentCompass 正常关闭 Environment 时，<code>true</code> 调用 Daytona 删除，<code>false</code> 改为调用停止。</td></tr>
      <tr><td style={{width:'220px'}}><code>sandbox\_start\_timeout</code></td><td style={{width:'100px'}}><code>60</code></td><td>等待 Daytona 创建并启动 sandbox 的秒数，使用正数；在 AgentCompass 中，<code>0</code> 不表示无限等待，而会回退到 60 秒。</td></tr>
      <tr><td style={{width:'220px'}}><code>operation\_timeout</code></td><td style={{width:'100px'}}><code>1800</code></td><td>命令、文件操作或网络更新未指定更具体超时时使用的默认秒数，必须是正整数。</td></tr>
    </tbody>
  </table>
</div>

`delete_on_close=false` 与 `--keep-environment` 含义不同：前者仍执行正常关闭，只是调用 Daytona 的停止操作；如果同时设置了 `ephemeral=true` 或 `auto_delete_interval=0`，Daytona 仍会在停止时删除 sandbox。后者会跳过 AgentCompass 的本次关闭操作，但不能绕过 Daytona 的自动停止、归档或删除规则。相关行为见[运行控制](/zh/user_guide/using_agentcompass/run_controls)。

## 参数参考来源

* 运行 `agentcompass config docs env daytona`，可以查看当前安装版本实际支持的字段、类型和默认值。
* [Daytona Async Python SDK：客户端配置与创建参数](https://www.daytona.io/docs/en/python-sdk/async/async-daytona/)
* [Daytona Async Python SDK：Resources 类型](https://www.daytona.io/docs/en/python-sdk/async/async-sandbox/#resources)
* [Daytona Sandboxes：资源、临时 sandbox 与生命周期](https://www.daytona.io/docs/en/sandboxes/)
* [Daytona Snapshots](https://www.daytona.io/docs/en/snapshots/)
* [Daytona Network Limits](https://www.daytona.io/docs/en/network-limits/)

支持的字段、类型和默认值以该命令的输出为准；Daytona 原生字段的取值与平台行为，以上游文档和所连接服务的版本为准。

## 特有行为

* 使用 snapshot 创建时，sandbox 的资源由 snapshot 或 Daytona 配置决定，`resources` 不会应用。
* 如果 Benchmark 要求预构建任务镜像，而 Recipe 和显式参数都没有提供 `image` 或 `snapshot`，AgentCompass 会在创建前报错。
* 阶段网络切换依赖当前安装的 Daytona SDK；SDK 不支持动态更新时会给出明确错误。

## 故障排查

| 现象                           | 检查内容                                                               |
| ---------------------------- | ------------------------------------------------------------------ |
| 鉴权失败                         | 检查 API key 是否有效、是否具有 sandbox 权限，以及 `api_url`、`target` 是否属于同一部署。    |
| 提示启动来源冲突                     | `image`、`snapshot`、`dockerfile`、`compose_file` 只能设置一个。             |
| 提示 Dockerfile 或 Compose 不受支持 | 先构建并发布镜像，再通过 `image` 使用；也可以创建 Daytona snapshot。                    |
| sandbox 启动超时                 | 确认镜像或 snapshot 可以由所选 target 使用，再按实际启动时间增加 `sandbox_start_timeout`。 |
| 资源配置没有作用                     | 如果使用 `snapshot`，应在 Daytona 侧配置资源；`resources` 只在通过 `image` 创建时应用。   |

## 相关页面

* [Environment 概览](/zh/user_guide/modules/environments/overview)
* [配置 Environment](/zh/user_guide/modules/environments/configuration/overview)
* [资源限制](/zh/user_guide/modules/environments/configuration/resource_limits)
* [CLI 配置文件](/zh/user_guide/using_agentcompass/cli/config)
