跳到正文
Hacker News· mlukewizard·· 4 天前AI 评分34

DishwasherBench:前沿模型能否装好一台洗碗机?

DishwasherBench – Can Frontier Models Stack a Dishwasher?

AI 导读

Composo 发布 DishwasherBench 0.1.0,用一台 Bosch SMV4HAX40G 的刚体物理仿真把装洗碗机做成语言模型基准,浏览器和 MCP 均可玩。

正文 · AI 翻译

Licence: MIT checks

DishwasherBench 是一个洗碗机装载游戏,基于一台真实机器的物理模拟,旨在为语言模型提供基准测试,人们也可以在浏览器中游玩。其中的游戏名为 Spotless,相关软件包命名为 @spotless/*。

玩家将一台 Bosch SMV4HAX40G 的 3D 模型装入,采用刚体物理。随后模拟其 Eco 50 程序下的洗涤过程(水流、水滴、流挂、污垢和洗涤剂化学作用),每件洗净的物品都会为玩家赢得分数。从第二关开始,并非所有物品都能装下,因此玩家必须选择装载什么以及如何装载。

这是早期版本,版本号 0.1.0。 该模拟基于对真实机器的一次测试洗涤进行校准。分数能反映玩家是否装得好,以及是否将杯子、玻璃杯和锅具口朝下放置。它目前还不能反映盘子和餐具是否堆叠得当,从而能被洗净。分数可信范围 一节对此有完整说明。

目前可靠的部分:装载是确定性的刚体物理,每个回合都是一条记录,任何人都可以通过回放并重新洗涤其装载来验证,而且同一款游戏既可供人们在浏览器中游玩,也可供模型通过 MCP 游玩。尚不完善的是洗涤对盘子和餐具的评分方式。

由 Composo 构建和维护。docs/ 下的许多文档是工作记录,按撰写时的原样保存;docs/README.md 说明了如何阅读它们。

The game in a browser: a dinner plate in hand over the lower basket of the modelled machine, with the free seats numbered best first

在浏览器中加载第一关。一只手正拿着一个餐盘悬在下层碗篮上方,“Suggest spots” 已为空闲位置编号,最优的排在最前。右侧面板显示程序将发送的精确位姿。

目录

目前可用的功能

  • 机器。 一台 Bosch SMV4HAX40G 的数据和几何模型,来自其所有者的照片和卷尺测量(packages/machine):两个碗篮及其齿排、搁架和支架、喷淋臂以及 Eco 50 程序。
  • 装载。 物品和污垢目录、确定性刚体装载(Jolt),以及包含游戏动作和查询的会话层(place、remove、set_rack、list_slots、check_load 等)。
  • 洗涤。 两级模拟。官方 层级给出计分结果;快速 层级是较粗略的预览。最大关卡的冷官方洗涤在参考机器 MacBook Pro(Apple M3 Pro,18 GB)上耗时 4.9 分钟(三次取最佳),若同时运行其他任务则为 5 到 8.5 分钟,预算为 30 分钟。
  • 共七关的课程,按难度顺序编号(docs/benchmark/levels.md),每关都保存了三个脚本玩家(仔细、粗心、随机)的参考装载。六个在参考装载上通过了基准测试的门槛;教程关未通过(其粗心装载失分太少)。
  • 三种游玩方式。 网页(apps/web)、面向智能体的 MCP 服务器(packages/mcp),以及运行脚本玩家和模型并写入经验证回合记录的测试框架(packages/bench)。
  • 检查。 来自文献的 48 个装载现象作为可执行的洗涤对(docs/research/standards.md 第 9 节),以及一个校准工具,该工具根据真实洗涤记录对模拟进行评分,拟合参数并对候选测试洗涤进行排序(存储的排名来自较早的参数集,且未再次运行)。

通过 OpenAI 兼容端点,两个模型进行了对局:在官方层级上,三个级别共六局(目前的结果)。没有人进行过基线对局,Anthropic API 的路径尚未针对实时 API 运行。

分数可以信任用于什么

完整的说明,包括每个数字及其来源,见 docs/validation/README.md。简而言之,模拟已对照四件事进行了检查:

  • 在真实机器上进行的一次测试洗涤。 在 Eco 50 上放置四个蛋黄盘。在结果出来之前写下的预测正确判断了盘子的顺序和残留物的形式,但对两个烤箱干燥盘上残留量的预测乐观了十到三十倍。随后的校准调整了一个数字:泵运行的长浸泡时间占比,从 0.5 调整到 0.8(范围在 0.59 到 1 之间)。预测先于结果的记录在私人开发历史中,该历史未公开,因此无法从本仓库核实这一顺序。
  • 姊妹机型公布的类别均值(Bosch SMV6ECX51E,环保程序,参考洗涤剂):餐具在 0.1 个分数点以内,陶器低 0.2,玻璃低 0.1 到 0.5。这是拟合,不是预测:土壤和化学默认值被设定为使这些数字出现。
  • 48 个装载现象 有文献证据:17 个通过,21 个在大小或符号上失败,1 个是错误场景,9 个需要尚未构建的机制。
  • 其自身的簿记。 水被精确守恒,同一输入在同一机器上给出相同结果。快速层级与官方层级在标准 13 位装载的判定上一致率为 89%,在级别上一致率为 97%。

今天的分数显示玩家是否装载得当,以及是否将杯子、玻璃杯和锅口朝下放置。它尚未显示盘子和餐具是否堆叠得能洗净。

判定可以信任用于 判定不能信任用于
玻璃杯、马克杯或锅口朝上或侧放:结果不干净 盘子倒下或相互倚靠:结果干净,这很可能错误
洗涤剂盒堵塞,针对蛋白质污渍(鸡蛋、酸奶、肉末、牛奶) 喷臂被物品卡住:其上方的盘子保持原有判定
碗或勺子确实位于另一个中 餐具挤在一个格子里,且勺子如装载物理通常嵌套:干净
蛋黄和其他蛋白质污渍,在远离清洁阈值的物品上 接近阈值的物品;茶、咖啡和葡萄酒;玻璃上干燥的牛奶;脂肪,即使没有洗涤剂也能洗净

在仔细和粗心的参考装载之间约四分之三的差距是倒置的空心物品。这些物品中的污渍(冰沙、番茄汤、番茄酱、鳄梨酱)依赖于文献中的值,而这些值未经任何测试洗涤验证。

完全未建模:干燥、玻璃上的斑点和水膜、被水流移动的物品,以及污渍沉降在干净物品上。仅对 Eco 50 进行了校准和评分。

要求

DishwasherBench 只在一台机器上运行过:一台 MacBook Pro(Apple M3 Pro,18 GB),运行 macOS 27。本仓库中的每一个数字都是在那台机器上测得的。Linux 和 Windows 未经测试。目前没有任何已知情况能排除它们,欢迎提供在这些平台上的运行报告(docs/ROADMAP.md)。

  • Node 20.19 或更高版本,且属于 20 系列(.nvmrc 固定为 20.19.0)。更旧的 Node 会在安装时被拒绝。Node 22 尚未尝试过。
  • pnpm 9(package.json 指定为 9.4.0;corepack enable 会自动采用)。
  • 一个 Dawn 能打开的 GPU。清洗过程通过 Node 使用 WebGPU 在 GPU 上追踪水流(即 webgpu 包,版本 0.6.2,其中带有预编译的 Dawn 二进制文件)。在参考机器上,这就是 Metal。此版本在同一硬件的 macOS 14.7 上无法加载。
  • Google Chrome 或 Chromium,用于发送给智能体的图片以及驱动页面的脚本。测试框架会在常规安装位置查找它;将 SPOTLESS_CHROME 设置为该程序的路径即可选择其他浏览器。手动游玩只需要桌面浏览器,而脚本化玩家则完全不需要(--no-render)。
  • 克隆大约需要 680 MB(下载量约 290 MB;文件本身约 385 MB,主要是照片、截图和剧集记录),而 node_modules 大约需要 420 MB。
  • 对某一关卡进行官方清洗需要 1 到 2 GB 内存(在标准的 13 件装载量下曾观察到 2.4 GB),以及空闲端口 8787(游戏服务器)和 8788(MCP 服务器)。

在同一台机器上,结果可以逐位重复。在不同机器、操作系统构建版本以及 webgpu 包版本之间,结果可能在最后几位上有所不同,这就是为什么每个结果都会标明其计算所基于的技术栈(docs/research/spike-gpu-compute-macos27-recheck.md)。

快速开始

git clone https://github.com/composo-ai/DishwasherBench.git
cd DishwasherBench
corepack enable                       # once: makes pnpm 9.4.0 available
pnpm install --frozen-lockfile        # about 15 seconds the first time

这些包没有构建步骤:它们以 TypeScript 源码形式被使用,并通过 tsx 运行。只有页面需要构建,由下面的 play 命令完成。

展示结果的最短方式是从命令行清洗一个已保存的装载:

pnpm --filter @spotless/wash-runner wash-load tutorial-careful --tier fast       # under a minute
pnpm --filter @spotless/wash-runner wash-load tutorial-careful --tier official   # about 5 minutes the first time

它会打印得分,并为每件物品打印判定结果、分数以及其上残留物。已保存的装载位于 packages/loader/loads/(<level>-<player>.json)。对某个装载的首次清洗会计算出水的流向,并将其保存在 .spotless/exposure-cache 中,因此对同一装载的第二次清洗只需几秒钟(传入 --no-cache 可关闭此功能)。

要检查一切是否能在你的机器上运行:

pnpm typecheck      # the root and every package; a few seconds
pnpm test           # every package; 8 to 17 minutes on the reference machine

pnpm test 需要多长时间取决于机器上还在做什么。有一个测试被设计为跳过。这些测试会在 GPU 上运行真实的清洗。

当参数集过期时,清洗会拒绝运行。游戏用于清洗的参数集(anchored-v7.owner-capsule,位于 packages/calibration/anchors/ 中)记录了模拟源码的状态以及为其准备的机器数据的状态。一旦其中任何一项发生变化,清洗就会停止并列出差异之处。CONTRIBUTING.md 解释了该规则以及如何使参数集重新变为最新。

在浏览器中游玩

pnpm --filter @spotless/web play

这会构建页面并启动游戏服务器。打开 http://127.0.0.1:8787(添加 --port <n> 可指定其他端口)。页面会播放音乐:如果你不想听,可以静音该标签页,或使用 Sound 按钮。

如果端口被占用,服务器会以 serve: port 8787 is in use; give --port <n> 停止。服务器只应答它自己提供的页面:携带其他站点 Origin 的请求会得到 403,除非服务器启动时带有 --allow-origin <scheme://host[:port]>(可重复),而 Host 头指定的主机名不是服务器监听的地址(默认是 127.0.0.1、localhost 和 [::1])的请求也会得到 403(--allow-host <name> 会添加一个名称)。没有 Origin 头的请求(测试框架、MCP 服务器、curl)不受影响,而 Vite 开发服务器下的客户端不需要任何标志。

当你启动洗涤时,会提供两种类型:

  • 快速预览:快速层级。大约一分钟;更粗略,且少数判定可能与完整洗涤不同。它不是计分结果。
  • 完整洗涤:官方层级。几分钟;这是计分结果。预览之后,报告会在同一负载上提供完整洗涤。

游戏在 Eco 50 上使用一颗洗涤剂胶囊(Finish Powerball Ultimate,12.9 克)进行计分。层级从 1 到 7 列出,并附有难度数值,该数值根据台面上的物品计算得出,并非实测分数。

通过指向来放置适用于空行中的盘子、碗和餐具。有两件事目前还不能通过指向完成:指向已放置盘子旁边空隙的盘子常常会搁在相邻盘子上,而杯子和玻璃杯无法斜靠在上层篮筐的侧支架上。对于这两种情况,请拿起该件物品并按“Suggest spots”(消耗一次查询),然后点击一个编号标记。

The report after a quick preview of a careless load, with a verdict and what is left for each item

在对第一层的一次粗心装载进行快速预览后:一个口朝上放置的碗盛有 432 毫升水且未洗净,报告称一把叉子卡住了下喷淋臂。横幅说明了预览是什么:不是计分结果。所有这些都是模拟对故意糟糕装载的输出,并非对真实机器或洗涤剂的测试。

One item looked at closely after the wash: a mug with the residue painted where it was left

洗涤后仔细观察一件物品:残留物被绘制在它留下的位置,并附有其面积和该物品盛住的水量。

运行脚本化玩家

脚本化玩家不需要模型,也不产生费用。这会以官方层级用谨慎的参考玩家玩第一层,然后通过重放其动作并第二次洗涤该负载来验证记录(各约五分钟):

pnpm --filter @spotless/bench bench run --levels tutorial --policies careful \
  --no-render --out "$PWD/.spotless/bench/scripted"
pnpm --filter @spotless/bench bench verify \
  "$PWD"/.spotless/bench/scripted/tutorial__careful__*/record.json --rewash
  • 将 --out 作为绝对路径给出;相对路径会在 packages/bench 内解析。
  • 脚本化玩家有 empty、random、careless 和 careful。添加 --tier fast 可在约一分钟内进行预览;快速洗涤在记录和结果表中被标记为预览,且永远不是分数。
  • 每次运行都会在 --out 下写入:record.json、结果表(results.md、results.json)、它启动的游戏服务器的数据(server-data/),以及在没有 --no-render 时工具返回的图片。

