プロンプト送信前にトークン数を計測する Universal Token Counter (UTC) を公開しました
LLM を使う時、生成そのものより前に気になることがあります。
- この入力は何トークンあるのか
- 上限に近いのか
- どれくらいコストがかかりそうか
- 日本語だとどのくらい増えるのか
こうした確認は、実際の運用ではかなり重要です。
そこで、OpenAI 互換モデル向けにトークン数を計測する API として
Universal Token Counter (UTC) を公開しました。
- Docs: https://apiron-lab.github.io/apis/universal-token-counter.html
- RapidAPI: https://rapidapi.com/APIronlab/api/universal-token-counter-utc
- GitHub: https://github.com/APIron-lab/Universal-Token-Counter
なぜトークン数を API として切り出したのか
トークン数の計測自体は、ライブラリを直接使えばできる場面も多いです。
ただ、実際の開発や運用では、次のような事情があります。
- 複数環境で同じ計測結果を使いたい
- サーバ側で一元的に見積もりたい
- ログやメトリクスに組み込みたい
- UI や管理画面から簡単に呼びたい
- LLM を呼ぶ前段で共通チェックを入れたい
つまり、単なるローカル関数ではなく、どこからでも呼べるトークン計測の窓口
があると便利です。
UTC は、そうした用途を想定して作った API です。
この API で何ができるのか
Universal Token Counter (UTC) は、OpenAI 互換モデルを指定してテキストの
トークン数を計測する API です。
主な役割は次の通りです。
- テキストのトークン数を計測する
- モデルごとのエンコーディング差を吸収する
- コスト試算の前提値を取得する
- 多言語テキストの入力サイズを確認する
- ログや監視で使いやすい形で返す
特に、日本語や多言語テキストで「見た目よりトークン数が多い」問題を事前に
把握したい場面に向いています。
対応モデル
UTC では、モデル名を受け取って対応するエンコーディングで計測します。
README 時点では、少なくとも次のモデルが例示されています。
gpt-4ogpt-4.1gpt-4.1-minigpt-4-turbogpt-4gpt-3.5-turbo
例えば、
-
gpt-4o/gpt-4.1系はo200k_base -
gpt-4/gpt-3.5-turbo系はcl100k_base
という形で扱われます。
API のイメージ
エンドポイントは以下です。
POST /utc/v0/token-count
リクエスト例:
{
"model": "gpt-4o",
"text": "これはテストです"
}
レスポンス例:
{
"result": {
"model": "gpt-4o",
"encoding": "o200k_base",
"char_count": 12,
"token_count": 9,
"token_per_char": 0.75
},
"meta": {
"input_language": "en",
"input_size_bytes": 36,
"token_density": 0.25,
"model_family": "openai",
"processing_time_ms": 1.42,
"utc_timestamp": "2025-01-01T00:00:00Z",
"version": "0.1.0"
}
}
result と meta を分けているので、
- 実際のトークン数
- 使用エンコーディング
- 文字数
- token density
- 入力言語
- 実行時間
を分けて扱いやすくしています。
Python から使う例
Python から使うなら、例えば次のような形です。
import requests
payload = {
"model": "gpt-4o",
"text": "これはテストです",
}
res = requests.post(
"https://universal-token-counter-utc.p.rapidapi.com/utc/v0/token-count",
json=payload,
headers={
"x-rapidapi-key": "YOUR_RAPIDAPI_KEY",
"x-rapidapi-host": "universal-token-counter-utc.p.rapidapi.com"
}
)
print(res.json())
実際には、
- 送信前のプロンプトチェック
- バッチ処理前のサイズ確認
- 管理画面上でのコスト見積もり
- ログや監視の前段
のような使い方が自然だと思います。
Core-first で作っているのも特徴
このリポジトリは、FastAPI の HTTP API だけでなく、Core ロジックを
分離した構成になっています。
つまり、
-
coreで純粋なトークン計測ロジックを持ち -
backend.fastapi_appで HTTP API を提供し - 将来的に Lambda や他の実行形態にも載せやすい
という形です。
単に「API が叩ける」だけでなく、実装としても再利用しやすい構造を意識しています。
この API を作った理由
LLM の利用では、「何を送るか」と同じくらい「どれだけ送るか」も重要です。
特に日本語では、
- 見た目よりトークン数が多い
- 英語より感覚が掴みにくい
- 長文化すると急にコストが跳ねる
- モデルごとに印象が変わる
といったことが起きます。
にもかかわらず、トークン数の確認は後回しにされがちです。
結果として、送ってから気づくことになります。
それなら、送る前に API で測れるようにしてしまった方が扱いやすい。
そう考えて UTC を作りました。
公開先
- Docs: https://apiron-lab.github.io/apis/universal-token-counter.html
- RapidAPI: https://rapidapi.com/APIronlab/api/universal-token-counter-utc
- GitHub: https://github.com/APIron-lab/Universal-Token-Counter
- APIron Lab: https://apiron-lab.github.io/
まとめ
Universal Token Counter (UTC) は、LLM に送る前のトークン数を計測するための API です。
OpenAI 互換モデルを前提に、
- トークン数の見積もり
- コスト試算
- 上限超過チェック
- 多言語入力のサイズ確認
をしやすくすることを狙っています。
トークン数の確認は地味ですが、LLM 運用ではかなり重要です。
だからこそ、これも API として独立させる価値があると考えています。