mcpField
N
Nonobench

Nonobench

远程服务
nonobench.comAI 与智能体102 天前更新

关于 Nonobench

Nonobench 是用于评估 LLM 在不同尺寸数织谜题上表现的开源基准套件。它包含基准运行器、结果数据库、导出工具和交互式结果仪表板。

主要功能

  1. 01在数织谜题上评测模型
  2. 02覆盖多种网格尺寸
  3. 03将增量结果存入 SQLite
  4. 04导出基准数据用于可视化
  5. 05通过交互式仪表板查看结果
  6. 06测试本地托管的 OpenAI 兼容模型

适用场景

  1. 01比较 LLM 在不同尺寸谜题上的推理表现
  2. 02评测本地运行的模型
  3. 03查看并可视化已记录的运行结果
  4. 04在完整评测前进行小规模试跑

MCP 相关

托管网站通过 `/mcp` 提供无需认证的 MCP 服务,并提供 REST API。其工具让 Agent 能访问基准数据及相关操作。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://www.nonobench.com/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

工具

11
参数类型必填说明
sizeenum否要筛选的网格大小5x5 | 10x10 | 15x15 | 20x20
effortstring否best、all(默认)或一个 effort 级别;留空表示全部
familystring否逗号分隔的 family ID;留空表示不筛选
versionstring否逗号分隔的基准测试版本:1.0、1.1、1.2;留空表示全部
providerstring否逗号分隔的 provider ID;留空表示不筛选
reasoningboolean否仅显示推理(true)或非推理(false)变体
min_correctinteger否所选级别中已解出的最少谜题数;默认值 0 会包含尚未解出谜题的变体
open_weightsboolean否仅显示开放权重(true)或闭源(false)模型

详细介绍

Nonobench

用于评估大模型在不同网格大小下解决 Nonogram(Picross)谜题时推理能力的基准测试套件。结果发布于 nonobench.com。

由 Maurice Kleine 构建。

什么是 Nonogram?

Nonogram(也称为 Picross、Griddlers 或数字填色)是一种逻辑谜题,玩家需要根据每行和每列的数字提示填充网格中的单元格。提示表示连续填充单元格的分组,组与组之间至少隔着一个空单元格。解决这类谜题需要逻辑推理和约束满足能力,因此它们是测试大模型推理能力的绝佳方式。

项目结构

nonobench/
├── bench/          # Benchmark runner, results database and exporter
└── visualizer/     # TanStack Start dashboard on Cloudflare Workers (nonobench.com), also home of the puzzle set

前置条件

快速开始

1. 克隆代码仓库
git clone https://github.com/mauricekleine/nonobench.git
cd nonobench
2. 设置环境变量

在 bench/ 目录中创建 .env 文件(参见 bench/.env.example):

OPENROUTER_API_KEY=your_openrouter_api_key_here

这是唯一需要设置的变量。可视化工具无需任何变量即可构建。

3. 运行基准测试
cd bench
bun install
bun run bench                       # prints the plan and exits, no API calls
bun run bench --model <name>        # run one model (repeat --model for more)
bun run bench --all-missing         # run every configured model with missing work
bun run bench --model <name> --sizes 20x20  # opt in to the extended tier

运行采用增量追加方式:已成功获得结果的模型/谜题组合不会再次运行,数据库也会拒绝覆盖已有结果。失败的运行会在下次调用时重试。结果存储在 bench/results.db(SQLite)中。

实用参数:

  • --max-cost <usd>:当本次运行的花费达到指定金额后,停止启动新谜题。已在进行中的请求仍会完成,因此本次运行的花费可能超出上限,最多相当于每个所选模型额外执行 --parallel 个请求。请将 OpenRouter 密钥自身的限额作为硬性上限。
  • --parallel <n>:设置每个模型的并发请求数(默认 10);如果提供商有速率限制,可调低此值。
  • --limit <n>:每种尺寸仅运行前 n 个谜题,可用于使用临时数据库进行试运行(NONOBENCH_DB=/tmp/copy.db)。
输出模式

