agentleFS
ManagerZhang10ManagerZhang10/algorithm-engineer-skills/skills/pelican-bicycle-eval/SKILL.md

pelican-bicycle-eval

Skill1 starsChanged 27 days agoMITView on GitHub

重复运行并展示「鹈鹕骑自行车」SVG 测评,对比模型、推理档位、稳定性、token 与折算消耗;proxy-check 模式把官方直连和中转的同题结果、token 与响应元数据画在同一张看板上直观对比。适用于用户要画鹈鹕横评、比较模型 SVG 能力,或要一张通道对比的可视化看板;不负责判定中转是否注水,也不把单题结果当成通用智力排名。

  • Reads credentials

The file

Files
SKILL.md

Pelican Bicycle Eval · 鹈鹕测评

「生成一张鹈鹕骑自行车的 SVG」是 Simon Willison 2024 年起推广的非正式基准。本技能把它做成 可重复、可检查的轻量测评:

  • 图是感官参照 —— 同一道题,各家画成什么样,一眼可比。
  • 重复与用量补足单张图 —— 记录实际模型、推理档位、首次响应、失败样本、token 和明确的折算口径。
  • 中转模式的响应元数据才是通道证据 —— prompt_tokens、reasoning_tokens、响应 id 和 usage 字段都来自同一发请求,不从画面猜中转有没有动手脚。

什么时候用

  • 想横评模型或推理档位的 SVG 构图、代码生成和重复稳定性
  • 已有若干 SVG,想生成可放大、可下载、带 token 折算的自包含网页
  • 想把官方直连和几条中转画在同一张看板上,直观展示通道差异(要判定中转是否注水,用专门的中转检测技能)

不适用:把一张或一道鹈鹕题当成通用智力分数,或判定端点背后到底是哪款模型。经典单题已被 广泛传播且在前沿模型上趋于饱和;它适合做直观冒烟测试和重复性对照。模型身份和注水判定要用 签名回放、行为指纹等专门方法;proxy-check 模式只把通道差异画出来,供直观对照。

先选模式

模型 / 推理档位横评

  1. 冻结逐字相同的题面,对每个配置做独立采样;看稳定性时至少三次。
  2. 保留首次响应和失败结果,不修图,不挑最好看的一张冒充单次结果。
  3. 记录准确的模型、推理档位、通道和 token;估算值明确标 tokens_exact: false。
  4. 套餐折算只使用用户指定或可引用的当前官方口径,把倍率写进 manifest,不硬编码进页面。
  5. 按 通用看板 schema 写 manifest,再运行:
python3 pelican_eval.py render /path/to/manifest.json --out /path/to/board.html --open

若用户已经给了 SVG 或结果,只做整理与渲染,不重新调用模型。若用户明确说不用代理/中转, 不要调用 proxy-check 模式。

中转对比看板(proxy-check)

同一个模型至少要有「官方直连 + 待验通道」两条泳道,而且思考档位逐字相同。下面的配置、判读和 采样规则只适用于这个模式。

运行 proxy-check 模式

只用 Python 标准库,不装依赖。

mkdir -p ~/.config/pelican-bicycle-eval
cp lanes.env.example ~/.config/pelican-bicycle-eval/lanes.env
chmod 600 ~/.config/pelican-bicycle-eval/lanes.env   # 里面是密钥
$EDITOR ~/.config/pelican-bicycle-eval/lanes.env     # 填端点、密钥、模型

python3 pelican_eval.py proxy-check --open       # 跑一轮并打开看板
python3 pelican_eval.py proxy-check render       # 只用已有快照重出看板

可选参数:--config PATH(泳道配置)、--out DIR(快照与看板目录)、--keep N(保留最近 N 轮)、 --lang zh|en(看板语言)、--anonymize(通道名抹成「中转 A/B」)、--help。写错的参数会直接 报错退出并提示正确写法,不会被静默忽略。

看板每格除了图,还印着这一发的证据:入 <token> (+差值)、思考 <数>(— 表示该通道不回传 这个字段,跟回传了 0 不是一回事)、usage 非标 N 项(悬停看字段名)、以及跟基线不一致时的响应 id 前缀。差值只在同一个 model 的泳道之间算,跨 model 不算。

想常态化就挂个定时器,半小时一轮足够。脚本自带锁,上一轮没跑完不会叠上来。

泳道怎么配才有意义

同一个模型至少配两条通道:可信的官方直连 + 待验的中转。 官方直连是基线,用 PB_<名>_BASELINE=true 显式标出来(不标时回退到 CHANNEL 名里带「直连」/ direct 的那条); 没有基线,所有数字都只是绝对值,看不出被动了什么手脚。大多数同类工具的难处也在这 —— 它们得靠 社区维护的参考指纹,而你手里往往真有直连账号可比。

字段说明和一份可直接改的模板见 lanes.env.example。泳道名和行序都从配置推, 按 PB_<名>_BASE_URL 出现的先后排,加泳道只改配置文件、脚本不动;想自己定顺序就加一行 PB_LANE_ORDER=名1,名2,名3。

结果怎么读

