Skip to content
189-sketchPublic

About

Fun Bench: blind AI model evaluations using your own real-world tasks, with OpenAI and Anthropic compatible APIs.

Resources

Stars

5 stars

Watchers

0 watching

Forks

Repository files navigation

Fun Bench

用自己的真实任务,匿名比较自己选定的 AI 模型。 用户在熟悉自己的 Agent 中生成测试题,导入 Fun Bench,指定模型并行作答,体验匿名成果,提交评分后揭晓身份。 也可以在给某一道题打完分后,单独揭晓那一题背后的模型,不必等到整场评测结束。

运行

需要 Node.js 24 或更高版本。 项目使用 Node 内置 SQLite,不需要另外安装数据库。

npm install
npm run dev

打开 http://127.0.0.1:5173。 前端端口为 5173,API 端口为 3001。 点击“先玩一场演示”,可以在没有 API Key 时体验完整盲评流程。 演示中的三个选手和作品由项目手工制作,已明确标注,不代表真实模型能力。

使用流程

  1. 在“怎么玩”中复制出题提示词,交给自己的 Agent。
  2. 与 Agent 确认真实任务、必要材料、输出要求和评分标准。
  3. 在“模型设置”添加至少两个模型,填写显示名称、协议、Base URL、API Key、Model ID 和输出 Tokens 上限。
  4. 新建评测,粘贴或导入题目,核对解析结果,然后选择参与模型。
  5. 开始逐题测试:先看第 1 题的匿名成果,用档位给出整体评价,点“继续测试下一个”再测试下一题。
  6. 想提前知道某道题背后是谁,可以在给该题打完分后点“立即揭晓第 N 题”,单独揭晓这一道题。
  7. 所有题目完成后,提交并锁定评分,揭晓模型身份。
  8. 分享评审链接,邀请其他人独立盲评。

每场支持 1 到 10 道题目、2 到 6 个模型。 模型配置页提供“测试”按钮:模型卡片上的按钮测试已保存的配置,编辑弹窗中的“测试连接”测试当前填写的地址、模型和 Key。 两者都会发送一次真实请求,并显示耗时、模型回复或错误原因,方便在保存前确认配置是否正确。 题目按顺序测试:同一题目的模型并行生成,回答并评价完当前题目后,点“继续测试下一个”才发起下一题。 单题揭晓不改变这个顺序:它只提前告诉你某道题的成果出自谁,不会让下一题提前开始作答。 某位选手掉线时,可以在他的卡片上点“重新开始”,只重跑这一份成果,不必把整场评测重做一遍。 系统最多同时处理 8 个生成任务,每个浏览器工作区最多同时运行两场测试。 导入提示词保持原样发送给模型,评分标准作为评审参考展示。 当前使用新会话中的单次文本生成,不提供联网搜索、文件工具、代码执行 Agent 或多轮自动修复。

导入格式

支持 .md、.txt、.json 文件和直接粘贴。 examples/interview.md 与 examples/tasks.json 可以直接导入。 每个文件限制为 1 MB,单场请求限制为 2 MB。

Markdown 推荐格式:

# 测试标题
## 测试提示词
完整任务、输入材料、约束和预期输出格式。
## 评分标准
- 准确性(40分):具体判断依据
- 可用性(35分):具体判断依据
- 表达(25分):具体判断依据

多道题用单独一行 --- 分隔。 无明确分值的自由文本评分标准会保留为满分 100 的综合评分项,导入后可以自行调整。 JSON 支持单道题、题目数组和 { "tasks": [...] }。 每道题字段为 title、prompt、evaluation、format 和 criteria。 format 为 text 或 html。 每项评分包含 name、description、maxScore,每项满分为 1 到 100 的整数,实际评分可以为 0。

文本材料可以在核对页面补充,内容会原样加入所有模型收到的提示词。 当前不解析 PDF、Word、图片或音频附件。

模型协议

