Anthropic Python SDKのcount_tokens機能が0.75.0~正式版に変わりました:移行ガイド

Anthropic Python SDKのcount_tokens機能が0.75.0~正式版に変わりました:移行ガイド

こんにちは!

本日は Anthropic Claude API を使用するのに便利な Anthropic Python SDK に関する話題です!

2週間ほど前にわりと大きな変更がありましたので、解説いたします。

はじめに

「あれ、client.count_tokens() が動かない...」

Anthropic Python SDKをアップデートしたら、今まで動いていたトークンカウントのコードがエラーになった。そんな経験をされたLLMエンジニアの方も多いのではないでしょうか。

当社のBestllamのように、LLM統合サービスを開発していると、実際にユーザーがどれほどのトークンを使用しているのかを正確に把握することは非常に重要になります。利用料金の計算、コンテキストウィンドウの管理、そしてユーザーへの使用量の可視化など、トークンカウント機能はサービスの根幹を支える機能です。そのため、この機能が突然動かなくなると影響は小さくありません。

ゆえに本番サービスを提供している場合、pip install で気軽にSDKバージョンを上げてはいけません。

さて、Anthropic Python SDK ですが、実は、0.74.1(2025年11月20日リリース)から0.75.0(2025年11月25日リリース)にかけて大きな変更がありました。

さらに、それより前にもSDKのバージョン0.39.0(2024年11月5日リリース)でトークンカウント機能は大きく刷新されましたので、そこからの更新も本記事の対象としたいと思います。
それでは、これら変更の背景と、新しいAPIへの移行方法を解説していきます!

1.何が変わったのか

廃止されたAPI

バージョン0.38.x以前では、以下のようにトークン数を取得していました。

# 旧API(0.38.x以前)- もう動きません
client = Anthropic()
token_count = client.count_tokens("こんにちは、世界")

シンプルで使いやすいAPIでしたが、バージョン0.39.0でこの client.count_tokens()client.get_tokenizer() は完全に削除されました。

アップデート後にこれらを呼び出すと AttributeError が発生します。

なぜ廃止されたのか→マルチモーダル化に対応するため

理由はClaudeの進化にあります。Claude 3以降、モデルは画像やPDFを理解できるようになりました旧APIはテキスト専用だったため、これらマルチモーダルコンテンツのトークン数を計算できませんでした

また、システムプロンプトやツール定義など、実際のAPI呼び出しで消費される全てのトークンを正確に計算することも困難でした。

Anthropicは中途半端な互換性維持よりも、新しい設計への完全移行を選択してようですね。

2.新しいAPIの使い方

基本形

新しいAPIは client.messages.count_tokens() です。messages.create() とほぼ同じパラメータを受け付けます。

# 新API(0.75.0以降)
from anthropic import Anthropic

client = Anthropic()

response = client.messages.count_tokens(
    model="claude-sonnet-4-5-20250929",
    messages=[
        {"role": "user", "content": "こんにちは、世界"}
    ]
)

print(response.input_tokens)  # トークン数

ただ、重要な違いは三点あります。

まず、model パラメータが必須になりました。トークン化の方法はモデルによって異なるためです。

次に、テキストを直接渡すのではなくメッセージ構造として渡します。最後に、返り値が整数ではなくオブジェクトになり、.input_tokens でトークン数を取得します。

システムプロンプトやツールも計算できる

この新APIの強みは、実際のAPI呼び出しと同じ構造でトークン数を計算できる点です。

response = client.messages.count_tokens(
    model="claude-sonnet-4-5-20250929",
    system="あなたは親切なアシスタントです。",
    messages=[
        {"role": "user", "content": "こんにちは"},
        {"role": "assistant", "content": "こんにちは!何かお手伝いできますか?"},
        {"role": "user", "content": "天気を教えて"}
    ],
    tools=[
        {
            "name": "get_weather",
            "description": "天気を取得します",
            "input_schema": {
                "type": "object",
                "properties": {
                    "location": {"type": "string"}
                },
                "required": ["location"]
            }
        }
    ]
)

response.input_tokens でトークン数を取得できます

# トークン数を取得
print(response.input_tokens)  # 例: 142

システムプロンプト、会話履歴、ツール定義、全てのトークン数が正確に計算されます。

画像やPDFにも対応

マルチモーダルコンテンツのトークン数も計算できます。これが一番重要なポイントでしょう。

import base64

with open("image.png", "rb") as f:
    image_data = base64.standard_b64encode(f.read()).decode("utf-8")