The careful reference load of the largest level in four views

脚本化谨慎玩家对最大层级的装载(台面上 62 件,装载 49 件),从上方以及从前侧和侧面拍摄。两个已玩过的模型都击败了它。

运行模型

关于测试框架、每种玩家看到什么以及记录了什么的所有内容都在 docs/benchmark/README.md 中。

模型运行会产生费用。将 .env.example 复制为 .env(git 会忽略它),并填写你的端点的地址和密钥。该命令会打印它设置的变量名称,从不打印值,密钥和地址都不会写入记录。

OpenAI 兼容端点(OpenAI、Azure 或任何具有 Responses 或 chat completions API 的服务器)背后的模型:

pnpm --filter @spotless/bench bench run --levels tutorial --policies openai:gpt-6.1-sol \
  --max-input-tokens 2000000 --out "$PWD/.spotless/bench/sol-tutorial"
  • 策略指定模型,或者在 Azure 上指定部署:openai:<model or deployment>。
  • 未设置地址时,不会发出任何请求:该回合立即结束且没有结果,其记录显示为 no address of the API (set SPOTLESS_OPENAI_BASE_URL, or give --base-url)。随后命令以状态码 1 退出,pnpm 报告脚本失败。
  • --max-input-tokens 会在其请求累计超过之前结束一个回合。用两个模型测得:第一级需要 0.4 到 65 万输入 token,37 件的级别需要 250 万到 280 万,最大的级别(62 件)需要 300 万到 320 万,其中 95% 或更多是从提供商的缓存中读取的。使用 2,000,000、12,000,000 和 20,000,000 作为限制。
  • 测试框架会记录 token。只有在 .env 中给出价格时,它才会记录成本。
  • 没有 --tier fast 时,结算按官方档位进行,该档位即为得分。
  • 每次运行都会在 --out 下写入记录、转录、图片和结果表,并通过重放其操作日志来验证该回合。