协议 请求路径 认证
OpenAI 兼容 /v1/chat/completions Authorization: Bearer ...
Anthropic 兼容 /v1/messages x-api-key、anthropic-version: 2023-06-01

Base URL 可以填写服务根地址、以 /v1 结尾的地址或完整协议端点。 支持自定义兼容网关和本地 HTTP 服务,不跟随上游重定向。 使用流式请求和 messages,每次生成最长等待 30 分钟,页面显示已收到的文本字符数。 兼容忽略流式参数并返回完整 JSON 的网关。 流式连接提前结束或返回错误时将本次成果标记为失败,避免将半份输出计入评分。 应用允许配置最多 1,000,000 输出 Tokens,但必须符合实际模型的输出限制。 单份成果最多保存 1600 万字符。 OpenAI 协议可以选择 max_tokens 或 max_completion_tokens,Anthropic 使用 max_tokens。 请使用支持这些协议字段的模型端点;当前不实现 OpenAI Responses API 和提供商专有工具。 连接测试使用与正式生成相同的协议路径、认证方式和输出 Tokens 参数,因此配置问题会在测试阶段暴露。 连接测试最多等待 60 秒,收到模型回复即判定连接正常,并提前中止超出需要的输出。 鉴权失败、接口或模型不存在、额度或速率限制会分别给出可操作的提示,且不会显示上游原始响应。 达到输出上限时,界面会标记成果可能不完整。 失败请求保留匿名错误状态,不计入评分。 掉线的选手可以在自己的成果卡片上点“重新开始”,只重跑这一份成果,其它题目、其它选手和已经给出的评分都不受影响。 创建者也可以在提示条里一次让所有掉线的选手重新开始。 重新开始之前可以先去模型设置修好 API Key,再让 TA 重来一次。 本场评测揭晓之前都可以重新开始;揭晓之后不能再改变本轮成果。 重新开始可能产生额外 API 费用。

匿名、评分与分享

每位评审者获得独立且持久化的随机展示顺序。 评分前,成果接口不返回模型配置、对应关系、耗时或社区分数,成果数组也按匿名顺序返回。 每份成果只给一个整体档位(很差、一般、可以、非常好),换算成 0 到 100 分,不必逐条评分标准打分。 全部成功成果完成评分后,服务端校验范围并锁定本人的评分,再返回模型身份。 揭晓后可以回看原始成果,但不能修改评分。 提交评分后,原有成果卡片依次翻牌显示模型身份,评分和盲评均分保留在各自卡片中。 刷新已揭晓的评测会直接展示身份;系统开启减少动态效果时跳过翻牌动画。 创建者的揭晓不影响其他评审者的匿名状态。 社区成绩按 0 到 100 的整体评分直接平均展示,不跨不同题目计算全站总榜。 模型自身生成的文字或风格可能让评审者推测身份,平台匿名指的是隐藏系统中的身份映射。

单题揭晓

不必等所有题目做完:某道题的选手全部作答完成、并且你已经给这一题打完分之后,就可以点操作栏里的“立即揭晓第 N 题”,单独查看这一题的成果分别出自哪个模型。 揭晓要求这一题的所有成果都生成成功;有成果失败的题目不能单独揭晓。 揭晓后这一题的评分随即锁定,不能再改;其他题目仍然保持匿名。 如果每一道题都被单独揭晓过,页面会显示成完整揭晓的样子,但社区成绩仍然要等提交评分之后才出现。 揭晓按浏览器会话保存,刷新页面后依然生效,换浏览器或清除 Cookie 则重新开始。 单题揭晓只影响本人:其他评审者看不到你揭晓了哪道题,也看不到你给出的分数。 揭晓时随身份一起返回的只有模型显示名称、Model ID 和协议,不包含 Base URL 等连接信息。 最终提交评分时,已锁定题目的分数以揭晓时保存的值为准,服务端不接受改写。