response = client.messages.count_tokens(
    model="claude-sonnet-4-5-20250929",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image",
                    "source": {
                        "type": "base64",
                        "media_type": "image/png",
                        "data": image_data
                    }
                },
                {"type": "text", "text": "この画像を説明してください"}
            ]
        }
    ]
)

print(response.input_tokens)  # 画像サイズに応じたトークン数が返る

3.移行の手順

ステップ1:SDKをアップデートする

まず、SDKを0.75.0以上(2025年12月9日、ブログ執筆時点で最新)にアップデートしてください。

pip install anthropic>=0.75.0

実は冒頭にも書きましたが、0.39.0から0.74.xの間は client.beta.messages.count_tokens() という形式でベータ提供されていました。

# ベータ版API(0.39.0〜0.74.x)- 2025/12/9現在は非推奨
response = client.beta.messages.count_tokens(
    betas=["token-counting-2024-11-01"],  # ベータヘッダーが必要だった
    model="claude-3-5-sonnet-20241022",
    messages=[
        {"role": "user", "content": "こんにちは"}
    ]
)
print(response.input_tokens)

0.75.0以降は正式版として client.messages.count_tokens() が使えます。ベータヘッダーの指定も不要になりました。

# 正式版API(0.75.0以降)- 現在の推奨
response = client.messages.count_tokens(
    model="claude-sonnet-4-5-20250929",
    messages=[
        {"role": "user", "content": "こんにちは"}
    ]
)
print(response.input_tokens)

ステップ2:コードを書き換える

旧コードと新コードの対応を示します。

# 旧:シンプルなテキスト
count = client.count_tokens("Hello")

# 新:メッセージ構造で渡す
response = client.messages.count_tokens(
    model="claude-sonnet-4-5-20250929",
    messages=[{"role": "user", "content": "Hello"}]
)
count = response.input_tokens

あらかじめ、こういうヘルパー関数を作っておくと移行が楽になります。

def count_tokens(client, text, model="claude-sonnet-4-5-20250929"):
    """旧APIと同じ感覚で使えるヘルパー関数"""
    response = client.messages.count_tokens(
        model=model,
        messages=[{"role": "user", "content": text}]
    )
    return response.input_tokens

ステップ3:requirements.txtを更新する

本番環境では、バージョンを明示的に固定することをお勧めします。

anthropic>=0.75.0,<1.0.0

4.FAQ

「0.39.0のままだと問題ある?」

0.39.0でも動きますが、client.beta.messages.count_tokens() という形式でベータヘッダーの指定が必要です。0.75.0以降なら正式版として安定したAPIが使えるため、こちらをお勧めします。

「APIコールとして課金されますか?」

count_tokens はAPIリクエストとしてカウントされますが、トークン課金はされません。ただし、レート制限の対象にはなる可能性があるため、大量のリクエストを送る場合は注意しましょう。

「非同期で使えますか?」

使えます。AsyncAnthropic クライアントで同じメソッドを await 付きで呼び出してください。

from anthropic import AsyncAnthropic

client = AsyncAnthropic()
response = await client.messages.count_tokens(
    model="claude-sonnet-4-5-20250929",
    messages=[{"role": "user", "content": "Hello"}]
)

おわりに

トークンカウントAPIの変更は、Claudeのマルチモーダル化という大きな進化に伴うものでした。マルチモーダル化は正常進化だと思っていましたが、案外APIは目の前の仕様(テキストのみのやりとり)のみ設計思想のベースにしていたことが逆に意外でしたね。

新しいAPIは、テキストだけでなく画像やPDF、ツール定義まで含めた正確なトークン数を計算できます。

移行作業は少し手間がかかりますが、より正確で実用的なトークン管理が可能になります。この機会にぜひアップデートしてみてください。

それでは、また次回お会いしましょう!

Read more

楽観的ロック vs 悲観的ロック:実際のトラブルから学ぶ排他制御

楽観的ロック vs 悲観的ロック:実際のトラブルから学ぶ排他制御