信号含义
入 token 比同款模型的直连多中转往每个请求里塞了隐藏上下文。恒定差值 = 固定的 system prompt;忽大忽小 = 后面挂着多个池子、路由随机,意味着同一个 prompt 的行为不可复现
入 token 比直连少上下文被截断了,长输入场景要特别当心
思考 token 为 0 或远低于直连同一个思考档位下推理被抑制。先确认它会回传这个字段:回传通的通道数字才可信,恒 0 的要再验一次是不是压根不回传(见下)
usage 里冒出非标准字段中转层的实现指纹。第三方转售常会漏出它自己的计费、缓存或上游平台字段
响应 id 前缀不对Anthropic 真实 id 以 msg_01 开头,OpenAI 是 chatcmpl-。给出别的前缀说明响应被改写或伪造
model 回显跟请求不一致直接证据,虽然容易伪造
判「没画出来」两种原因:SVG 不是合法 XML(<img> 走严格 XML 解析,属性重复就整张白屏),或用了 <image> / <text> / 外部 href 这类绕过作图的手段

图元数(path_count)只是粗糙的复杂度指标,好不好看仍需人眼。

思考 token 恒为 0 时要再验一步

「没思考」和「不回传思考计数」是两回事,别把后者报成前者。判别方法:

  1. 同一个端点,分别用 reasoning_effort: "low" 和 "high" 各打一发。数字跟着变 → 回传是通的, 那么低数值就是真实的思考量。
  2. 如果该模型有原生协议(如 Anthropic 的 /v1/messages),换协议再打一发,看响应里有没有 thinking 内容块。有块无计数 = 只是不回传;无块 = 真的没思考。

方法上的坑

  • 题面逐字不能改。Generate an SVG of a pelican riding a bicycle. 是通行基准,满世界的 对比图都用它,改了就没法跟公开语料横着比。作者 2025-11 发过一版更严的(指定加州褐鹈鹕、 辐条、繁殖期羽色),区分度确实更高,但没成为通行口径 —— 流传的图基本都是白鹈鹕,说明 大家用的还是原版。本技能保留原版。
  • 各家的思考旋钮对不齐:OpenAI / DeepSeek 用 reasoning_effort,部分国产模型用 enable_thinking + thinking_budget,Anthropic 用 output_config.effort (low / medium / high / xhigh / max,不传等于 high)—— 它跟控制思不思考的 thinking.type 是两个独立参数,并存不冲突;Opus 5 上 budget_tokens 已移除,传了直接 400。 2026-09-13 实测,同一道多面体几何题、题面逐字相同、流式、max_tokens 给够:

    泳道旋钮lowhigh更高档 / 不传
    claude-opus-5 直连output_config.effort29412792972(max)
    deepseek-v4-pro 直连reasoning_effort40781809715693(不传)

    结论有三条。一、两家都认自己的旋钮,档位分得开,DeepSeek 的 reasoning_effort 不是被 忽略的 OpenAI 口径残留,它的 high 是真高于默认。二、同一档的绝对值差一个数量级 (high 档 1279 vs 18097),跨家比思考 token 的大小没有意义,只有同一个模型的直连 vs 中转 之间比才是证据。三、DeepSeek 的档位还会改它自己的 prompt_tokens(同一段题面 low 档 105、 high 档 184),所以比 input token 注入时,两条泳道的档位必须填成一样的,否则量到的差值 里混着它自己的思考前缀。短题面也照样被污染,实测过: 拿一段几十字的固定短文本打 deepseek-v4-pro,prompt_tokens low 档 38、high 档 117, 差 79,各打两发可复现;同一段文本在 deepseek-v4-flash 上则两档都是 64。也就是说 污染跟题面长短无关,而且只在部分模型上出现 —— 不能靠「题面很短所以不受影响」蒙混过去, PB_<名>_EFFORT / EXTRA 里的档位必须在被比较的泳道之间逐字对齐,否则量出来的「注入」 可能整个是模型自己的思考前缀。做不到严格对齐就别假装对齐 —— 看板逐条标注档位、单列思考 token, 让差距可见,而不是藏在总 token 里。

  • 必须流式。非流式下 reasoning 模型会思考几分钟一个字不吐,连接直接读超时。
  • 成本:每条泳道每轮一次调用,但画图这道题可能吃掉上万 token。泳道多了要算账。
  • 延迟数字会被本机负载污染,它量的是「这台机器打过去多久回来」。跨通道比较优先看 token 数和元数据,那些是服务端算的;延迟当参考。

单轮结论不要当定论

一次异常可能是抖动。判「恒定注入」还是「间歇注入」,至少要三轮以上,而这恰好是最有价值的 区分:恒定的可以当常量扣掉,间歇的意味着路由随机、行为不可复现。

脚本默认只留最近 3 轮,要做长期趋势,先把每轮的 run.json 归档出去。字段含义见 原始数据说明。

跑多勤

分两个阶段,不要一直用摸底的频率跑:

阶段频率为什么
摸底半小时一轮,跑满一天间歇性注入只有密集采样才抓得到 —— 实测某条中转的注入量在相邻几轮里是 0 → 4414 → 9251,单跑几轮会误判成「干净」
稳定后一天一轮特征已经固化,后面只是留痕看趋势

高频采样不是免费的:每轮要各家出一张完整 SVG,既烧中转额度,也占着跑它的那台机器。 摸清之后降到一天一轮,配合把 run.json 归档出去做长期趋势。

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.