通过 Anthropic API 使用的模型,密钥放在 ANTHROPIC_API_KEY 中(将模型的 id 放在 <model id> 的位置):

pnpm --filter @spotless/bench bench run --levels tutorial --policies anthropic:<model id> \
  --max-input-tokens 2000000 --out "$PWD/.spotless/bench/anthropic-tutorial"

此路径尚未针对实时 API 运行过。 它只有针对本地替身的单元测试,背后别无其他。欢迎提供首次运行的报告。没有密钥时,该回合会立即失败(Could not resolve authentication method)。如果你有存储的登录配置文件,SDK 也会接受它,因此 .env 中没有密钥并不能保证不会产生任何费用。

连接 MCP 客户端

任何支持 MCP 的智能体都可以参与。一个 MCP 服务器绑定到一个回合,因此游戏服务器必须以基准模式运行,并且该回合必须首先存在。

# 1. The game server (the token: 8 characters or more, of your choosing)
pnpm --filter @spotless/server exec tsx src/cli.ts serve --admin-token <token> --wash-tier fast \
  --data "$PWD/.spotless"

# 2. An episode; prints an address for the page, and the episode's id
pnpm --filter @spotless/server exec tsx src/cli.ts link --admin-token <token> \
  --level tutorial --player my-agent --agent

