汉谟拉比
花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花相花 一个小的,有意见的框架 编写LLM评价 你将真正信任.
状态 : α (v0. 3. 0) (中文(简体) ). 盘上装载器,CLI跑车,a 多供应商 评委面板(Anthropic + OpenAI + Google + DeepSeek + Fireworks + 任意OpenAI相容主机) 在 spec 前题中配置, (中文(简体) ), 确定性计分标准, (中文(简体) ), 基线意识退出语义 (已知故障级), 导入分辨率飞行前,基线回归探测,以及回波范围 hammurabi-check CI命令全部运出. 斯克马斯使用Zod v4.
为什么
团队在可以信任输出而不重新读取每个diff时,会更快地飞出. Hammurabi是连接组织:用于任何跑道(或下游工具,如: 纳克)可以消耗.
安装
npm install @collabb/hammurabi
或直接运行 CLI 不安装:
npx @collabb/hammurabi hammurabi-run path/to/foo.spec.md
国 际
Hammurabi轮船用来判断捆绑物和用于非互动性的 提议 / 选择 / 锁流( 通过 npm bin 安装后可用) .
hammurabi-run - 一个捆:
hammurabi-run path/to/foo.spec.md \
--aggregator min \
--filter foo-001,foo-007 \
--update-baseline
法官小组决定 eval 块(见下文); CLI 旗帜
超过它。 一个兄弟 foo.baseline.report.json 自动发现
回归检测( e)--no-baseline 跳过, --update-baseline 祝福一个
(见A/CN.9/WG.III/WP.96,第1段)。 写作 foo.report.json 财务报告和审定财务报表 foo.report.md 与 spec 并列(或 单位)
--out <dir>) (中文(简体) ).
hammurabi-check ——目录下的每一捆(CI入门点):
hammurabi-check evals/
发现每个 *.spec.md并按预定的基线运行
合计为1 check-report.json + 合并退出代码.
退出代码(两个宾箱)都具有CI意义和 基线认识 (自0.1.1起):
0——无新故障(vs基线)和回归1- 任何新的失败(在基线中通过固定,现在失败)或回归2无法运行( 错误的参数、 错误的捆绑、 跑道错误、 未解决的导入)
在承诺的基线地表上完全没有固定的
known-fail (baselined) 警告,不要破裂大门
一个诚实的基线,不是100%的绿色 仍然可以坐在CI。 基线d
现在通过表面的固定 improvement 提示通过
--update-baseline。 。 。 .
在打分前, 两箱 每个动态导入 捆绑使用
(功能目标模块+代码评价模块). 无法解答的道具出口 2
带有精确信息,指定标准或目标。 跳过 --no-preflight。 。 。 .
运行 hammurabi-run --help 编号 : hammurabi-check --help 为全旗列表。 A 类
滴入的 GitHub 动作模板位于 templates/eval-gate.yml。 。 。 .
hammurabi-propose 编号 : hammurabi-select 编号 : hammurabi-lock - 转动任务
源到内容隐藏的锁。 没有提示和模式呼叫。 打电话的人
提供决定草案作为JSON;hammurabi验证、正常化和散列.
从任务列表复选框中读取选择, 以及一个明确的选择文件
推翻每个决定的复选框。 锁是写给Stdout的,或者
--out。 。 。 . --publish 财务报告和审定财务报表 --post 这是唯一的写作, 而且两者都是选择进入.
hammurabi-propose --source github-issues:owner/repo#32 --in draft.json > proposal.json
hammurabi-select --proposal proposal.json --source text:./tasks.md > selection.json
hammurabi-lock --proposal proposal.json --selection selection.json > lock.json
hammurabi-lock --verify lock.json
github-issues 读取 owner/repo#N 与 GITHUB_TOKEN (可选的 API 基础 :
HAMMURABI_GITHUB_API) (中文(简体) ). text 读取下调任务列表,或 - 为斯丁.
复选框区域坐到 a 下 D1 标题(## D1 ... 或者说 **D1 ...**) (中文(简体) ).
contentHash 实值 sha256: 超过RFC 8785 Canonial JSON的锁,不包括
contentHash, (中文(简体) ), lockedAt,以及 lockedBy。 。 。 .
hammurabi-verify ——离线检查取出的问题LOCK. 没有网络和标志.
hammurabi-verify --issue-json issue.json --allowlist allowlist.json
issue.json 是问题机构加评论. allowlist.json 是GitHub 登录的 JSON 阵列. lockedBy 是最后一个 LOCK 注释 user.login。散列是 sha256: 超过问题机构的RFC 8785 Canonical JSON,并且必须与该评论相匹配. 印刷品 {ok, reason, lockedBy, hash} ,当锁有效时退出 0,当锁无效时退出 1.
提议/ 选择/ 锁定的退出代码 :
0没事1——验证或验证失败(未决定决定,超选,提案不匹配,散列不匹配)2无法运行( 错误的参数、 缺少源、 证书或网络错误)
斜线命令
把它们复制到任何项目 .claude/commands/数字 :
cp node_modules/@collabb/hammurabi/commands/*.md .claude/commands/
/hammurabi <path-to-spec.md>- 4个步骤的作者流:通过QQA来精炼光谱 出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出入出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出入出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出/hammurabi-run <path-to-spec.md>——援引CLI,再以聊天方式总结报告(失败,回归,错误的定着,法官投票)
司马
手工类型, 磁盘上所有语言中性 :
| 艺术 | 格式 | TS 类型 |
|---|---|---|
| 光谱 | *.spec.md (前题+正文) | Spec |
| 鲁布里克语Name | *.rubric.json | Rubric |
| 固定设备 | *.fixtures.jsonl | FixtureSet |
| 提议 | 贾森 | Proposal |
| 选择 | 贾森 | Selection |
| 锁定 | 贾森 | Lock |
报告是JSON: Report 类型.
import type { Spec, Rubric, FixtureSet, Report, Proposal, Selection, Lock } from "@collabb/hammurabi/schema";
import { run } from "@collabb/hammurabi/runner";
撰写指南
三个模式 总是咬 第一次捆绑的作者。 收养他们
在您撰写标题之前。 见 docs/authoring-guide.md
为长式走过.
导入合同——不再重新编码
如果您的目标输出出符合计划、 JSON 光谱或函数的输出
签名, 您的评审员应当导入目标使用的相同定义。 。 。 .
将密钥列表、类型形状或验证规则复制到评估者手中
保证目标第一次改变时漂移。 错误的常见形式 :
(单位:千美元) requiredKeys 数组漂移出源代码同步 *.schema.json,则
门无声地腐烂了,而标题报告为不符合要求的输出为绿色.
镜像您的作品验证器库和配置
如果 eval 镜像 生产 验证器 (ajv, (中文(简体) ), zod, (中文(简体) ), joi,...) 针入
同一个主要版本 生产代码使用和应用 相同的配置
(单位:千美元)formats, (中文(简体) ), coerceTypes, (中文(简体) ), strict(中文(简体) ). ajv 8 名评价员
ajv 6 生产代码不是同一门.
使用外部解析器的套件必须安装
导入的捆绑目录 npm 软件包必须包含 package.json
与宣布的道具。 依靠"母项目碰巧举起"
断开文件 hammurabi-check evals/ 使用捆绑时的大小写
运行在 CI 工作空间或新检查中。 自0.1.1起,两个CLI机箱都在飞行前
每一次动态导入,在打分和发出指向
违法的标准或目标——根由的固定仍然是被宣布的dep.
这个 eval 块- 前题中的法官面板
如何严格地判断一个类别—— 小组的规模和推理 —— 说
生活在光谱的前题 eval 块,所以它是 版本控制
可审查而非暂时的CLI旗:
---
name: trade-sizer
version: "1.0.0"
description: ...
target: { kind: http, url: https://... }
eval:
riskTier: critical # shorthand → a default cross-provider panel
aggregator: min # any single judge flagging a problem fails it
generatorProvider: anthropic # warns if a judge shares this provider
judges: # ...or spell the panel out explicitly
- { provider: anthropic, model: claude-opus-4-8, role: primary, reasoning: high }
- { provider: openai, model: gpt-4o, role: secondary, reasoning: none }
- { provider: google, model: gemini-2.5-pro, role: tiebreaker, reasoning: medium }
---
riskTier(单位:千美元)low|medium|high|critical) 扩展为默认值 通过面板RISK_TIER_PRESETS高级意味着更多的法官,更多的提供者, 更多推理,更保守的汇总。 以明白的方式克服其中任何一种judges编号 :aggregator。预设仅使用Anthropic/OpenAI/Google; 深网、烟花和openai_compatible选择进入 - 通过一个 明确judges输入.reasoning(单位:千美元)none|low|medium|highqq 象征性预算) 映射到 每个提供者的机制: Anthropic 扩展思维, OpenAIreasoning_effort双子座思维预算 DeepSeekdeepseek-reasoner。 。 。 .- 减少交叉提供者的偏见 任何法官都不得分享产出
提供商(同一家庭模式对其本身的作风进行宽大评价)。 设定
generatorProvider当法官与它相撞的时候,跑者将警告它.
决议优先性:CLI/RunOptions 覆盖 > 翻译: eval.judges > 翻译:
eval.riskTier 预设 > 翻译: 一个缺席的海库法官.
供应商
| 提供者 | 密钥环境 var | 基础 URL | 页:1 |
|---|---|---|---|
anthropic | ANTHROPIC_API_KEY | AI_GATEWAY_URL 覆盖 | 原生结构输出+扩展思维. 缺席法官. |
openai | OPENAI_API_KEY | OPENAI_BASE_URL 覆盖 | 严格 json_schema 模式; reasoning_effort 在o系列/gpt-5. |
google | GEMINI_API_KEY (或 GOOGLE_API_KEY(中文(简体) ) | —— 说 | JSON MIME类型+思维预算. |
deepseek | DEEPSEEK_API_KEY | DEEPSEEK_BASE_URL 覆盖 | 原生DeepSeek API(OpenAI有线格式). |
fireworks | FIREWORKS_API_KEY | https://api.fireworks.ai/inference/v1 (覆盖 : FIREWORKS_BASE_URL(中文(简体) ) | 一等烟花服务. 模型字符串传到线上 逐字记录 (单位:千美元)accounts/fireworks/models/...) (中文(简体) ). |
openai_compatible | 法官入口处 api_key_env | 法官入口处 base_url (必须) | 任意 OpenAI 兼容主机的逃出舱门(Together, vLLM, 一个网关,...). |
fireworks 只需要钥匙; openai_compatible 命名其终点
键入 var 法官的条目本身,所以一个面板可以混合多个
主机 :
eval:
judges:
- provider: fireworks
model: accounts/fireworks/models/deepseek-v3p1
role: primary
- provider: openai_compatible
model: kimi-k2-instruct
base_url: https://llm.example.com/v1
api_key_env: EXAMPLE_LLM_KEY
role: secondary
base_url编号 :api_key_env 用于 openai_compatible 并被拒绝
每一个提供者(他们的终点都是在其中建造的). 缺少的密钥 Ev var
在任何固定执行前拒绝运行,指定变量(runner failed: /出处2. 法官在呼叫时间出错(超时,529,分析)
被排除在总量之外 跑者警告过一次
excluded from the aggregate。两个提供者发送精确
在 DeepSeek- vi- Fireworks 上验证了请求形状: 不合理调用针
reasoning_effort: "none", (中文(简体) ), temperature: 0 和 JSON 对象
模式; 思维调用省略温度/应答 格式并标出 JSON 形状
穿过电源.
设定您使用的提供者密钥 : ANTHROPIC_API_KEY, (中文(简体) ), OPENAI_API_KEY, (中文(简体) ),
GEMINI_API_KEY, (中文(简体) ), DEEPSEEK_API_KEY, (中文(简体) ), FIREWORKS_API_KEY. Base-URL 覆盖
为: 每个提供者 并且每个只调整自己的提供者的流量:
AI_GATEWAY_URL (雅典语), OPENAI_BASE_URL (开放AI), DEEPSEEK_BASE_URL
(深处), FIREWORKS_BASE_URL (烟花). 没有单个变量
通过一个网关向每个供应商传送.
折旧:
DEEPSEEK_*(原始内容存档于2019-10-12). env-remap pattle. 指点DEEPSEEK_BASE_URL在非本地的 OpenAI 兼容主机( 如烟花) 仍在工作——非理性法官派reasoning_effort: "none"财务报告和审定财务报表 stema- construction JSON-object 模式, 而本地的 DeepSeek 调用( 未设置基数) URL 或 网络https://api.deepseek.com保持它们的形状不变。 但它重现 每个 穿过环境 隐蔽地判断 光谱 偏好provider: fireworks(或provider: openai_compatible页:1 其它主机: 相同的电线形状, 在它所在的光谱前题中声明 版本控制和可审查。 关闭 16号。 。 。 .
决定性( 计分码) 标准
保留法官小组进行判决;让代码检查哪些代码可以检查
准确(召回、存在、格式、时间)。 附有一项标准 code
评价员通过导入一个函数来打分——没有法官呼叫,完美
可复制:
{
"id": "semantic-recall",
"name": "Semantic recall",
"description": "Fraction of must-include elements present in the top-N.",
"weight": 0.35,
"scale": { "kind": "ordinal", "min": 0, "max": 1 },
"evaluator": { "kind": "code", "module": "./evaluators.ts", "export": "semanticRecall" }
}
导出收到 { input, expected, output, fixture } 返回数字
或者说 { score, reasoning } 在标准的比例。 LLM 和代码标准组合
在一个标题中自由使用;一个没有LLM标准的标题使得零API呼叫.
界定某些固定装置的标准—— appliesTo
一些目标释放出多个形状:成功响应和错误 反应,或者一个CLI背后的几个行动. 写给其中之一的标准 对其他人没什么好说的 也没什么好说的 以传道而行. 要求法官弃权,这样做不合理——法官 偶尔得分0 而他们自己的推理说规则要求 通过。 不要问,标准等级输出 它从来没有看到, 持续低调.
appliesTo 把它写在标题上 适用标准列名标签
仅用于至少装有其中之一的固定装置:
{
"id": "partition-integrity",
"name": "Every parsed seed lands in exactly one bucket",
"weight": 0.2,
"scale": { "kind": "ordinal", "min": 0, "max": 1 },
"appliesTo": ["collect"]
}
{"id": "parses-a-listing", "input": {...}, "tags": ["parse"]}
{"id": "collects-a-page", "input": {...}, "tags": ["collect"]}
奥米 appliesTo 并且该标准适用于每个固定点——默认,以及
每一个现有的标题做什么.
在评分前,放弃不适用的标准: 没有法官的电话, (中文(简体) ), 和固定的加权分数 重新正常化的标准做 应用。 重归正常是重点 整体重量为1.0 标题,所以没有它,一个固定的,其中适用6个标准中的3个被除以 重量从来没有在玩, 一个完美的答案盖以0.5.
有两件事是故意的:
- 没有遗漏. 法官拒绝得分是一个故障——不包括在
以及一个标准,没有法官评分 错误的固定。 那个
高音对"不能评价"是正确的,对"不适用"是错误的.
不适用的标准列于每个表格中
FixtureResult.inapplicable财务报告和审定财务报表 因此,坐以待毙是显而易见的,而不仅仅是缺席. - 无法代替拆分. 如果一个RUBRIC的标准 被违反
脱节团体与脱节团体的关系,即通常两种行为
两个包.
appliesTo这是真正跨越一个标准.
一个 appliesTo 标记捆绑载中任何固定都是负载时间错误—— a
在运行停留时, type 将会在任何地方禁用标准
绿色,读起来就像覆盖.
运行者
import { run } from "@collabb/hammurabi";
const report = await run({
spec, // panel comes from spec.frontmatter.eval unless overridden here
rubric,
fixtures,
judges: [{ provider: "anthropic", model: "claude-haiku-4-5" }], // optional override
aggregator: "min",
baseline: previousReport,
});
法官小组
跑步者判断每个固定器的输出 可配置的LLMS面板,通常写在 spec's eval 块这些 RunOptions 控制它进行一次性运行。 默认(无 eval 块,无 覆盖)是单一的 Haiku 4.5 法官.
| 选项 | 默认 | 页:1 |
|---|---|---|
judges | 从 eval 块, 否则 [{ provider: "anthropic", model: "claude-haiku-4-5" }] | 法官配置阵列provider, (中文(简体) ), model, (中文(简体) ), role, (中文(简体) ), reasoning, (中文(简体) ), weight) (中文(简体) ). 小组的呼叫是平行进行的. |
aggregator | "mean" | "mean" | "median" | "min" | "max" 或习惯 (scores: number[]) => number应使用对风险敏感的呼叫者 "min"。 。 。 . |
regressionThreshold | 0.05 | 每平方位加权分数三角洲,下方标出回归与基线. |
execute | —— 说 | 所需经费 target.kind === "free-form"自定义返回给定输入输出的执行器. |
费用说明:面板大小乘以线性成本. 由2名法官组成的分庭费用为2×1名法官。 长相间隔时间大致不变(小组电话通过 Promise.all) (中文(简体) ).
审计线索
每个 CriterionScore 报告中保留了小组的全部表决票数:
{
criterionId: "is-uppercase",
score: 0.5, // aggregated
reasoning: "[claude-haiku-4-5] ...\n\n[claude-sonnet-4-6] ...",
judgeVotes: [
{ model: "claude-haiku-4-5", score: 1, reasoning: "..." },
{ model: "claude-sonnet-4-6", score: 0, reasoning: "..." },
],
}
如果法官错误或省略了某项标准,其投票结果仍为: judgeVotes
带有 error 字段——但它是 不包括在总数内,所以一个
短暂的失败永远不能捏造出低分和虚假的回归. A 类
标准 没有 法官可以给错误的固定标记(qq),永远不要
失败( QQ) , 并且仍然行走一个非零 CI 出口, 所以它不能默默通过 .
目标种类
Spec.frontmatter.target 是标记的联盟 :
kind | 所需字段 | 跑者如何执行 |
|---|---|---|
cli | command | Shell-exec;固定输入被管道接通为Stdin为JSON;stdout解析为JSON(倒回纯文本). |
function | module, (中文(简体) ), export | 动态 import(module),电话 module[export](input)。模块路径应从调用者的解析上导入. |
http | url选项 method (默认) POST(中文(简体) ) | fetch 与 application/json 躯体. |
free-form | description | 电话 options.execute(input)时 kind 实值 free-form。 。 。 . |
吸烟试验
npm install
npm run smoke
要求数 ANTHROPIC_API_KEY (可选) AI_GATEWAY_URL cloudflare AI Gateway 路由).
小组吸烟:
HAMMURABI_SMOKE_JUDGES="claude-haiku-4-5,claude-sonnet-4-6" HAMMURABI_SMOKE_AGGREGATOR=min npm run smoke
预期费用:单名法官运行为0.02美元,包括Sonnet在内的2名法官小组运行为0.10美元.
版式
hammurabi/
├── src/
│ ├── schema/ # Spec, Rubric, Fixture, Report types
│ ├── loaders/ # On-disk parsers (*.spec.md, *.rubric.json, *.fixtures.jsonl)
│ ├── runner/ # Execute fixtures + judge panel + score
│ ├── cli/ # hammurabi-run CLI + Report → markdown renderer
│ └── index.ts
├── commands/ # /hammurabi, /hammurabi-run
├── examples/smoke/ # End-to-end smoke (inline + disk variants)
├── tests/ # Unit tests (tsx --test)
└── plans/ # Approved implementation plans