Jev 成本与延迟:真实定价测算
判断类工作天然是高流量的——每条评论、每个工单、每个 chunk——单次价格和单次延迟会快速复利。好消息是:Jev 的经济模型就是为这种负载形态设计的。这篇按公开列表价把账算给你看,从结构上对比通用 LLM 调用,并给出两个最高频高流量场景——审核和重排——的延迟预算与批处理模式。
TL;DR: 按列表价约 $0.0462 / 1M input tokens(第三方列表数据——以 OpenRouter 模型页为准),百万次短问题判断调用只要几十美元,成本大头在 input,因为输出是极短的结构化对象。对比用散文作答的通用聊天模型,省的是结构性的,不是零头。延迟方面:按单次预算、独立调用并发、重排做批处理。
定价测算
本文的参考价是 $0.0462 / 1M input tokens,为写作本文时第三方追踪站列出的 Jev 在 OpenRouter 的价格。这个数字会动——预算落定前务必到 OpenRouter 模型页确认实时价格。
| 工作负载 | Prompt 大小 | 月调用量 | 月 input tokens | input 成本约 |
|---|---|---|---|---|
| 中型站评论审核 | ~200 tokens | 10 万 | 20M | ~$0.92 |
| 大型站评论审核 | ~200 tokens | 500 万 | 1,000M | ~$46 |
| RAG chunk 重排(每查询 10 chunk) | ~150 tokens/chunk | 50 万查询 | 750M | ~$35 |
| 客服工单分诊 | ~400 tokens | 20 万 | 80M | ~$3.70 |
读表要点:这个价位下,input 侧成本很少成为瓶颈——繁忙的审核管线每月也就几十美元量级。两个提醒让账更诚实。第一,output token 也要计费(费率见模型页);Jev 的短结构化答案让这一项很小,这正是它对散文答案的结构性优势。第二,这些是第三方列表数字;官方 TypeSafe AI 渠道的定价单独公布——查 typesafe.ai。
与聊天模型的结构性对比
同一道判断题交给通用聊天模型,差异是性质上的,不只是程度上的:
| 成本驱动项 | 通用 LLM | Jev |
|---|---|---|
| input tokens | 你的问题 + 待判内容 | 相同——两边的大头 |
| output tokens | 每次一句话或一段话 | 极短的结构化对象(示例数据形态) |
| 解析失败 | 重试、防御代码、偶尔人工收拾 | 罕见——答案空间有界 |
| 升级处理 | 通常临时发挥 | 内建:confidence + unclear 把低把握条目送出去 |
output 这一行是聊天模型在判断任务上的出血点:你按生成价格买一段散文,只为提炼一个比特或一个数字。Jev 的答案直接是短结构化对象——{"answer":"yes","confidence":0.97,"rationale":"..."} 就是示例数据(example fixture)形态——单次决策的生成成本被压到地板附近。
延迟:预算与模式
单次 Jev 调用和任何 OpenAI 兼容 chat 调用一样:网络往返加模型耗时。关键在负载形态:
- 单点闸口检查(每事件一次调用):按 p95 而不是均值做预算,并想清楚调用变慢时的兜底——排队、跳过、还是默认拒绝。
- 重排管线(每查询 N 次调用):绝不串行。一次 RAG 查询的十个 chunk 是相互独立的判断,并发发出,墙钟时间就是一次调用,不是十次。
- n8n 等工作流工具:HTTP 超时放宽(30s),节点做成幂等,超时重试才不会重复判分。
Python 并发重排示例:
import concurrent.futures, json, os, requests
def judge_chunk(chunk: str) -> dict:
# Confirm the exact model slug on the OpenRouter model page
resp = requests.post(
"https://openrouter.ai/api/v1/chat/completions",
headers={"Authorization": f"Bearer {os.environ['OPENROUTER_API_KEY']}"},
json={
"model": "typesafe/jev-1.13",
"messages": [{"role": "user", "content": f"Scoring question (1-10): how relevant is this chunk to the query? Chunk: \"{chunk}\""}],
},
timeout=30,
)
return json.loads(resp.json()["choices"][0]["message"]["content"])
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as pool:
scores = list(pool.map(judge_chunk, chunks))
scores 的每个元素都是示例数据(example fixture)——响应形态为示例,正式字段名以官方文档为准。线程池跑完后按返回的 answer 排序你的 chunk 即可。
预算清单
- 实测你的真实 prompt 大小——几乎总比你以为的大;调用量乘以实测 token 数,不要用猜的。
- 两边都算钱:input 按列表价,output 按模型页实时费率。
- 加上升级的代价:0.8 阈值下有一部分调用会变成人工工作——这一项通常比 token 账单大得多。
- 每季度回看价格;列表费率会动。
RAG chunk 批量重排的 case 把这笔账完整算过一遍;渠道对比那篇也说明了官方渠道定价可能与市场列表价不同。
Token 计费细节:三档价格结构
大多数 API 定价页只列 input 价和 output 价,但包括 OpenRouter 在内的 OpenAI 兼容提供商通常还有第三档:缓存命中 token,按标准 input 价的极小比例计费。三档结构大致如下:
| Token 类型 | 示例费率 | 何时适用 |
|---|---|---|
| 标准 input | $0.0462 / 1M | prompt 前缀首次出现 |
| output | 约 $0.18 / 1M(以模型页为准) | 每个生成的响应 token |
| 缓存命中 input | 约 $0.0046 / 1M(约便宜 10 倍) | 提供商 KV 缓存命中前缀时 |
对 Jev 而言,output 天然短——20–40 个 token 的 JSON 对象,不是散文——output 这一行几乎不会成为成本瓶颈,input 才是大头。200 token 的 prompt、$0.0462/1M,每次调用约 $0.0000092。月调用 500 万次,input 账单落在约 $46。这是起点;如果你的 prompt 有一段共享的长系统提示前缀,缓存命中会进一步压低这个数字。
要看每种 token 实际花了多少,记录每次响应的 usage 字段:
resp = client.chat.completions.create(...)
usage = resp.usage
print(usage.prompt_tokens, usage.completion_tokens,
getattr(usage, "prompt_tokens_details", {}))
prompt_tokens_details(提供商返回时)会拆分缓存命中与未命中的 input token。每周追踪这个比率,能告诉你 prompt 结构是否对缓存友好。基本请求格式见第一次 API 调用,在加入监控埋点之前先跑通基础请求。
延迟分解:首 token 时间与总耗时
延迟有两个分量,对不同场景的影响不同。
首 token 时间(TTFT) 是模型开始返回数据前的等待——由网络往返、提供商侧的队列深度、模型对 prompt 的预填时间共同决定。对 200 token 的短 Jev prompt,正常负载下 TTFT 通常在 200–600 ms 之间,拥堵时可升至 1–2 s。
总完成时间 是 TTFT 加生成耗时。因为 Jev 的 output 极短(20–40 token),生成最多增加 50–150 ms,所以总延迟几乎全由 TTFT 决定。
流式响应即使不改变总耗时,也会改变体感。开启 streaming 连接后,你的应用在 TTFT 到来时就能收到最初几个 JSON token,可以开始部分处理——或者让 loading 动画提前消失——而不必等完整对象。对同步管线步骤(决定后续数据库查询的重排)streaming 没有实质收益;对 UI 界面,它把感知等待时间缩短几百毫秒。
两个分量都量起来:
import time, requests
start = time.perf_counter()
resp = requests.post(url, headers=headers, json=payload, stream=True)
first_chunk_time = None
chunks = []
for chunk in resp.iter_content(chunk_size=None):
if first_chunk_time is None:
first_chunk_time = time.perf_counter() - start
chunks.append(chunk)
total_time = time.perf_counter() - start
print(f"TTFT: {first_chunk_time*1000:.0f}ms 总耗时: {total_time*1000:.0f}ms")
把这两个指标按请求存入可观测性系统;p50 和 p95 TTFT 的差距就是你制定 SLA 的余量所在。
用批处理与非高峰折扣把成本压低 30–50%
两个杠杆能在不改动 prompt 的情况下可靠降低单次调用成本。
批量接口——提供商提供时——一次 HTTP 调用接受一组请求,以更高的吞吐效率处理。如果你通过有此功能的提供商(或 TypeSafe AI 官方渠道)调用 Jev,把 50–200 条请求打包进一次调用,实际单次成本相较逐条异步调用可降 30–50%。查提供商的批量定价页,折扣通常是明文列出的。
非高峰时段适用于有时段定价的提供商。LLM 推理提供商在美国时区夜间流量大幅下降,部分提供商把这部分节省变成 UTC 22:00–06:00 期间约 25–40% 的折扣。对延迟不敏感的工作——夜间内容审核扫描、每日报告生成、存档文档批量重排——把任务调度到这个窗口是最省力的降本手段,无需修改任何代码逻辑。
非紧急批处理任务的实用模式:
import schedule, time
def run_nightly_rerank():
# 02:00 UTC,在非高峰窗口内运行
results = process_batch(pending_items)
store_results(results)
schedule.every().day.at("02:00").do(run_nightly_rerank)
while True:
schedule.run_pending()
time.sleep(60)
两个杠杆叠加——非高峰期间做批处理——一条审核管线的实际费率可以从 $46/月降到 $25 以下,无需任何 prompt 修改。API 接入配置见获取 API Key。
Prompt 缓存:一致性收益与缓存失效条件
Prompt 缓存在提供商基础设施上保留 prompt 前缀的键值表示,后续共享该前缀的请求跳过完整预填计算。收益有两面:缓存命中 token 按标准 input 价约 10% 计费,同时 TTFT 因模型跳过缓存部分而下降。
一致性收益不那么显眼,但同样重要。一段长的共享系统提示——你的评分细则、内容审核策略文本、产品分类体系——每次从缓存命中时都经过完全相同的处理。没有逐 token 重新编码时的浮点非确定性变化。这让前缀在语义上跨调用保持稳定,减少了预填阶段的微妙输出方差。
缓存条目按闲置时间失效,不是按墙钟时间表。具体 TTL 因提供商而异——OpenRouter 未公布保证 TTL——典型值是闲置 5–30 分钟失效。实际影响:如果两批请求间隔 40 分钟,第二批按完整 input 价计费。尽量让批次紧凑,或者如果提供商支持,发一个小的保活请求。
只要缓存前缀中任何一个 token 改变(包括空白符)就会触发失效。常见错误是把时间戳或请求 ID 塞进系统提示文本。把动态内容移到 user turn:
# 错误:每次调用都破坏缓存
system = f"审核策略 v2。请求 ID:{req_id}"
# 正确:静态系统提示保持缓存
system = "审核策略 v2。"
user = f"请求 ID:{req_id}\n内容:{content}"
结合稳定系统提示与逐请求 user 内容的路由模式,见置信度评分与兜底路由。
为什么”更贵的模型 + 更少调用”常比”便宜模型 + 多次重试”更省
当模型给出错误答案时,直觉是用同一模型降低温度重试,或者换一个更便宜的模型处理简单情况。两种策略都感觉像成本控制,但加总起来往往更贵。
重试循环叠加成本,却无法可预测地提升成功率。 如果模型在某类输入上失败,第二次调用大概率以同样方式失败。三次重试各 $0.0000092,每条输入花 $0.0000276,还是没有答案。一次调用高一档、能可靠处理难案例的模型,也许每次 $0.00005——单次更贵,但零重试意味着总计费 token 更少,且结果是确定的。
路由开销有隐藏成本。 双模型架构(简单用便宜模型、难的用贵模型)需要一个分类步骤决定走哪条路。这个分类调用本身消耗 token。如果 20% 的流量是”难”的,每次路由分类花 $0.000002,百万次调用的路由税是 $2——不大,但侵蚀了便宜模型带来的节省。
实用阈值: 如果主模型 p90 成功率低于 85%,在搭建重试或路由层之前,先把单模型升档重新定价。跑两周 A/B,比较总计费 token,不只是单次调用价格:
# 仪表化总 token 花销,不只是单次价格
def call_with_retry(payload, max_retries=3):
total_tokens = 0
for attempt in range(max_retries):
resp = client.chat.completions.create(**payload)
total_tokens += resp.usage.total_tokens
result = parse_response(resp)
if result is not None:
return result, total_tokens
return None, total_tokens # 重试后仍然失败
在诉诸重试之前先排查持续失败的模式,见故障排查指南。
生产中的成本与延迟监控:p50、p95 与每请求成本
关于延迟和成本的直觉在规模下会失效。400 ms 的均值延迟可以与 3,200 ms 的 p95 并存——如果少量请求走了慢路径——而 p95 才是决定下游 SLA 是否达标的数字。类似地,平均每请求成本可能掩盖了一类占月账单 40% 的长 prompt。
任何生产 Jev 集成都值得加入的最小仪表集:
| 指标 | 如何记录 | 为什么重要 |
|---|---|---|
| TTFT(ms) | 流式响应,时间戳首个 chunk | SLA 制定、用户体验 |
| 总延迟(ms) | 时间戳请求开始与响应结束 | 端到端预算 |
| prompt tokens | resp.usage.prompt_tokens | 成本预测 |
| completion tokens | resp.usage.completion_tokens | Jev 中近乎常数 |
| 每请求成本 | token 数 × 单价 | 预算看板 |
| p50 / p95 延迟 | 按 1 小时窗口聚合 | 余量与告警阈值 |
最小记录钩子:
def log_jev_call(resp, elapsed_ms: float):
tokens_in = resp.usage.prompt_tokens
tokens_out = resp.usage.completion_tokens
cost = (tokens_in * 0.0462 + tokens_out * 0.18) / 1_000_000
print(json.dumps({
"latency_ms": elapsed_ms,
"tokens_in": tokens_in,
"tokens_out": tokens_out,
"cost_usd": round(cost, 8),
}))
把输出接入任意时序存储(Datadog、Grafana 乃至 CSV),计算 p50/p95 延迟与每千请求每日成本。当 p95 延迟超过 p50 基线的 3 倍时告警——这个比值预示提供商问题或某类 prompt 长度失控。影响成本核算的渠道价差,见 API 渠道对比。
本文适用版本 Jev 1.13。