# 3. For a client that speaks streamable HTTP: serves http://127.0.0.1:8788/mcp
pnpm --filter @spotless/mcp exec tsx src/cli.ts --server http://127.0.0.1:8787 \
  --session <episode id> --http --port 8788

--data 将服务器的文件(其中包括回合记录,.spotless/episodes/)保存在页面使用的目录中;没有它时,serve 会写入 packages/server/.spotless。link 打印的地址会在页面中显示该回合,并且只有在页面构建完成后才有效(pnpm --filter @spotless/web build,play 也会这样做);MCP 调用在两种情况下都有效。如果游戏服务器在另一个端口上(serve --port <n>),请用 --server http://127.0.0.1:<n> 将 link 的地址给它。对于通过 stdio 自行启动 MCP 服务器的桌面客户端,配置位于 docs/benchmark/README.md 第 3 节。

通过 HTTP 时,MCP 服务器面向本机上的 MCP 客户端:对于任何携带 Origin 头的请求,以及 Host 头未指明它所监听的地址(默认情况下为 127.0.0.1、localhost 或 [::1])的请求,它都会返回 403。对于以其他名称访问它的客户端,例如来自容器,请用 --allow-host <name> 启动它;游戏服务器接受相同的标志。

智能体获得十三个工具(place、remove、reset、set_rack、start_cycle、get_level、get_item、get_state、render、preview、list_slots、check_load、get_report)。要手动尝试一次调用:

