a13nDocs

环境

以统一方式访问本地、容器、云端和远程目标中的文件、命令、进程与端口。

环境(Environment)以统一方式提供文件、命令、进程、保留输出和端口访问。可以直接用于自动化,也可以把新适配器交给 Harness,让 agent 在所选工作目录、沙箱、容器、虚拟机或远程执行目标中工作。它不要求 agent、模型凭据或托管服务。

环境 provider 内置于 a13n-harness;只有厂商 SDK 通过 extras 按需安装。只调用普通应用工具或远程 API 的 agent 无需环境。

从这里开始

任务指南
无需网络依赖读写文件快速入门
选择本地、沙箱、容器或远程执行选择后端
理解关闭、状态、重新进入和销毁生命周期与状态
配置内置 provider、凭据和运行时协作对象Provider 配置
比较六个云 provider云 provider
实现 provider 或提供 Host 运行时Provider 与运行时
运行命令、检查进程和读取保留输出命令与进程
理解路径、搜索模式和输出限制操作
运行完整的内置生命周期可运行示例
连接 HTTP 或反向 WebSocket EnvdRemote Envd
向 agent 提供环境工具Harness 集成

三个概念

  • Provider 定义: 验证账号输入、凭据和目标配置,再构建适配器,不进行目标 I/O。
  • Environment: 一次性使用的适配器,负责准备目标、提供操作和关闭本地资源。
  • EnvironmentState: 由 provider 管理的可移植目标证据,可交给后续新适配器。

close() 不销毁目标;显式 destroy() 是 Host 的独立决策。Direct Local 等 provider 没有可移植目标状态,也不负责销毁目标。根目录、目标 ID 或连接成功都不能证明存在隔离。

选择后端

agent 只需要普通工具或远程 API 时,不使用环境。否则选择 Native 或 Envd 路线:

路线Provider适用场景操作与归属边界
Nativedirect_local可信本地自动化宿主 OS 操作;已有目录,不承诺沙箱隔离
Nativee2b原生托管云沙箱E2B SDK;创建、暂停、恢复、续期和销毁沙箱
Nativedaytona云沙箱原生停止/启动并保留文件
Nativemodal云沙箱基于快照停止/恢复;固定运行寿命
Nativevercel云沙箱具有原生会话的命名持久沙箱
Nativesprites云沙箱持久磁盘与自动休眠/唤醒
Nativerunloop云沙箱Devbox 挂起/恢复和空闲保活
Envdlocal_envdCLI 和本地 agent私有 stdio 守护进程;关闭后保留文件
Nativedocker单机服务Docker Engine 生命周期和 exec;关闭后保留容器
Envdhttp_envd网络可达的外部守护进程HTTP(S) EIP;仅连接
Envdwebsocket_envd主动连接 Host 的守护进程反向 WebSocket EIP;与 Host 集成的 SDK,仅连接

在本地试用远程示例,无需模型、Docker 或云账号。

各层如何配合

  • Host 选择可信 provider、期望的目标配置、账号配置、当前状态、运行时协作对象、保留策略和授权。
  • 环境 provider 定义 验证账号输入、凭据和目标配置,构建新的单次使用适配器;只在运行时工厂中获取活跃协作对象。
  • Environment 准备一个精确目标(连接、恢复或创建该目标),提供结构化操作,缓存最新状态,关闭进程内资源,并支持 Host 显式销毁。
  • Harness 负责执行内挂载名称、访问上限、路由、状态聚合和非破坏性清理。
  • EIP(环境交互协议,Environment Interaction Protocol)是 a13n-envd 和远程后端使用的结构化操作协议。

EnvironmentState 和 HarnessState 是不同记录。前者是 provider 管理的目标软引用;后者是 agent 续接状态。两者都不恢复当前凭据或授权。

构建能使用环境的 agent

绑定环境提供运行时权限,但不会自动向模型开放操作。添加动态环境 Capability,它会根据每个挂载的有效访问范围和 provider 能力生成模型可见工具:

Python
from a13n_harness import AgentSpec, HarnessBuilder
from a13n_harness.environment import (
    DynamicEnvironmentCapability,
    DynamicEnvironmentConfiguration,
)

executable = HarnessBuilder().build(
    AgentSpec(model="openai-responses:gpt-5"),
    output_type=str,
    capabilities=(
        DynamicEnvironmentCapability(DynamicEnvironmentConfiguration()),
    ),
)

运行示例前配置所选模型 provider,或在测试中将模型替换为确定性的 FunctionModel。

从 Direct Local 开始

Direct Local 开放 Host 选择的已有目录:

Python
from pathlib import Path

from a13n_harness.providers.environment.builtins import select_builtin_environment_providers

(direct_local,) = select_builtin_environment_providers(("direct_local",))
environment = await direct_local.create(
    {"root": {"path": str(Path("./workspace").resolve())}},
    environment_id="workspace",
)

result = await executable.run(
    "Inspect the workspace",
    environment=environment,
)