新运行会要求模型以严格的结构化输出格式(JSON schema;仅路由到强制执行该格式的端点)提供答案,避免模型用文字包裹网格。对于少数模型,强制执行 schema 的端点会显著影响答案质量;这些模型会改用文本模式(在 bench/constants.ts 中设置 outputMode: "text",由基于基准测试提示词的 5x5 A/B 测试选定)。每次运行都会记录所用模式,两种模式的评分标准相同:答案必须满足每条提示。运行器还会停止那些使用结构化输出却无法解出任何 5x5 谜题的模型,以及早期运行中大多报告零推理 token 的模型,因为这两种情况都表明问题可能出在测试框架,而非模型。

基准测试完成后,导出结果供可视化工具使用:

bun run export

这会生成 visualizer/app/results.json(汇总结果)和 visualizer/public/results-raw.json(包含提示词和输出在内的每次运行记录)。

其他脚本:

  • bun test - 检查解析器、评分器、数据库策略和谜题
  • bun run typecheck - TypeScript 类型检查
  • bun run regrade - 只读比较已存储的评分与当前评分器的结果
使用本地模型运行

运行器可以对自行部署的模型进行基准测试。任何提供 OpenAI 兼容 /v1 端点的服务都可以使用:vLLM、SGLang、llama.cpp、LM Studio 和 Ollama。

此设置需要两台机器。模型服务所在的工作站负责提供模型。基准测试机器是运行基准测试的笔记本电脑。

1. 在工作站上提供模型服务

将服务绑定到所有网络接口。默认绑定地址 127.0.0.1 只接受来自模型服务所在机器自身的连接。

vLLM:

vllm serve Qwen/Qwen3-32B --host 0.0.0.0 --port 8000

Ollama:

ollama pull qwen3:32b
OLLAMA_HOST=0.0.0.0:11434 ollama serve

llama.cpp:

llama-server -m ./qwen3-32b-Q4_K_M.gguf --host 0.0.0.0 --port 8080

SGLang:

python -m sglang.launch_server --model-path Qwen/Qwen3-32B --host 0.0.0.0 --port 30000

LM Studio:打开 Developer 选项卡,然后选择 Start Server。打开 Network Server 开关,使服务监听所有网络接口。

注意:请勿将端口暴露到互联网。大多数本地服务都没有身份验证,因此任何能够访问该端口的人都可以运行模型。

2. 在模型服务上开放端口

将规则限制为您自己的子网。允许来自本地网络的 TCP 流量访问该端口:

sudo ufw allow from 192.168.1.0/24 to any port 8000 proto tcp

在 macOS 上,请在“系统设置”中允许服务器应用接受传入连接。

3. 从笔记本电脑验证连接

找到模型服务的局域网地址。在 Linux 上运行 ip -4 addr show。在 macOS 上运行 ipconfig getifaddr en0。

在笔记本电脑上请求模型列表:

curl http://192.168.1.20:8000/v1/models

确保返回结果中列出了您的模型。复制确切的 id 值。您需要将该值用于 NONOBENCH_LOCAL_MODEL。

如果请求失败,请检查步骤 1 中的绑定地址。然后检查防火墙规则、地址和端口。

如果无法通过网络访问模型服务,请改为创建到该服务的 SSH 隧道。然后使用地址 http://127.0.0.1:8000/v1:

ssh -N -L 8000:127.0.0.1:8000 [email protected]
4. 运行基准测试
cd bench
bun install
NONOBENCH_LOCAL_BASE_URL=http://192.168.1.20:8000/v1 \
NONOBENCH_LOCAL_MODEL=Qwen3-32B \
bun run bench:local --model Qwen3-32B

先运行试测。下一个命令会将两个 5x5 谜题写入临时数据库:

NONOBENCH_LOCAL_BASE_URL=http://192.168.1.20:8000/v1 \
NONOBENCH_LOCAL_MODEL=Qwen3-32B \
NONOBENCH_DB=local-pilot.db \
bun run bench --model Qwen3-32B --sizes 5x5 --limit 2

确保计划中将您的模型列为 [local, text]。

本地模型的环境变量
变量含义
NONOBENCH_LOCAL_BASE_URL服务的 /v1 端点。Ollama 使用端口 11434。
NONOBENCH_LOCAL_MODEL服务通过 GET /v1/models 返回的模型 id。
NONOBENCH_LOCAL_NAME显示名称,也是 --model 的取值。默认为模型 id。不得与云模型名称相同。
NONOBENCH_LOCAL_EFFORT服务配置的推理力度(none、low、xhigh 等)。仅用于标记——运行器不会向本地服务发送推理设置。默认为 none。
NONOBENCH_LOCAL_API_KEY服务要求令牌时使用的 bearer 令牌。默认为 local。