pnpm --filter @spotless/mcp exec tsx scripts/call.ts --url http://127.0.0.1:8788/mcp get_state '{}'

两个服务器都监听 127.0.0.1,并且仅供在你自己的机器上使用(SECURITY.md)。

目前的结果

两个模型通过一个 OpenAI 兼容端点,在官方档位上游玩了课程的三个级别。每个单元格一个回合只是轶事,不是基准测试结果,这里没有任何内容对这两个模型进行排名。

得分,以及该级别得分的占比。中间几列是脚本化的参考玩家。

# 级别 可得分值 随机 粗心 细心 gpt-6.1-sol gpt-6-astra
1 教程(12 件) 64 20 (31.3 %) 58 (90.6 %) 64 (100 %) 64 (100 %) 未运行
4 早餐(37) 220 36 (16.4 %) 112 (50.9 %) 174 (79.1 %) 190(86.4%);第二个回合 188(85.5%) 175 (79.5 %)
7 晚宴(62) 367 88 (24.0 %) 100 (27.2 %) 250 (68.1 %) 260 (70.8 %) 274 (74.7 %)

gpt-6.1-sol 和 gpt-6-astra 是所用 Azure 端点上两个部署的名称。记录中保存了该名称以及 API 报告的推理强度(两者均为 medium;测试框架未发送任何值);没有记录模型版本或快照日期。

三个脚本化列是当前洗涤代码上的已保存参考装载量 (docs/benchmark/course-table.md)。与模型回合一起存储的参考记录是在较早的代码上洗涤的,对于随机和粗心,在早餐上分别读取为 43 和 117,对于随机,在晚宴上为 99。

六个回合的价值:

  • 仔细的参考装载量不是上限。两个模型在两个完整关卡上都超过了它,通过放置脚本玩家从未尝试过的平底锅、一个大浅盘和木板。这里没有任何归一化。
  • 两个模型都没有犯关卡所围绕的错误。在六个回合中,没有任何空心件被口朝上立起或侧放,模型装载的物品出来时 84% 到 100% 干净。因此洗涤在它们之间几乎没起决定作用:它们的分数差异在于它们装进去了什么。
  • 未展示:人物、任何 Anthropic 模型、关卡 2、3、5 和 6、金钱,或模型自身游玩结果的分布(唯一一次重复在 190 之后以不同的装载量达到 188)。

六个回合的记录、转录和图片,以及更完整的说明,都在 docs/benchmark/first-runs/course/ 中。六个模型回合中的每一个都通过重放和第二次洗涤验证,得到相同的判定和分数。洗涤代码自它们被游玩以来已更改过一次,因此第二次洗涤报告不同的结果哈希并说明原因。

工作原理

装载。每个物品和机器的每个部分都是由参数化描述生成的精确形状的刚性复合体;图片、碰撞形状和洗涤所看到的表面都来自那同一个描述。物品以刚体物理(Jolt)在固定步长下放置,玩家的输入四舍五入到 1 毫米和 1 度,因此人和模型在同一个网格上行动,相同的装载量总是以相同方式稳定下来。每个动作都记录有其后场景的哈希,重放日志必须重现每个哈希。 参见 docs/design/platform.md。

