OpenAI API 的 token 怎么算、怎么估算费用:input_tokens 计数接口、tiktoken 和隐藏的输出 token

发请求前想知道会用多少 token?官方有 Responses 的 input_tokens 计数接口,能把文字、图片、文件、工具定义一起算准;本地 tiktoken 只适合纯文本。本文给 Python 和 Node 示例,讲输出 token 为什么可能比看到的多,以及怎么估算费用。

NNathaniel bigo··原创首发·AI 辅助撰写
9 分钟读完
资料核对于 2026-11-05 · 依据官方文档与公开资料整理 其他 账号
本文根据 OpenAI 官方《Counting tokens》整理,资料核对于 2026-11-05。配图为本站整理的示意图,不是界面截图。代码里的模型名取自官方当天示例,请以官方模型页为准。本站(bigolab.com)不是 OpenAI 官方网站。API 是按用量计费的独立服务,与 ChatGPT 订阅分开计算,Key 的获取见 /guides/openai-api-key。

适用于谁

  • 想在发请求之前知道提示词会占多少 token 的开发者;
  • 做预算、想估算一次调用大概多少钱的人;
  • 发现 output_tokens 比屏幕上看到的文字多,想弄明白为什么的人。

结论先说

  1. token 是模型处理文本的计量单位,计费和上下文限制都按它算。
  2. 官方提供了专门的计数接口:POST /v1/responses/input_tokens,参数和 responses.create 一样,返回这个请求会用多少输入 token。
  3. 本地分词器只适合纯文本。 官方说图片和文件它不支持,“字符数除以 4”这类估算不准,工具定义和 schema 的额外 token 也很难本地数清。
  4. 计数包含格式化 token,比如消息的角色和边界,所以会比你只对正文分词的结果多。
  5. 输出 token 可能比你看到的多:官方说计入的是模型生成的全部 token,包括不可见的。
  6. 费用 = 用量 × 单价,单价以官方价格页当天为准,见 /guides/openai-api-price-official-table。

本地估算与官方计数接口的对比:文字、图片文件、工具、模型行为、是否要发请求

图:本站根据 OpenAI 官方《Counting tokens》 整理的示意图

一、用计数接口数输入 token

Python(先 pip install openai,密钥设置见 /guides/openai-api-python-quickstart):

python
from openai import OpenAI

client = OpenAI()

response = client.responses.input_tokens.count(
    model="gpt-6-astra",  # 以官方模型页当天为准
    input="Tell me a joke.",
)
print(response.input_tokens)

Node.js(保存为 .mjs):

javascript
import OpenAI from "openai";

const client = new OpenAI();

const response = await client.responses.inputTokens.count({
  model: "gpt-6-astra", // 以官方模型页当天为准
  input: "Tell me a joke.",
});

console.log(response.input_tokens);

官方说,这个接口接受和 Responses API 相同的输入格式:文字、消息、图片、文件、工具、对话都可以传,返回的是模型实际会收到的精确数量。所以最稳妥的用法是:把你准备发给 responses.create 的那份参数原样拿来调用 count。

带系统指令和多轮对话

指令用 instructions,多轮对话用消息数组,都和正式请求一样:

python
response = client.responses.input_tokens.count(
    model="gpt-6-astra",
    instructions="You are a helpful assistant that explains concepts simply.",
    input=[
        {"role": "user", "content": "What is 2 + 2?"},
        {"role": "assistant", "content": "2 + 2 equals 4."},
        {"role": "user", "content": "What about 3 + 3?"},
    ],
)
print(response.input_tokens)

带图片

图片按尺寸和 detail 档位折算 token。官方说计数接口返回精确数,不需要猜;图片可以用 file_id,也可以用 image_url(网址或 Base64 数据 URL)。传图方式见 /guides/openai-api-image-input。

javascript
const response = await client.responses.inputTokens.count({
  model: "gpt-6-astra",
  input: [
    {
      role: "user",
      content: [
        { type: "input_image", image_url: "https://example.com/chart.png", detail: "auto" },
        { type: "input_text", text: "Summarize this chart." },
      ],
    },
  ],
});

带工具

函数 schema、MCP 服务器这类工具定义也会占上下文,官方建议把它们和输入一起数。函数定义怎么写见 /guides/openai-api-function-calling:

python
response = client.responses.input_tokens.count(
    model="gpt-6-astra",
    tools=[
        {
            "type": "function",
            "name": "get_weather",
            "description": "Get the current weather in a location",
            "parameters": {
                "type": "object",
                "properties": {"location": {"type": "string"}},
                "required": ["location"],
            },
        }
    ],
    input="What is the weather in San Francisco?",
)
print(response.input_tokens)

带文件