provider 在准备阶段检查目录,不在进入范围时检查。Harness 在执行后关闭适配器,绝不销毁目标。Direct Local 在关闭时保留目录;其 destroy() 是已声明的空操作,绝不删除该目录。

Direct Local 限制通过当前环境挂载生效。它们不会把获准运行的子进程与 Host 用户账号隔离。

使用 Local Envd

Host 管理共享 Local Envd 运行时;该运行时延迟启动守护进程,并持有其设备连接。每个新适配器都会打开独立会话,使用固定的设备工作目录:

Python
from a13n_harness.providers.environment.builtins import select_builtin_environment_providers
from a13n_harness.providers.environment.local_envd.runtime import (
    LocalEnvdProviderRuntime,
    TemporaryLocalEnvdRuntimeAllocator,
    resolve_a13n_envd_executable,
)

(local_envd,) = select_builtin_environment_providers(("local_envd",))
async with LocalEnvdProviderRuntime(
    executable=resolve_a13n_envd_executable(),
    allocate_private_runtime=TemporaryLocalEnvdRuntimeAllocator(),
) as runtime:
    environment = await local_envd.create(
        {"working_directory": "/absolute/path/to/workspace"},
        environment_id="workspace",
        runtime=runtime,
    )
    result = await executable.run(
        "Inspect the working directory",
        environment=environment,
    )
    # Harness closes this adapter's Session. The Host can use another adapter
    # on the same runtime; leaving this context closes the shared Device.

可执行文件解析依次检查显式参数、A13N_ENVD_EXECUTABLE,再检查 PATH 上的 a13n-envd。客户端和 provider 包不会安装或下载原生二进制文件。

Local Envd 验证守护进程与客户端的精确兼容性,绝不会回退到 Direct Local。Envd 路径指向设备文件系统;固定 cwd 不提供访问隔离。Host 在启动时选择守护进程的 Sandbox 和出站网络模式,Envd 对每个会话实施这些设置;Host 的账号、容器或虚拟机仍决定外层隔离边界。设置和安全边界见 a13n-envd 指南。

重新进入并保留目标

Docker 等有状态 provider 返回 EnvironmentState。Host 持久保存最新状态,并在构建下一新适配器时提供:

Python
current_state = await state_store.load(environment_key)
environment = await docker.create(
    recipe,
    configuration={"docker_host": "unix:///var/run/docker.sock"},
    environment_id="workspace",
    state=current_state,
)

try:
    result = await executable.run(
        "Continue the task",
        environment=environment,
        previous_state=previous_harness_state,
    )
finally:
    await state_store.publish(environment_key, environment.dump_state())

dump_state() 同步读取适配器最新已验证缓存,返回独立副本。进入失败、取消、执行失败或关闭失败后,Host 仍可调用,不会产生额外 provider I/O。

关闭和销毁是两个明确独立的操作:

操作负责方效果
进入和执行内使用Harness进入新适配器并挂载其操作
close()Harness释放进程内资源,不移除目标
状态持久化Host选择并保存最新权威 EnvironmentState
新适配器的 destroy()Host保留策略决定删除时,移除 provider 管理的精确目标和启动材料

执行暂停或失败后仍会非破坏性关闭适配器。Harness 绝不推断临时所有权,也绝不调用 destroy()。

使用多个环境

传入多个新适配器,并显式提供执行内策略:

Python
from a13n_harness import EnvironmentMount
from a13n_harness.environment import FILE_READ_ACTIONS, EnvironmentPermissionSet

result = await executable.run(
    "Read the source data and write the build output",
    environments={
        "build": build_environment,
        "data": EnvironmentMount(
            data_environment,
            permission_ceiling=EnvironmentPermissionSet(operations=FILE_READ_ACTIONS),
        ),
    },
    default_environment="build",
)

除非挂载设置了 mount_path,默认挂载可通过 /workspace 访问,每个命名挂载可通过 /environment/{name} 访问;设置了 mount_path 的挂载只能通过该根路径访问。存在多个条目时,显式选择 default_environment,或让 /workspace 保持未绑定。映射顺序绝不授予权限。

Harness 在进入前验证完整挂载集合。一个适配器失败时,Harness 会关闭所有可能持有进程内资源的已提供适配器,且不会发布部分挂载集合。回退清理中绝不销毁目标。

仅选择必需操作

EnvironmentMount 通过精确的 permission_ceiling 收窄 provider 能力;FILE_READ_ACTIONS 和 FILE_ACTIONS 是共享操作集合。DynamicEnvironmentConfiguration 控制模型可见的稳定环境 Toolset。agent 定义不需要的 shell、后台进程、保留输出和端口操作应保持关闭。

Harness 环境指南介绍完整 Capability 配置、确定性路由、状态导出、可移植进程引用和高级 Host 运行时。

下一步

Service 中的环境

Service 基于这些 provider 工作:从模板创建托管 Docker 和云沙箱环境,通过端点和 token 连接外部 Envd 目标,并冻结每次执行的挂载;参见 Service 环境。上文介绍的嵌入式 provider 生命周期仍可独立使用。

直接 SDK 集成请参考环境生命周期与错误和远程 Envd。

本页目录