洗涤。喷嘴在 GPU 上从机器上测量的喷嘴位置和臂的转动出发,追踪到装载物的精确形状上。飞溅和水滴以液滴形式移动;落下的水作为薄膜沿表面流下,在表面能留住它的地方积聚,在留不住的地方排走。然后每种污垢的污垢模型根据时间、温度和洗涤水的化学性质(洗涤剂、酶、漂白剂)在整个程序过程中去除污垢。水去往何处与污垢和化学性质分开缓存,因此使用其他污垢参数的洗涤可在几秒到约一分钟内重放。官方层级以 2 毫米的块工作,快速层级以 4 毫米工作。关于已构建和省略的内容,参见 docs/design/scope.md,关于所设计的物理,参见 docs/design/sim-core.md。

评分。洗涤后,检查员查看每个物品。当物品至多带有 4 个斑点和 4 平方毫米的可见污垢时,该物品即为干净,计入脏水在物品上停留处留下的污垢。每个物品价值关卡卡上标明的若干分数;干净的物品获得这些分数,不干净或留在台面上的物品不得分。一个回合是一次装载和一次洗涤。报告还给出每个物品的 0 到 5 分分级评分以及何处留下了什么,这些不改变分数。参见 docs/benchmark/README.md 和 docs/benchmark/levels.md。

校准。洗涤的每个物理常量都在参数注册表中,带有默认值、范围和来源。洗涤记录描述一次真实的测试洗涤:机器和程序、每件物品及其污渍和摆放位置,以及之后观察到的结果。校准工具对一条记录运行模拟,将其与观察结果对比评分,拟合所选参数,并说明数据能识别和不能识别哪些参数。目前存在这样一次洗涤。参见 docs/calibration/wash-record.md、docs/calibration/fitting.md,以及关于游戏洗涤所用参数集的 docs/calibration/anchoring-v7.md。

自己检查模拟

现象套件(48 个现象,82 次洗涤;在快速层级下,无缓存时约 15 分钟,全部缓存时两分半)。在 POSIX shell 中从仓库根目录运行这些命令:

INIT_CWD=. pnpm exec tsx packages/sim-verify/src/phenomena/cli.ts --list
INIT_CWD=. pnpm exec tsx packages/sim-verify/src/phenomena/cli.ts P01 P36 --tier fast \
  --out .spotless/phenomena
INIT_CWD=. pnpm exec tsx packages/sim-verify/src/phenomena/cli.ts P36 --tier fast \
  --params packages/calibration/anchors/anchored-v7.owner-capsule.json --dose-g 12.9 \
  --out .spotless/phenomena

不带 id 时它会运行全部 48 个。不带 --params 时它使用注册表默认值和参考洗涤剂进行洗涤;第三种形式则像游戏那样洗涤,使用校准参数集和胶囊。默认情况下报告输出到 packages/sim-verify/phenomena/reports/,其中保存着项目已存储的报告;上面的命令将它们发送到被 git 忽略的 .spotless/phenomena,这样一次试验就不会覆盖已存储的报告。

校准工具,针对那一次测试洗涤:

pnpm --filter @spotless/calibration spotless-fit validate \
  packages/calibration/records/owner/owner-wash-01-egg-yolk-eco50.measured.json
pnpm --filter @spotless/calibration spotless-fit predict \
  packages/calibration/records/owner/owner-wash-01-egg-yolk-eco50.measured.json \
  --params packages/calibration/anchors/anchored-v7.owner-capsule.json

validate 检查一条洗涤记录;predict 说明模拟对其中每个观察结果给出的值(首次五到七分钟,一旦负载的水被缓存后会更短)。给出 --params:不带它时 predict 使用注册表默认值并会说明这一点;它们不是游戏的参数集,会把四个盘子都读作脏的。带上该参数集时,predict 会警告其旁边没有 calibration.json;这是预期之中的。

已保存的负载与当前的装载物理对比:

pnpm --filter @spotless/loader check-loads tutorial-careful
pnpm --filter @spotless/loader check-loads --jobs 3      # all 25 of them: about 50 minutes

局限与路线图