工作区和评审身份使用 HttpOnly Cookie 保存在当前浏览器。 清除 Cookie 或换浏览器会创建新工作区,当前没有账号登录、跨设备同步或严格的一人一票身份认证。 分享链接允许持有者查看该场题目、材料和成果,应仅分享适合对方查看的评测。 在本机启动时,其他设备无法使用 127.0.0.1 链接,需要在其可访问的服务器或局域网地址上运行项目。

成果预览

支持 Markdown、表格、代码块,以及完整的单文件 HTML 成果。 HTML 在不授予同源权限的 sandbox iframe 中运行,允许内联脚本和样式。 网络请求、外部脚本、表单提交和父窗口导航受到限制。 生成网页时请要求 CSS 和 JavaScript 内联,不使用 CDN 或外部资源。 Markdown 中的外部图片不会自动加载。 支持重置、全屏、查看原始回答和下载原始成果。 代码不会在 Node 服务端执行。

数据与密钥

默认数据目录是 data/,可通过 DATA_DIR 修改。 SQLite 保存模型配置、题目、运行记录、匿名顺序和评分。 API Key 使用 AES-256-GCM 加密,密钥在 data/encryption.key。 浏览器不会收到已保存的明文 Key,编辑时留空表示保留原 Key。 备份和迁移时必须同时保留数据库与加密密钥,不能只备份其中一个。 数据目录、环境文件和测试输出已加入 .gitignore。 运行和错误日志记录阶段、内部记录标识、状态、耗时和匿名化错误原因,不输出 Key 或上游原始错误响应。 服务重启后,将中断的任务标记为失败,避免自动重放产生费用。

构建与部署

npm run build
npm start

生产构建由 API 服务直接提供,默认打开 http://127.0.0.1:3001。 本地默认只监听回环地址。 需要在可信局域网提供访问时,可以设置监听地址:

$env:HOST = "0.0.0.0"
$env:PORT = "3001"
npm start

使用实际局域网地址打开项目后生成分享链接。 对外部署建议使用 HTTPS 反向代理并保留原始 Host 头。 仅在可信反向代理之后设置 TRUST_PROXY=1,让服务正确识别 HTTPS 和设置 Secure Cookie。 当前是浏览器工作区隔离的小型单实例应用,面向个人或可信小组使用。 公开运营前需要增加账号体系、配额、反滥用和适合部署环境的网络访问控制。

验证

npm run check
npm test
npm run build
npx playwright install chromium
npm run test:e2e

应用运行时,可以执行 npm run capture 保存桌面首页、匿名对比、揭晓和手机界面截图到 artifacts/。

单元测试覆盖导入、协议路径、评分范围、单题揭晓的评分校验、完整性和成绩归一化。 API 集成测试使用本地模拟服务验证两种协议认证、相同提示词并行执行、密钥保护、盲评权限、独立揭晓、单题揭晓的隔离与锁定、掉线选手重新开始、评分锁定和重启持久化。 连接测试覆盖已保存配置、表单草稿、编辑时复用已保存的 Key、上游鉴权与模型不存在的提示,以及工作区之间的访问隔离。 浏览器测试覆盖桌面和手机上的模型配置、连接测试、导入、生成、可运行成果、评分草稿恢复、掉线重启、揭晓、单题揭晓、分享以及横向溢出检查。 测试使用临时数据和模拟 Key,不调用真实付费模型。

项目结构

src/              React 界面、导入解析、匿名预览和评分
server/           Express API、协议适配、SQLite、并行任务和演示作品
examples/         可直接导入的 Markdown / JSON 题目
tests/            单元、API 集成和浏览器测试
data/             本地运行数据和加密密钥(不提交)

开源许可证

本项目使用 MIT License。 仓库只包含源码和合成示例,不包含 API Key、运行数据库、用户评测内容、日志或截图。

About

Fun Bench: blind AI model evaluations using your own real-world tasks, with OpenAI and Anthropic compatible APIs.

Resources

Stars

5 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages