mirror of
https://github.com/ThearchyHelios/AgentLab.git
synced 2026-11-15 02:51:58 +00:00
7d00c24ab1
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 那档回归未受影响。
56 lines
2.4 KiB
Bash
56 lines
2.4 KiB
Bash
# 复制成 .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
|