只有同时设置 NONOBENCH_LOCAL_BASE_URL 和 NONOBENCH_LOCAL_MODEL 时,运行器才会将本地模型添加到计划中。

本地运行说明
  • 本地运行费用为 0 美元。请勿将其纳入已发布的数据集:使用 bun run bench:local 运行,它等同于设置 NONOBENCH_DB=local-results.db 后运行 bun run bench。bench/results.db 是共享数据集,导出契约测试会将其与已提交的导出文件进行比对。运行器会拒绝将本地模型写入共享数据库。
  • 启动前,运行器会将模型 id 与服务端 GET /v1/models 返回的列表进行核对。拼写错误时会显示服务端实际提供的模型;如果无法连接服务端,则不会记录任何运行结果。
  • 本地模型默认使用文本模式。许多本地服务端会接受 JSON schema 请求,但随后忽略它。如果你的服务端会强制执行 schema,请设置 NONOBENCH_OUTPUT_MODE=json_schema。
  • 请从 --parallel 1 开始。本地 GPU 同时处理的请求量低于云服务提供商。
  • 20x20 档位需要 128,000 个输出 token。如果你的服务端上下文长度较小,请只运行核心尺寸。
  • 运行器不会对本地模型应用推理 token 断路器。有些本地服务端每次运行都会报告 0 个推理 token。
  • 将相同的变量设置在 bench/.env 中,即可避免每条命令都加上前缀。
  • 基准测试运行会在 bench/local-models.json 中注册本地模型(名称、服务端模型 ID、系列、服务端 URL),这样后续运行 bun run export 时,可视化工具无需任何环境变量就能识别该模型。要注册已完成基准测试的模型,请在其中添加一条记录:"<name>": { "baseURL": "http://host:port/v1", "modelId": "<server model id>", "family": "<name>" }。如果名称就是服务端的 ID,则省略 modelId。
4. 查看结果
cd visualizer
bun install
bun run dev

然后打开 http://localhost:3000 查看交互式仪表板。

你自己的运行结果位于单独的数据库中。使用以下命令提供这些结果:

cd visualizer
bun run dev:local

dev:local 会将 bench/local-results.db 导出到仪表板的数据文件中,启动开发服务器,并在你停止服务器时恢复已提交的文件。运行期间,仪表板只显示该数据库中的模型,即你的本地运行结果,而非已发布的排行榜。设置 NONOBENCH_LOCAL_DB 可提供其他数据库。

该服务器运行期间,在 bench 目录中运行 bun test 会有一个测试失败:导出契约测试会将仪表板的数据文件与 bench/results.db 进行比对,而 dev:local 已将你的运行结果写入这些文件。停止服务器,等待脚本恢复已提交的文件,测试套件便会再次通过。

5. 部署

可视化工具是一个 Cloudflare Worker(visualizer/wrangler.jsonc)。页面会在构建时预渲染,并作为静态资源提供;Worker 提供 API、MCP 服务和 Agent 路由,并通过其资源绑定读取导出的 JSON。Workers Builds 负责在合并到 main 时部署生产环境:它会在 visualizer/ 目录中使用 Cloudflare 凭据运行 bun install --frozen-lockfile && bun run build,然后运行 bunx wrangler deploy。本地部署脚本和 Wrangler 登录流程已弃用;Agent 使用 cf 访问 Cloudflare。在 visualizer/ 目录中:

  • CLOUDFLARE_ENV=beta bun run build 会构建用于本地预览的 beta Worker。现有的 beta.nonobench.com Worker 没有 Workers Builds 触发器;此命令不会部署它。
  • bun run deploy:verify <sha> 会等待生产环境运行包含该提交的 main 分支构建。除非 DEPLOY_VERIFY_URL 指向单独部署的目标,否则分支提交会立即失败。仓库根目录也使用相同脚本,因此在任一目录中都可运行 bun run deploy:verify <sha>。

Agent 访问