这些开放问题,每个都写成贡献者可以接手的形式,被跟踪为 issues;docs/ROADMAP.md 是它们的地图。最大的几个:

  • 堆叠对盘子和餐具没有影响。盘子倒下、餐具拥挤和臂杆卡住几乎没有或完全没有代价。
  • 距离另一个物体一两毫米以内的面出来得太干净。针对这种间隙的机制已经构建,但不在本仓库中,因为它破坏了餐具对照,而且其决定性参数没有测量依据。
  • 没有洗涤剂时油脂也能洗净,淀粉则总能洗净。
  • 一台机器、一个程序、一次测试洗涤。各等级所依据的污渍从未在真实洗涤中测试过。
  • 没有人类基线,没有重复实验,也没有通过 Anthropic 的 API 运行过。
  • 一个平台。Linux 和 Windows 未经测试。

各部分的位置

路径 内容
docs/README.md 文档索引,带有阅读顺序和每个文档的标签:当前、构建记录或已取代
docs/design/scope.md 项目目标、最先构建的内容、省略的内容、状态
docs/validation/README.md 模拟对照了什么进行检查,以及一个结论可以信任到什么程度
docs/benchmark/ 运行基准测试、各等级的进程、使用模型的首次运行
docs/calibration/ 将校准模拟的测试洗涤、洗涤记录格式、拟合工具、目前唯一的一次测试洗涤
docs/research/ 有来源的档案:机器、喷流、薄膜、污渍、化学、标准、基准测试的设计
docs/reference/ 机器的照片和测量数据、机器图纸、测试洗涤的照片
packages/machine、catalogue、geometry、physics 机器、物品与污渍、形状、装载物理
packages/session、levels、loader 游戏的动作与查询、关卡、脚本化玩家及其保存的装载
packages/sim-*、inspector 洗涤:场景、水力学、喷嘴、喷雾、水膜、洗涤液、污渍、时间线、结果的检查
packages/wash-runner 游戏运行时的洗涤:默认参数、报告
packages/calibration 洗涤记录、拟合工具、参数集(anchors/)
packages/sim-verify 现象套件与演示洗涤
packages/server、mcp、bench、render 游戏服务器、智能体接口、基准测试框架、图片
apps/web 页面
scripts/ 守护发布内容的卫生检查及其测试
spikes/ 两次早期试验的探索性代码(GPU 计算、刚体引擎);不属于游戏的一部分

贡献

欢迎提交错误报告、看起来物理上不正确的结果、真实机器的测试洗涤、新关卡、带有其回合记录和报告的模型结果以及来自其他平台的报告。CONTRIBUTING.md 说明了如何设置、在提交拉取请求前应运行哪些检查,以及一条令人意外的规则:模拟的源代码带有指纹,对其的更改会产生后果。请阅读行为准则。

问题请提交至问题表单中的问题表单。任何私密内容请发送至 support@composo.ai;如需报告安全问题,或照片或记录中不应公开的内容,请参阅 SECURITY.md。该项目以较小规模维护,不提供支持承诺。每个版本包含的内容见 CHANGELOG.md。

许可证、声明与免责声明

DishwasherBench 在 MIT 许可证下发布,版权归 Composo Limited 所有。来自他人的材料以及项目所依赖的主要软件列于 THIRD_PARTY_NOTICES.md:游戏中的音乐属于公有领域(CC0),研究笔记引用的短段落仍归其作者所有。机器的照片经其所有者许可,以相同的 MIT 许可证发布,并按照 docs/reference/REDACTIONS.md 所述为发布做了准备。

DishwasherBench 是 Composo Limited 的独立项目,与 BSH Hausgeräte GmbH 或 Robert Bosch GmbH(Bosch)、Reckitt(Finish)或其中提及的任何其他制造商无关联,未受其赞助或认可。所有产品名称和商标均归其各自所有者所有,仅用于标识所测量的对象。该模拟是对一台私人拥有的机器的简化模型,基于其所有者的照片、测量数据和测试洗涤以及公开文件构建,其许多参数为估计值。游戏、基准测试结果或文档中的任何内容均不构成对任何真实产品的性能、质量或安全性的陈述,游戏中显示的装载建议是项目对制造商手册的自行总结,而非制造商的说明。

如何引用

CITATION.cff 以 GitHub 和参考文献管理器可读取的形式提供了详细信息。在 BibTeX 中:

@software{dishwasherbench,
  author = {{Composo}},
  title  = {DishwasherBench},
  version = {0.1.0},
  year   = {2026},
  url    = {https://github.com/composo-ai/DishwasherBench}
}

来源:Hacker News · github.com