官方说文件输入目前支持 PDF,可传 file_id、file_url 或 file_data,和 responses.create 一样;计数反映模型完整处理后的输入。

二、为什么不能只用 tiktoken

请求前估算费用的步骤:同样内容调用计数、估算输出、查单价、相乘

图:本站根据 OpenAI 官方《Counting tokens》 整理的示意图,步骤顺序为本站归纳

tiktoken 是 OpenAI 的分词库,适合在本地快速数纯文本。官方的向量嵌入文档给了示例:

python
import tiktoken

def num_tokens_from_string(string: str, encoding_name: str) -> int:
    encoding = tiktoken.get_encoding(encoding_name)
    return len(encoding.encode(string))

print(num_tokens_from_string("tiktoken is great!", "cl100k_base"))

官方在向量模型那一页说,第三代向量模型(如 text-embedding-3-small)用 cl100k_base 编码,向量的用法见 /guides/openai-api-embeddings。至于聊天模型该用哪种编码,官方这几页没有写,本文不下结论。

计数接口那页列出了本地分词的三个局限:

  • 图片和文件不被支持,用“字符数除以 4”估算是不准的;
  • 工具和 schema 会增加难以在本地数清的 token;
  • 模型相关的行为(官方举例:推理、缓存)可能改变分词。

所以有图片、文件、工具时,用计数接口;只是纯文本、要离线粗算,才用 tiktoken。

三、输出 token:比你看到的多

官方在「Understand output token counts」里说明:

  • 报告的输出 token 用量包括模型生成的所有 token,不只是响应里看得见的文字;
  • Responses API 里这个总数叫 output_tokens,Chat Completions 里叫 completion_tokens;
  • 一些模型(官方点名包括 GPT-5 系列)会生成用于格式化或分隔响应通道、工具调用等结构的 token,这些 token 不出现在消息内容或 logprobs 里,也不一定单独列出。因此报告的输出 token 可能高于可见 token,即使 reasoning_tokens 是 0;
  • max_output_tokens 和 max_completion_tokens 限制的是模型生成的所有 token,包括不可见的。不可见 token 的数量随模型和响应形态而变,不要假设固定差值;需要特定长度的可见输出时,给限制留出余量。

这就解释了一种常见的困惑:“我只让它回一句话,为什么 output_tokens 比字数多?”以及“max_output_tokens 设得刚好够,输出却被截断”。后一种情况的处理,参见 /guides/openai-api-structured-outputs 里 incomplete 状态的判断。

四、怎么估算一次调用的费用

本站归纳的流程(价格数字请自行到官方页面取,本文不写):

  1. 用计数接口,传和正式请求完全相同的内容,得到 input_tokens;
  2. 估算输出:输出按实际生成的量计,估一个上限并用 max_output_tokens 限制,同时留出余量;
  3. 到官方价格页查当天的输入、输出单价,见 /guides/openai-api-price-official-table;
  4. 费用大致 = 输入 token × 输入单价 + 输出 token × 输出单价;
  5. 缓存、批处理等折扣会让实际费用不同,最终以响应里的 usage 和账单为准,账单入口见 /guides/openai-api-pricing-billing。

批量任务想省钱,可以看 /guides/openai-api-batch 里官方写明的折扣规则。

常见问题

Q:计数接口本身收费吗?

官方这一页没有写它的计费情况,本文不下结论,请以官方价格页和 API 参考为准。

Q:计数接口返回的和账单一致吗?

官方说返回的是“模型会收到的精确数量”,指的是输入。实际账单还包括输出 token,以及缓存等因素,以账单为准。

Q:图片到底算多少 token?

官方图片页说明了不同模型的计算规则,并提供了 Image input cost calculator,详见 /guides/openai-api-image-input。

参考资料

  • OpenAI 官方:Counting tokens — https://developers.openai.com/api/docs/guides/token-counting
  • OpenAI 官方:Vector embeddings — https://developers.openai.com/api/docs/guides/embeddings

