Files
AgentLab/.env.example
T
ThearchyHelios 7d00c24ab1 microVM 沙箱后端:内存限额终于真限得住,但网络关不干净
Seatbelt 在 macOS 上最难受的缺口是 RLIMIT_AS 不被强制——设 256MB 仍能分配
900MB。microVM 不是"更严格的访问控制",是换了一类边界:宿主 Darwin 27.0.0,
VM 里 Linux 6.12.99(libkrunfw),PID 1 是 init.krun,/Users 根本不存在,
free 只看得见 512MB。申请 900MB 会被 OOM killer 杀掉而 VM 照常存活。

实现按实测契约写,不按别的 SDK 的惯例推断:create() 直接返回已启动的
Sandbox,没有 handle/connect 两层;cwd/env/timeout 都是 exec 的原生参数;
超时抛 ExecTimeoutError 而不是返回非零码。

必须写明的缺口:network=false 时 HTTP/HTTPS 与域名解析都断得掉,但 UDP/53
拦不住,手写 DNS 包仍能拿到真实响应。default_egress=DENY、Rule.deny_dns()、
显式 deny UDP、max_connections=0 全试过都堵不上——deny_dns 生成的规则只针对
宿主,DNS 出口在 microsandbox 网络栈里是硬编码放行的。所以 health 里 network
标成 partial 而不是 true,设置页对应显示黄色「部分生效」:拦了一半要是显示成
全绿,比显示成全红更危险。

成本也照实说:首次拉 OCI 镜像实测 54.5s,之后热启动 0.19s、执行 7~30ms。
贵的只是第一次,所以 auto 在镜像没缓存时先用 Seatbelt,不让人干等一分钟;
显式选 strict 档不受此限——那是使用者自己要的硬隔离。

端到端 17 项验证通过:隔离、内存拦截、超时 124、退出码透传、多文件与 env、
会话间互不可见、VM 回收。Seatbelt 那档回归未受影响。
2026-09-14 14:10:10 +08:00

56 lines
2.4 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 复制成 .env 后按需修改。所有项都可以留空——留空时用代码里的默认值。
# API Key 也可以不写在这里,启动后在「设置 → 模型接入」页面填,会加密存进本地 SQLite。
# ---- 环境 ----
# 后端跑在哪个 conda 环境里(dev.sh 用)
# AGENTLAB_CONDA_ENV=agentlab
# ---- 服务 ----
# AGENTLAB_PORT=8000
# AGENTLAB_WEB_PORT=5273
# ---- 沙箱 ----
# auto(挑第一个已就绪的:microvm → bubblewrap → seatbelt → local)
# 可选值:microvm | seatbelt | bubblewrap | local | off
# AGENTLAB_SANDBOX_BACKEND=auto
# ---- microVM 沙箱(独立 Linux 内核,需 conda 环境装了 [microvm] 额外依赖)----
# 注意:内存/CPU/进程表是内核级真限额,但网络关不干净——HTTP/HTTPS 断得掉,
# UDP/53 拦不住,DNS 隧道外泄通道始终开着。防外泄要靠网络层,别指望沙箱。
# 跑代码用的 OCI 镜像,首次使用会拉取并缓存到 ~/.microsandbox(实测约 55s,仅此一次)
# AGENTLAB_MICROVM_IMAGE=python:3.12-slim
# 同 session 复用同一台 VM;空闲这么久就回收,避免闲置 VM 占内存
# AGENTLAB_MICROVM_IDLE_SECONDS=300
# 单次启动(含首次拉镜像)的等待上限
# AGENTLAB_MICROVM_BOOT_TIMEOUT=300
# AGENTLAB_SANDBOX_TIMEOUT=30
# 内存限额:microvm 后端真实生效;seatbelt/local 在 macOS 上限不住(不强制 RLIMIT_AS)
# AGENTLAB_SANDBOX_MEMORY_MB=512
# AGENTLAB_SANDBOX_NETWORK=false
# ---- 执行护栏 ----
# AGENTLAB_MAX_GRAPH_STEPS=200
# AGENTLAB_MAX_AGENT_STEPS=25
# AGENTLAB_MAX_CONCURRENT_RUNS=20
# ---- HTTP 工具 ----
# 逗号分隔的域名白名单;留空表示只拦内网地址,不限制公网域名
# AGENTLAB_HTTP_TOOL_ALLOWLIST=api.github.com,news.ycombinator.com
# ---- 落库加密密钥 ----
# 留空会自动生成并存到 data/.secret_key。换了这个值,之前存的 API Key 会解不开。
# AGENTLAB_SECRET_KEY=
# ---- 模型凭据(可选,首次启动会自动导入成 provider)----
# ANTHROPIC_API_KEY=sk-ant-...
# 用中转网关时填这两个(会以 Authorization: Bearer 发送)
# ANTHROPIC_BASE_URL=https://your-gateway.example.com/api
# ANTHROPIC_AUTH_TOKEN=...
# OPENAI_API_KEY=sk-...
# ---- 可选增强 ----
# 配了就用 Tavily 搜索,否则 web_search 退回 DuckDuckGo
# TAVILY_API_KEY=tvly-...
# 打开后知识库用 OpenAI embedding 代替本地哈希向量(检索质量更好)
# AGENTLAB_USE_OPENAI_EMBEDDINGS=1