计费 · 排错
AI API 费用怎么算?Tikway Token 计费与报错排查
更新日期:
比较 AI API 价格,先统一计费单位,再根据实际用量复算。本文以 Tikway 的模型目录和三种请求协议为例,说明普通文本费用、批量预算、缓存拆分,以及 429 和流式失败的处理方法。配套计算器只做本地算术,不读取 Key、不发送 API 请求。
1. 把单价换成相同单位
想先看预算,可以直接使用免费网页费用计算器:从目录选择文本模型,填写每次输入、输出 Token 与调用次数,无需注册即可计算和分享方案。它估算普通文本基础费用,缓存、多模态和账户规则需要另外核对。
在模型目录打开具体型号,确认输入与输出价格、货币、计费单位,以及适用的缓存或其他项目。每千 Token、每百万 Token、每张图片和每秒视频不能直接比较。
如果两项文本价格分别按千 Token 和百万 Token 标价,应先换成同一单位。比如 0.002 / 千 Token = 2 / 百万 Token,前提是两者使用同一货币。币种不同时还需要明确汇率与换算时间;下面的计算器不会自动换汇。
Token 不等于字符数。输入包含系统指令、历史消息等实际提交内容;输出统计也可能涉及可见回答之外的生成用量。预算可以用模型对应的分词器估计,结算则以实际用量及账户账单核对。
2. 单次请求与批量预算怎么算
本节所有价格和用量都是假设数据,仅演示公式,不是 Tikway 的实时报价或实际调用记录。
假设输入价为 2 美元 / 百万 Token,输出价为 10 美元 / 百万 Token,一次请求输入 1,000 Token、输出 500 Token:
输入费用 = 1,000 / 1,000,000 × 2 = 0.002 美元
输出费用 = 500 / 1,000,000 × 10 = 0.005 美元
单次合计 = 0.007 美元
相同用量重复 1,000 次 = 7 美元
使用配套计算器,先安装 Python 3.10 或更新版本。它仅使用标准库,无需安装依赖。在脚本目录执行:
python token-cost.py --input-tokens 1000 --output-tokens 500 --input-price 2 --output-price 10 --requests 1000
默认价格单位为 1,000,000 Token。对应单次估算为 0.007,批量估算为 7;输出可能保留小数末尾的零。这些数值使用你输入价格的同一货币,没有自动加入税费、换汇或其他收费项目。
如果价格按千 Token 标示,明确设置单位:
python token-cost.py --input-tokens 1000 --output-tokens 500 --input-price 0.002 --output-price 0.010 --price-unit-tokens 1000 --requests 1000
两条命令结果相同。输入、输出价格必须已经统一货币与 Token 单位;请求数和单位须为正整数,用量为非负整数,价格须为有限的非负数字。--requests 只是“相同用量重复若干次”的估算,实际批量请求长度不同,应逐条或按样本分布计算。
3. 三种协议的用量字段有什么不同
| 协议 | 常见字段 | 复算时容易漏掉的内容 |
|---|---|---|
| OpenAI Chat Completions | usage.prompt_tokens、usage.completion_tokens |
缓存或推理细分可能在 details 中,先确认是否已包含在总量中,避免重复相加。 |
| Anthropic Messages | usage.input_tokens、usage.output_tokens |
缓存读取与创建可能单列为 cache_read_input_tokens、cache_creation_input_tokens,应按各自价格核对。 |
| Gemini generateContent | usageMetadata.promptTokenCount、candidatesTokenCount、totalTokenCount |
可能另有 cachedContentTokenCount、thoughtsTokenCount;可见文字长度不能代替完整计费用量。 |
表格说明常见字段,不代表每个型号都会返回全部统计。缓存字段有时是总输入的一部分,有时与普通输入分列;先确认协议和模型的字段定义,再与账单项目对应。尤其不要只把 Gemini 可见候选文本的用量当作全部输出费用,也不要无条件把 totalTokenCount 乘输入单价。
4. 缓存费用怎样拆分,才不会重复算
以下仍是假设价格:普通输入 2 / 百万 Token,缓存读取 0.2 / 百万 Token,输出 10 / 百万 Token。明确已知某请求包含 1,000 普通输入 + 3,000 缓存读取 + 500 输出,且本例没有缓存写入或其他项目:
普通输入 = 1,000 / 1,000,000 × 2 = 0.002
缓存读取 = 3,000 / 1,000,000 × 0.2 = 0.0006
输出 = 500 / 1,000,000 × 10 = 0.005
合计 = 0.0076(同一货币)
这里 4,000 个总输入已经被拆成两类,不能再额外收取一遍 4,000 个普通输入。配套计算器只算普通输入和输出,不自动拆分缓存,因此这类请求应先识别各分类,再分别计算和合并。
缓存写入、读取是否收费以及有效期,以当前模型规则为准。图像可能按图片或 Token 收费,视频可能按时长及分辨率收费;本篇的文本公式不能直接套用于所有多模态任务。
5. 排错先记录什么,429 要怎样区分
保存 HTTP 状态、协议、模型标识、发生时间、错误字段,以及响应头 x-request-id(如果有)。这些信息有助于定位请求;公开讨论时应去掉 Key、私有提示词和用户内容。
错误结构也有协议差异。OpenAI / Anthropic 风格的错误可能使用字符串 error.code、error.type;Gemini 风格常用数字 error.code 与字符串 error.status,不能直接把两种结构混用。
| 现象或具体错误 | 处理方向 |
|---|---|
鉴权失败或 invalid_api_key |
确认 Key 有效、无空白,并匹配所用协议的鉴权头。 |
| 模型/参数不支持 | 核对完整模型标识、协议和该型号参数;先移除不必要的可选字段。 |
429 + insufficient_balance |
检查余额和对应费用;等待或反复重试通常不能解决余额问题。 |
429 + requests_per_minute_exceeded |
降低并发与请求频率;按响应和账户限制安排后续请求。 |
Gemini 429 + RESOURCE_EXHAUSTED |
联合查看消息、账户余额和使用频率;该状态本身不能区分余额与限流。 |
| 超时或 5xx | 结合请求 ID、调用记录和错误内容判断状态,再决定是否有限重试。 |
| 流式已输出文字后出错 | 记录为未完成,保留已收到内容及错误事件;HTTP 成功不代表整条流成功。 |
上表中的具体字符串用于识别网关常见错误,实际响应还应结合错误码文档和消息判断。不要把所有 429 都写成限流,也不要对鉴权、参数或余额错误无限重试。
客户端超时无法单独证明服务端没有处理请求。重试前核对调用记录,避免把同一个任务无条件再发送一次;也不能默认所有失败请求都不产生费用。
6. 让预算控制与任务质量一起比较
先固定一组任务样例,再记录每次模型、输入输出用量、完成情况及费用。比较至少包括:答案是否完成任务、是否截断、平均费用,以及较长回答的费用。只看最短示例的成本,容易低估实际用量。
可以逐项尝试减少无关历史消息、精简重复系统指令、设置型号支持的输出上限。切换模型时仍要重新检查任务质量与参数支持,不能仅凭价格更低就假定效果相同。