Nathaniel 的更多内容

  1. 01

    Claude Code 在 Windows 上的常见坑:Git Bash 还是 PowerShell、路径反斜杠、假报错、WSL 怎么选

    Windows 上用 Claude Code,装好之后最容易踩的是:用哪个 shell、路径写法不一致、grep 没匹配就报错、钩子没生效、WSL 和原生怎么选。本文逐条按官方文档整理原因和处理办法,附三段提示词和一张对照表。

    Claude0
  2. 02

    Claude Code Hooks 实战「提交前自动跑测试」:PreToolUse 拦住 git commit,测试不过就退出码 2,附 Windows 注意点

    只写一个完整例子:让 Claude Code 每次要执行 git commit 之前,先自动跑项目测试,没通过就拦下并把输出交给它修。本文按官方 Hooks 文档给出脚本、settings.json 配置、测试方法、排错和 Windows 的两处坑。

    Claude0
  3. 03

    Claude Code 自定义斜杠命令与 Skill 实战:从零写一个「生成更新日志」的 /release-notes,含传参、预执行命令和调试

    概念看过了,还是不知道从哪下手?本文按 Claude Code 官方「Extend Claude with skills」写一个完整可用的例子:用 /release-notes 根据 git 记录生成更新日志,覆盖目录、frontmatter、传参、预执行命令、预授权和调试。

    Claude0
  4. 04

    Claude Code 部署网站:先写 Dockerfile 和 compose 在本机跑通,再按清单上云服务器,别让它直接改线上

    想让 Claude Code 帮你把网站部署到云服务器。本文只写通用做法,按 Docker 官方文档讲:让它写 Dockerfile、.dockerignore 和 compose,在本机跑通,端口和数据卷怎么设,再给出上线清单,并说明为什么不要让它直接动线上机器。

    Claude0
  5. 05

    Claude Code 写爬虫与数据清洗:先查 robots.txt 和网站条款,控制频率,原始数据留一份再清洗

    想让 Claude Code 写爬虫抓数据再清洗。本文先讲合规:robots.txt 不是授权也不是安全措施、网站条款要自己读;再讲怎么用 Python 标准库检查规则、小样本先试、保存原始数据,以及用 pandas 清洗,附四段提示词。

    Claude0
  6. 06

    Claude Code 写 Chrome 扩展:按 Manifest V3 起步,加载未打包的扩展,改了哪些文件要重新加载

    想让 Claude Code 帮你写一个 Chrome 扩展。本文按 Chrome 官方扩展文档讲:manifest.json 的最小写法、在 chrome://extensions 加载未打包的扩展、哪些改动要刷新、怎么看控制台和报错,再给四段提示词,以及权限要尽量少。

    Claude0

同产品的其他教程

  1. 01

    OpenAI API Node.js / TypeScript 快速上手:npm install openai、example.mjs 第一个请求,到流式、函数调用、联网搜索

    用 Node.js 调 OpenAI API:设置 OPENAI_API_KEY 环境变量,npm install openai,新建 example.mjs,用 client.responses.create 发出第一个请求。并列出图片、文件、流式、函数调用、联网搜索和错误捕获的 Node 写法。

    ChatGPT0
  2. 02

    OpenAI API 用量层级(usage tiers)与速率限制怎么提升:Free、Build、Launch、Grow 和后台 Limits 页

    OpenAI API 的限速不是固定的:官方按累计购买额度把组织分成 Free、Build、Launch、Grow 四个层级,达到门槛自动升级。本文讲 RPM、TPM 等指标、怎么在后台查自己的限额、响应头怎么读、花费上限和限速的区别,以及怎么让限额变得够用。

    ChatGPT0
  3. 03

    OpenAI API 报错 400、401、403、404、429、500、503 怎么排查:按官方错误码页逐个看原因和解决办法

    调用 OpenAI API 返回 400、401、403、404、429、500、503,各自什么意思?本文按官方 Error codes 页,每个状态码一节,写清官方给的原因和解决办法,并说明 404 在官方页面里的位置、429 的六种情形,附 Python 和 Node 的错误捕获写法。

    ChatGPT0
  4. 04

    OpenAI Realtime API 是什么:语音到语音会话、WebRTC 与 WebSocket、临时密钥和事件机制

    Realtime API 让模型直接处理音频,做可以随时打断的语音助手。本文按官方文档讲它是什么、什么时候用、浏览器接入的流程、session 与事件、可用声音、60 分钟会话上限、安全标识,以及它和转写、文字转语音的分工。

    ChatGPT0
  5. 05

    OpenAI 图像生成 API 怎么用:gpt-image 系列、images.generate 与 Responses 工具、尺寸质量和遮罩编辑

    用 OpenAI API 生成或编辑图片,有 Image API 和 Responses 里的 image_generation 工具两条路。本文按官方文档给 Python 和 Node 示例,讲 gpt-image 模型选择、尺寸质量格式参数、遮罩编辑、被拦截时的错误处理,以及需要组织验证的提醒。

    ChatGPT0
  6. 06

    OpenAI API 语音转文字和文字转语音怎么调:gpt-transcribe 转写、25 MB 限制,以及多个语音模型的停服日期

    用 OpenAI API 把录音转成文字,官方现在推荐 gpt-transcribe;文字转语音的 speech 接口则已被官方标为弃用。本文给 Python 和 Node 示例,讲格式、25 MB 限制、prompt 与 keywords,并写明官方公布的停服日期。

    ChatGPT0

0 条评论

登录 后参与评论

还没有评论,来抢沙发~