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 條評論

登入 後參與評論

還沒有評論,來搶沙發~