Haiku 5.5短文本价格降90%,但超过10万token后涨回50%折扣;新tokenizer多消耗30%token;effort参数影响实际费用。
2026年10月7日,Anthropic 发布了 Claude Haiku 5.5。模型 ID 为 claude-haiku-5-5。对于不超过 100,000 tokens 的提示词,输入价格为每百万 tokens 0.10 美元,输出价格为 0.50 美元,比 Haiku 4.5 的 1.00 美元和 5.00 美元低了 90%。超过 100,000 tokens 后,价格变为 0.50 美元和 2.50 美元,降幅为 50%,而非 90%。
Anthropic 还表示,新的 tokenizer 对相同文本生成的 tokens 数量比 Haiku 4.5 多约 30%。更便宜的 token 并不自动意味着更便宜的任务。而且 Haiku 5.5 是首个配备 effort 调节拨盘的 Haiku 模型。API 默认值为 medium,low、high、xhigh 和 max 都是真实的设置选项,会改变模型的思考程度,进而影响账单。标价并不会告诉你这一点。
真正有价值的问题是,你的代码在请求发出之前做了什么。
这个工具不会调用 Claude。你向它输入已有的 token 数量、任务名称和 effort 级别,它会返回 ALLOW、REVIEW 或 REFUSE,并打印出以美元计价的价目表账单。
提示词大小等于输入 tokens 加上缓存读取和缓存写入的 tokens。在 100,000 或以下时,适用短文本费率;超过这个界限则适用长文本费率,决策结果为 REVIEW。
ALLOW 仅适用于五类狭义任务:classify、extract、route、summarize 和 compact。effort 必须为 low 或 medium。如果省略 effort,闸门会标记为 medium,因为这是该模型在 Claude API 中的默认设置。
agentic-coding 和 computer-use 即使在短提示词下也属于 REVIEW。Anthropic 自己的 Terminal-Bench 4.0 数据显示 Haiku 5.5 为 39.2%,Sonnet 5.5 为 70.6%。更低的价格不等于相同的任务。high、xhigh 和 max 也属于 REVIEW。该程序没有任何评估能证明这些级别的成本是值得的。
错误的计数和未知的标签会得到 REFUSE。负数的 token 计数不应该变成折扣。
完整源代码如下。保存为 src/gate.ts。需要 Node 22 或更高版本。不需要任何包,也不需要 API key。
node --experimental-strip-types src/gate.ts
/**
* Price gate for Claude Haiku 5.5.
* No network. No API key. Rates are list prices in microdollars per million tokens.
*
* Sources, read 2026-10-08:
* - https://www.anthropic.com/claude-haiku-5-5 (October 7, 2026)
* - https://platform.claude.com/docs/en/models/haiku-5-5/overview
* - https://platform.claude.com/docs/en/build-with-claude/effort
*/
const MILLION = 1_000_000n;
const PROMPT_LIMIT = 100_000n;
const RECOUNT_NUM = 130n;
const RECOUNT_DEN = 100n;
const ALLOW_TASKS = new Set([
"classify",
"extract",
"route",
"summarize",
"compact",
]);
const REVIEW_TASKS = new Set(["agentic-coding", "computer-use"]);
const ALLOW_EFFORT = new Set(["low", "medium"]);
const ALL_EFFORT = new Set(["low", "medium", "high", "xhigh", "max"]);
type Effort = "low" | "medium" | "high" | "xhigh" | "max";
type Ttl = "5m" | "1h";
type Tier = "short" | "long";
type Rates = {
input: bigint;
output: bigint;
cacheRead: bigint;
cacheWrite5m: bigint;
cacheWrite1h: bigint;
};
const HAIKU_55: Record<Tier, Rates> = {
short: {
input: 100_000n,
output: 500_000n,
cacheRead: 10_000n,
cacheWrite5m: 125_000n,
cacheWrite1h: 200_000n,
},
long: {
input: 500_000n,
output: 2_500_000n,
cacheRead: 50_000n,
cacheWrite5m: 625_000n,
cacheWrite1h: 1_000_000n,
},
};
const HAIKU_45_5M: Rates = {
input: 1_000_000n,
output: 5_000_000n,
cacheRead: 100_000n,
cacheWrite5m: 1_250_000n,
cacheWrite1h: 0n,
};
const SONNET_55_CACHE_READ_NEW = 100_000n;
const SONNET_55_CACHE_READ_OLD = 200_000n;
export type Job = {
name: string;
task: string;
effort?: string;
inputTokens: number;
outputTokens: number;
cacheReadTokens: number;
cacheWriteTokens: number;
cacheWriteTtl?: Ttl;
recountFromHaiku45?: boolean;
};
export type Decision = "ALLOW" | "REVIEW" | "REFUSE";
export type Quote = {
name: string;
decision: Decision;
reason: string;
model: "claude-haiku-5-5";
effort: Effort | null;
assumedDefaultEffort: boolean;
tier: Tier | null;
promptTokens: bigint | null;
haiku55Usd: string | null;
haiku45Usd: string | null;
savingsBps: number | null;
sonnetCacheReadNewUsd: string | null;
sonnetCacheReadOldUsd: string | null;
};
function isWhole(value: number): boolean {
return Number.isFinite(value) && Number.isInteger(value) && value >= 0;
}
function mulDiv(tokens: bigint, perMillion: bigint): bigint {
return (tokens * perMillion) / MILLION;
}
function usd(micro: bigint): string {
const whole = micro / MILLION;
const frac = (micro % MILLION).toString().padStart(6, "0");
return `${whole}.${frac}`;
}
function bill(tokens: {
input: bigint;
output: bigint;
cacheRead: bigint;
cacheWrite: bigint;
}, rates: Rates, ttl: Ttl): bigint {
const writeRate = ttl === "1h" ? rates.cacheWrite1h : rates.cacheWrite5m;
return (
mulDiv(tokens.input, rates.input) +
mulDiv(tokens.output, rates.output) +
mulDiv(tokens.cacheRead, rates.cacheRead) +
mulDiv(tokens.cacheWrite, writeRate)
);
}
function savingsBps(before: bigint, after: bigint): number | null {
if (before <= 0n) return null;
return Number(((before - after) * 10_000n) / before);
}
export function quoteJob(job: Job): Quote {
const base = {
name: job.name,
model: "claude-haiku-5-5" as const,
effort: null,
assumedDefaultEffort: false,
tier: null,
promptTokens: null,
haiku55Usd: null,
haiku45Usd: null,
savingsBps: null,
sonnetCacheReadNewUsd: null,
sonnetCacheReadOldUsd: null,
};
const counts = [
job.inputTokens,
job.outputTokens,
job.cacheReadTokens,
job.cacheWriteTokens,
];
if (!counts.every(isWhole)) {
return {
...base,
decision: "REFUSE",
reason: "token counts must be non-negative integers",
};
}
const ttl = job.cacheWriteTtl ?? "5m";
if (ttl !== "5m" && ttl !== "1h") {
return { ...base, decision: "REFUSE", reason: "cache write ttl must be 5m or 1h" };
}
let effort
2026年10月8日检查通过,Node.js 25.6.0。十一个检查全部通过:
classify-short | ALLOW | claude-haiku-5-5 | effort=medium | tier=short | prompt=2000 | haiku55=0.000300 | haiku45=0.003000 | savings_bps=9000 | short prompt, allow-listed task, effort is low or medium
compact-under-limit | ALLOW | claude-haiku-5-5 | effort=low | tier=short | prompt=84000 | haiku55=0.001450 | haiku45=0.014500 | savings_bps=9000 | short prompt, allow-listed task, effort is low or medium
compact-over-limit | REVIEW | claude-haiku-5-5 | effort=medium | tier=long | prompt=110000 | haiku55=0.015500 | haiku45=0.031000 | savings_bps=5000 | prompt is over 100000 tokens, so the long-tier rates apply
coding-short | REVIEW | claude-haiku-5-5 | effort=medium | tier=short | prompt=8000 | haiku55=0.001400 | haiku45=0.014000 | savings_bps=9000 | agentic-coding stays off the Haiku allow-list
classify-max-effort | REVIEW | claude-haiku-5-5 | effort=max | tier=short | prompt=2000 | haiku55=0.000300 | haiku45=0.003000 | savings_bps=9000 | effort max needs an eval this toy does not have
extract-default-effort | ALLOW | claude-haiku-5-5 | effort=medium | tier=short | prompt=1500 | haiku55=0.000300 | haiku45=0.003000 | savings_bps=9000 | short prompt, allow-listed task, effort is low or medium; missing effort was stamped medium, the API default
recount-30 | ALLOW | claude-haiku-5-5 | effort=medium | tier=short | prompt=13000 | haiku55=0.001550 | haiku45=0.012500 | savings_bps=8760 | short prompt, allow-listed task, effort is low or medium; prompt tokens were recounted at 130/100 before the Haiku 5.5 bill
one-hour-write | ALLOW | claude-haiku-5-5 | effort=low | tier=short | prompt=5000 | haiku55=0.000950 | haiku45=none | savings_bps=none | short prompt, allow-listed task, effort is low or medium; one-hour cache writes are quoted for Haiku 5.5 only
bad-tokens | REFUSE | claude-haiku-5-5 | effort=none | tier=none | prompt=none | haiku55=none | haiku45=none | savings_bps=none | token counts must be non-negative integers
unknown-effort | REFUSE | claude-haiku-5-5 | effort=none | tier=none | prompt=none | haiku55=none | haiku45=none | savings_bps=none | unknown effort turbo
sonnet-cache-read | QUOTE | claude-sonnet-5-5 | cache_read_tokens=100000 | new=0.010000 | old=0.020000 | October 7 cache-read cut, not a routing decision
checks=11 passed
savings_bps 是相对于原始 token 数量下 Haiku 4.5 账单的基点。9000 代表 90.00%。5000 代表 50.00%。8760 代表 87.60%。
仔细看这三行输出。
classify-short 是宣传册上的典型案例。2000 个输入 tokens 和 200 个输出 tokens,effort 为 medium。Haiku 5.5 是 0.000300 美元。Haiku 4.5 是 0.003000 美元。相同的 tokens 数量,价格降低了 90%。
compact-over-limit 是容易忽略的边界情况。20,000 个新的输入 tokens 加上 90,000 个缓存读取 tokens,总计 110,000 个 tokens 的提示词。任务仍是 compact,它在允许列表中,effort 仍为 medium,但决策结果是 REVIEW。Haiku 5.5 花费 0.015500 美元。Haiku 4.5 花费 0.031000 美元。节省了 50%,因为长文本层级的费率是短文本层级的五倍,而 Haiku 4.5 的固定费率是短文本层级的十倍。
recount-30 从 Haiku 4.5 的 10,000 个输入 tokens 和 500 个输出 tokens 计数开始。闸门在给 Haiku 5.5 定价前先将输入乘以 130/100,因此新账单使用 13,000 个输入 tokens。Haiku 5.5 是 0.001550 美元。Haiku 4.5 是 0.012500 美元。实际节省了 87.60%,而非 90%。
最后这个报价不是路由决策。10月7日,Anthropic 将 Sonnet 5.5 的缓存读取价格从每百万 tokens 0.20 美元降到了 0.10 美元。100,000 个缓存读取 tokens 现在是 0.010000 美元,原来是 0.020000 美元。闸门打印了这个信息,但没有将任务发送给 Sonnet。
没有 API 调用,没有 key,也没有延迟测量。
effort 不会被转换成 token 乘数。Anthropic 告诉你更高的 effort 意味着更多的思考,但它没有发布任何乘数让这个程序可以诚实地应用。在 classify 任务上使用 max 仍然会显示短文本层级的标价,然后返回 REVIEW。
提示词大小是三个计数相加的总和。Anthropic 说的是"prompts"。如果你的账单计数了不同的子集,在调整总和之前,层级可能会出错。
30% 的重新计数是模型概述中的"约 30%"这个表述,应用于 130/100 这个分数。它不是对你的文本运行 tokenizer 的结果。
五分钟的缓存写入是10月7日表格中的费率(每百万 0.125 美元和 0.625 美元)。一小时的写入是模型概述中的另一个费率(0.20 美元和 1.00 美元)。Haiku 4.5 的一小时写入不在此比较范围内,所以该 fixture 的 haiku45 为空。
Batch API 的输入和输出打五折。这些数字是标准费率。
发布页面上的客户引言,包括 Asana 的延迟说明和 HubSpot 的 92.8% CRM 评分,都是 Anthropic 对早期测试的报告。此处不再复述。
上述基准测试数据来自 Anthropic:OSWorld 2.1 离线子集为 72.4%,Haiku 4.5 为 15.7%,GPT-6 Luna 为 48.9%;GDPval-AA v2.1 Elo 为 1620 对比 735 和 1437;Terminal-Bench 4.0 为 39.2% 对比 0.0% 和 16.4%。
使用的费率,美元/百万 tokens:
来源:
我正在构建 Roster,让 AI 员工完成真实工作。即使是更小的模型仍然需要一个知道它将要支付什么价格的闸门。
如需进一步操作,你可以考虑屏蔽此人或举报滥用行为。