AppWorld 智能体基准测试环境
一个可控的 9 应用模拟世界,用可控的任务和基于数据库状态的评测来检验函数调用与交互式编程智能体。
按维度查看评分与理由
README 明确将 AppWorld 定位为 no-consequence sandbox,并设有 Code Execution Safety 与 Agent Development Restrictions 章节,说明作者意识到权限与执行风险;但仓库主体(apps、tests、数据生成)以加密 .bundle 形式发布,静态审查无法核实实际权限边界、是否最小权限、是否对敏感操作要求确认。依赖清单对 fastapi-login、freezegun、cryptography 等做了上下界固定并附理由,属于可核查的依赖安全实践,故 dependency_security 给 2;但无 SBOM、无漏洞扫描配置、无 lockfile 提交,未达 3。数据流透明度和敏感数据处理仅有概念性说明(supervisor 可提供密码、地址、支付卡),未见具体脱敏或最小化策略,故各给 1。回滚方面仅提到 world.close() 释放资源,未见状态回滚或破坏性默认的恢复机制,给 1。来源归属方面 LICENSE 为完整 Apache-2.0,pyproject 声明 license 与 authors/maintainers,给 2。
pyproject 对关键依赖给出带日期注释的上下界,CI 矩阵覆盖 3.11–3.14、Windows、lowest-direct 解析,并包含 bundle-check 与多轮 verify tasks,自洽性与依赖可获得性证据较充分,各给 2。失败信息方面 README 提到 verify 失败请提 issue、命令缺失时可用 python -m appworld.cli 兜底,但未见结构化错误码或诊断文档,给 1。
受众与场景覆盖研究者、agent 开发者、MCP 客户端与终端 agent,README 提供多路径接入,给 2。能力边界说明较清楚:9 个应用、457 API、train/dev 有完整 ground truth 而 test 仅有评测程序,给 2。触发精度方面 CLI 子命令与 --help 有说明,但 agent 何时调用 complete_task、何时算完成缺乏精确触发规范,给 1。环境适配有 conda、源码安装、Docker、serverless TestClient、APPWORLD_ROOT 配置,给 2。
信息架构清晰,README 目录锚点完整,给 2。安装说明含 pip、源码、Git LFS、加密 bundle 解包、数据下载与验证,属充分级别,给 3。命名稳定性方面包名、CLI、模块路径一致,但版本仍为 0.2.0.dev0 且 Development Status 为 Alpha,给 2。示例与 FAQ 有 TLDR、notebook、折叠式问答,但未达系统化 FAQ,给 2。已知限制明确披露加密 bundle、测试集不公开 setup/solution、训练污染风险,给 2。许可证为完整 Apache-2.0 文本,给 3。版本与变更日志仅有 pyproject 版本号,无 CHANGELOG,给 1。维护责任有 maintainers 字段与贡献指南,但发布者身份未经验证,给 2。
输出可用性方面提供 world.execute、evaluate().report()、leaderboard pack/unpack 等可操作产物,给 2。边际价值在于可复现的交互式编码 agent 基准与可控世界,对目标用户有明确增量,给 2。成本收益方面需下载数据、解包 bundle、运行验证,成本不低但换来标准化评测,给 2。
claim_traceability:README 的论文、网站、leaderboard、CI 徽章等主张可追溯到具体文件与链接,给 2。cross_source_corroboration:README、pyproject、CI 工作流、测试文件之间基本一致,但核心实现位于加密 bundle,无法交叉核实,给 1。fact_inference_separation:文档区分了已发布与未发布内容,但部分能力描述(如安全性、沙箱无后果)属断言而非可验证事实,给 1。
- 核心实现、应用与测试以加密 .bundle 形式发布,静态审查无法核实真实权限边界、沙箱隔离强度与敏感数据处理,部署前应在隔离环境中实测。
- supervisor 应用可提供密码、地址与支付卡等敏感信息,仓库未见明确的脱敏、最小化或访问审计策略,接入真实数据前需自行加固。
- 版本为 0.2.0.dev0 且标记 Alpha,无 CHANGELOG,接口与数据格式可能变动,生产使用需锁定版本。
- 发布者身份未经验证,维护责任与更新路径仅依赖仓库内 maintainers 字段,不能据此推断可靠性或安全性。
这个 Agent 能做什么,适合哪些场景?
AppWorld 是 Stony Brook NLP 团队发布、获得 ACL'24 最佳资源论文奖的资源,由两部分组成。AppWorld Engine 是一个沙盒式执行环境,用 457 个 FastAPI 风格的 API 和 100 多张数据库表实现了 9 个日常应用(如 Amazon、Spotify、Venmo),并填充了约 100 个模拟人物之间相互关联的数字化活动。AppWorld Benchmark 在其上构建了自然、多样、具有挑战性的自主任务,每个任务由 Supervisor、Instruction 和 Initial State 定义。智能体需要在环境内交互式编写代码并调用 API,最后通过 Supervisor 应用的 complete_task API 声明完成。评测是基于数据库状态的单元测试,输出 TGC 与 SGC 指标以及逐任务的报告,而不是基于执行过程本身。任务分为 train、dev、test_normal、test_challenge 四个子集,安装需要 Python 3.11+ 并解包加密的 .bundle 文件。
AppWorld 加载某一 task_id 对应的应用与数据库状态并设定任务时间,通过 world.execute(...) 运行一个基于 IPython 的有状态交互式 Shell,其中可以用 apis.{app_name}.{api_name}(**parameters) 的函数形式或 requester 的 REST 形式调用 API。Shell 可以复用之前的变量(例如登录得到的 access_token),支持 save_state()/load_state() 检查点,并默认启用安全限制,禁止破坏性模块与函数。每次执行与每次 API 调用都会记录到实验输出目录下的 logs/environment_io.md 和 logs/api_calls.jsonl,数据库最终状态以 jsonl 形式保存。任务结束后用 appworld evaluate 运行数据库状态单元测试,生成总体报告(TGC、SGC、任务数与场景数)和逐任务报告。新的 MCP 层允许把相同的 API 暴露为 MCP 工具(通过 appworld serve mcp http 或 stdio),既可接入 Claude、Cursor、VSCode 等 GUI 客户端,也可接入 OpenAI Agents、SmolAgents、LangChain 等框架,world.mcp.call_tool 与 world.execute 两条路径都可用。
- 研究函数调用与交互式编程智能体的实验室:需要标准化、状态化、可复现评测时,可在 train/dev 上开发,在 test_normal/test_challenge 上只测总分。
- 做强化学习或多步智能体研究的团队:可用 save_state/load_state 做状态回放,用 parallelizing worlds 指南并行运行多个世界。
- 想评测终端类编程智能体(Codex、Gemini 等)的开发者:可通过 AppWorld MCP 服务器将环境接入已有 MCP 客户端,并参考 evaluating_terminal_agents 指南。
- 应用或 API 设计者:想为智能体友好性做压力测试,可参照 guides/developing_new_apps.md 与 developing_new_task_generators.md 新增应用和任务生成器。
- 教学或演示场景:用 appworld play 打开浏览器交互式演练具体任务,配合任务浏览器与 API 浏览器讲解。
这个 Agent 有哪些优点和局限?
- 评测基于数据库最终状态而非执行过程,因此智能体可以用 Python、HTTP 客户端甚至非 Python 语言完成任务,只要能用任意 HTTP 客户端调用 API。
- 默认以 FastAPI TestClient 在单进程内模拟 HTTP 请求,无需启动服务器即可运行,首次加载任务约 4-5 秒,后续任务平均低于 0.5 秒。
- 提供环境服务器与 API 服务器两种 HTTP 接口,可选用 --docker 容器化运行,仅挂载 experiments/outputs 与 data 目录,兼顾安全与可移植。
- 原生支持 MCP,所有 AppWorld API 以统一协议暴露,官方提供 HTTP 与 STDIO 两种传输,并可一行改动在 MCP 代理与直连之间切换。
- 任务划分为 train/dev/test_normal/test_challenge 四个子集,并对 agent 开发者给出明确的使用限制,降低基准污染风险。
- 仓库大部分实现(应用、测试、数据与任务生成等)位于加密的 .bundle 文件中,GitHub 上以明文无法浏览,必须先执行 appworld install --repo 才能在本地解包查看。
- test_normal 与 test_challenge 只提供评测程序,不提供任务初始状态的设置代码与官方解答,因此无法完全复现任务构造过程。
- 官方明确请求不要在线上以明文或图片形式发布从 .bundle 提取的代码或数据,以避免进入大模型训练语料,这对二次分发构成约束。
- 需要 Python 3.11+,从源码安装还需 git LFS 与额外的 install --repo 步骤,Docker 隔离模式则要求本机可运行 Docker daemon(或改用 Podman)。
- 使用其他智能体框架接入 MCP 时不再经由 world.execute,需要自行调用 world.save() 保存状态,且一个 API 服务器进程只能维护一个任务状态,多个智能体并行需分配不同端口。
如何安装或部署这个 Agent?
需要 Python 3.11+,推荐 conda 创建环境:conda create -n appworld python=3.11.0 -y && conda activate appworld。随后执行 pip install appworld 安装包,再执行 appworld install 解包 site-packages 中被加密的 .bundle 代码,最后执行 appworld download data 下载数据。从源码安装时先 git lfs install(部分文件由 Git LFS 跟踪),再 git clone https://github.com/StonyBrookNLP/appworld 并 pip install -e .,之后用 appworld install --repo 在当前目录解包。默认数据写入当前目录作为 APPWORLD_ROOT,可用 --root 参数或环境变量 APPWORLD_ROOT 或 .env 文件修改。安装后建议用 appworld verify tests 和 appworld verify tasks 校验。若提示 appworld 命令不存在,可改用 python -m appworld.cli。
如何使用这个 Agent?
最简流程:安装后执行 from appworld import AppWorld, load_task_ids,遍历 load_task_ids("test_challenge"),对每个 task_id 打开 with AppWorld(task_id=task_id, experiment_name="sample") as world,用 world.task.instruction 读取指令,用 world.execute 编写代码调用 apis.spotify.login(...) 等 API,最后调用 apis.supervisor.complete_task() 声明完成。想直接用现成智能体时,可安装 appworld-agents 并运行 appworld run auto --agent-name {AGENT_NAME} --model-name {MODEL_NAME} --dataset-name test_challenge。评测使用 appworld evaluate {experiment_name} {dataset_name},报告写入 experiments/outputs/{experiment_name}/evaluations/ 与各任务的 evaluation/report.md。使用 MCP 时先 appworld serve apis --port 9000,再 appworld serve mcp http --remote-apis-url http://localhost:9000 --port 10000(或 stdio 模式),客户端可通过 python scripts/generate_mcp_config.py 生成配置。运行多个智能体时每个实例使用不同的 API 服务器或端口,避免状态互相干扰。