nonobench.com 无需身份验证即可向 Agent 提供基准测试数据:

  • REST API 位于 /api/v1 下(排行榜、模型、谜题、答案检查器、单次运行数据)。规范位于 /api/openapi.json,/.well-known/api-catalog(RFC 9727)指向该规范。

  • MCP 服务 位于 /mcp(无状态 Streamable HTTP,支持 MCP 2026-07-28,并兼容 2025 客户端),说明见 /.well-known/mcp/server-card.json。使用 claude mcp add --transport http nonobench https://www.nonobench.com/mcp 将其添加到客户端。浏览器请求可使用网站的来源,或 HTTP localhost/127.0.0.1 来源。 它已列入 Claude Connectors Directory、MCP Registry(io.github.mauricekleine/nonobench)、Smithery、Glama 和 mcpservers.org。

    Nonobench MCP connector Listed on mcpservers.org

  • 通过 navigator.modelContext 在浏览器中注册的 WebMCP 工具。

  • Markdown:请求时附带 Accept: text/markdown,/ 和 /puzzles 会返回 Markdown。/llms.txt 提供概览。

  • 发现:robots.txt(含 Content Signals)、sitemap.xml、首页上的 Link 标头、位于 /.well-known/agent-skills/index.json 的 Agent skill,以及位于 /.well-known/ai-catalog.json 的 ARD 清单。

以上所有内容都从与仪表板相同的导出文件读取(visualizer/app/results.json 和 visualizer/public/results-raw.json),因此运行 bun run export 也会一并更新。

评分

每个模型都会收到相同的系统提示词和谜题的行、列线索。标准模式的答案是由 1 和 0 组成的单个字符串网格。困难模式的答案按行换行,因为在 400 个格子的情况下,大多数模型都会把单个字符串数错(参见 LEARNINGS.md)。答案满足所有行、列线索时即为正确。

30 道谜题中有 10 道(一道 5x5、四道 10x10、五道 15x15)存在多个有效解,因此答案会根据线索检查,而不是与已存储的解进行比较。正确性在导出时根据已存储的原始输出得出;数据库不会被重写。谜题测试套件会固定标记哪些谜题有多个解,任何新谜题都必须只有唯一解。

谜题数据

核心级别包含 30 道谜题(5x5、10x10 和 15x15 各 10 道),定义在 visualizer/components/puzzles/ 中,并由运行器和仪表板共享。这些谜题来自 nono-dataset。困难模式包含 10 道生成的 20x20 谜题。谜题的 ID 是其解的哈希值,因此更改谜题的解会创建一道新谜题。

分级与生成

默认基准测试运行涵盖三种核心尺寸(Standard)。使用 --sizes 20x20 并选择模型即可运行困难模式;也支持以逗号分隔多个尺寸。运行器的计划会单独报告缺失的 20x20 任务。总体准确率和最佳变体选择仅使用 Standard 运行结果;困难模式有其独立结果。困难模式请求的答案预算为 128,000 个 token,上限为端点的最大值(bench/max-output-tokens.json)。

在 bench/ 目录下,bun run generate-puzzles 会使用固定种子重新生成 20x20 谜题集。它会随机填充网格(不包含图片,因此模型无法根据图像猜答案),保留每行至少有三个填充格且镜像对称性较弱的网格,并使用精确求解器(NONOGRAM_SOLVER)检查唯一性。该谜题集包含五道可通过行列传播求解的谜题,以及五道传播过程会停滞、剩余 20–200 个格子的谜题。bun test 会验证这些谜题的线索、唯一性标记和行求解能力;原有的歧义列表保持固定。

配置

编辑 bench/constants.ts 以配置:

  • MODELS - 模型配置数组(OpenRouter 模型 ID、显示名称、推理设置)
  • MAX_PARALLEL_RUNS_PER_MODEL - 每个模型并发运行的谜题数(默认值:10)
  • REQUEST_TIMEOUT_MS - 每个请求的超时时间;超时请求会记录为失败运行(默认值:30 分钟)

NONOBENCH_DB、NONOBENCH_RESULTS_JSON 和 NONOBENCH_RESULTS_RAW_JSON 可覆盖数据库和导出路径,便于使用副本进行测试。

技术栈

基准测试运行器

  • Bun - JavaScript 运行时和 SQLite
  • AI SDK - 统一的大模型接口
  • OpenRouter - 大模型 API 网关
  • TypeScript

可视化工具

贡献

欢迎贡献!你可以:

  • 添加对新大模型的支持
  • 改进基准测试方法
  • 增强可视化仪表板

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。