こんにちは! Qualitegプロダクト開発部です! 「楽観的ロックを実装したのに、まだ競合エラーが出るんですけど...」 これは私たちが実際に経験したことです。 本記事では、楽観的ロックと悲観的ロックの違いを、実際に発生したトラブルを通じて解説します。 抽象的な説明ではなく、 「なぜそれが必要なのか」「どんな問題を解決できるのか」 を実感できる内容を目指します。 目次 1. 問題の背景:並列処理で謎のエラー 2. ロックなしの世界:なぜ競合が起きるのか 3. 楽観的ロックの導入:期待と現実 4. 楽観的ロックの限界:解決できなかった問題 5. 悲観的ロックによる解決 6. 実装時のハマりポイント 7. どちらを選ぶべきか:判断基準 8. まとめ 1. 問題の背景:並列処理で謎のエラー 1.1 システムの概要 私たちが開発していたのは、 複数のワークスペースを切り替えて使用するAPIサーバー でした。 当社AI関係のプロダクトの一部だったのですが、結合テスト兼負荷テストを実行すると、まれに発生してしまっていました。 ユーザーは複数のワーキン

By Qualiteg プロダクト開発部
企業セキュリティはなぜ複雑になったのか? 〜AD+Proxyの時代から現代のクラウド対応まで〜

企業セキュリティはなぜ複雑になったのか? 〜AD+Proxyの時代から現代のクラウド対応まで〜

こんにちは! ChatGPTやClaudeといった生成AIサービスが業務に浸透し始めた今、 「AIに機密情報を送ってしまうリスク」 が新たなセキュリティ課題として浮上しています。 この課題に向き合う中で、私たちは改めて「企業のセキュリティアーキテクチャはどう変遷してきたのか」を振り返る機会がありました。 すると、ある疑問が浮かんできます。 「なんでこんなに複雑になってるんだっけ?」 企業のセキュリティ担当者なら、一度は思ったことがあるのではないでしょうか。 アルファベット3〜4文字の製品が乱立し、それぞれが微妙に重複した機能を持ち、設定は複雑化し、コストは膨らみ続けています。 当社ではAIセキュリティ関連プロダクトをご提供しておりますが、AI時代のセキュリティを考える上でも、この歴史を理解することは重要ではないかと考えました。 本記事では、企業ネットワークセキュリティの変遷を振り返りながら、「なぜこうなったのか」を整理してみたいと思います。 第1章:観測点を集約できた時代 ― オンプレAD + Proxy(〜2010年代前半) 統制しやすかったモデル かつ

By Qualiteg コンサルティング, Qualiteg AIセキュリティチーム
【IT温故知新】WS-* の栄光と黄昏:エンタープライズITはいかにして「実装」に敗北したか

【IT温故知新】WS-* の栄光と黄昏:エンタープライズITはいかにして「実装」に敗北したか

こんにちは。 —— 2003年のSOAから、2026年のAIへ —— この記事は、過去の技術動向を振り返り、そこから学べる教訓について考察してみたものです。 歴史は常に、後から見れば明らかなことが、当時は見えなかったという教訓を与えてくれます。 そして、今私たちが「正しい」と信じていることもまた、20年後には違う評価を受けているかもしれません。 だからこそ、振り返ることには意味があるとおもいます。同じ轍を踏まないために。 はじめに:20年前の熱狂を覚えていますか 2000年代初頭。 私はSOA(サービス指向アーキテクチャ)に本気で取り組んでいました。 当時、SOAは「次世代のエンタープライズアーキテクチャ」として、業界全体が熱狂していました。 カンファレンスに行けば満員御礼、ベンダーのブースには人だかり、書店にも関連の書籍がちらほらと。 SOAP、SOAP with attachments、JAX-RPC、WS-Security、WS-ReliableMessaging、WS-AtomicTransaction... 仕様書の山と格闘する日々でした。 あれから

By Qualiteg コンサルティング
DockerビルドでPythonをソースからビルドするとGCCがSegmentation faultする話

DockerビルドでPythonをソースからビルドするとGCCがSegmentation faultする話

こんにちは!Qualitegプロダクト開発部です! 本日は Docker環境でPythonをソースからビルドした際に発生した、GCCの内部コンパイラエラー(Segmentation fault) について共有します。 一見すると「リソース不足」や「Docker特有の問題」に見えますが、実際には PGO(Profile Guided Optimization)とLTO(Link Time Optimization)を同時に有効にした場合に、GCC自身がクラッシュするケースでした。 ただ、今回はDockerによって問題が隠れやすいという点もきづいたので、あえてDockerを織り交ぜた構成でのPythonソースビルドとGCCクラッシュについて実際に発生した題材をもとに共有させていただこうとおもいます 同様の構成でビルドしている方の参考になれば幸いです TL;DR * Docker内でPythonを --enable-optimizations --with-lto 付きでソースビルドすると GCCが internal compiler error(Segmentati

By Qualiteg プロダクト開発部