Claude APIの基本はわかった。次は実際に使えるものを作りたい!」そんなあなたへ向けた記事です。🎉

この記事では、APIキー取得・.env設定・マルチターン会話の基礎は省略し、「動くミニアプリを作る」ことに特化して解説します。文章要約ツール・翻訳ツール・コードレビューBotを関数化パターンで実装しながら、コスト管理の実践的な考え方までまとめます。

入門部分からおさらいしたい方は、先にこちらをどうぞ👇

Claude APIをPythonで使う完全入門ガイド|初心者でもAIチャットアプリが作れる!

📋 この記事の対象読者・前提知識

Python AI application development
Python AI application development / Photo by Pixabay via Pexels
  • ✅ Claude APIのセットアップが済んでいる方(anthropicライブラリ導入・APIキー設定済み)
  • ✅ Pythonの関数(def文)・辞書・リストが使える方
  • ✅ 「ただのチャットじゃなく、実用ツールを作りたい」方
  • ⚠️ 難易度:初〜中級者向け(実践寄り)

前提として、以下の環境が整っている想定で進めます。

pip install anthropic python-dotenv

APIキーは .env ファイルで管理し、os.getenv("ANTHROPIC_API_KEY") で読み込む方式です。

🏗️ 関数化パターンの考え方:再利用できるAI部品を作る

実践ミニアプリを作るとき、「1タスク=1関数」に分けて実装するのが鉄則です。Claude APIへのリクエストを関数の中に閉じ込めることで、呼び出し側のコードがスッキリし、後から改修もしやすくなります。

基本の雛形はこうなります👇

import anthropic
from dotenv import load_dotenv
import os

load_dotenv()
client = anthropic.Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))

def call_claude(prompt: str, system: str = "", max_tokens: int = 512) -> str:
    """Claude APIへの汎用呼び出し関数"""
    messages = [{"role": "user", "content": prompt}]
    kwargs = {
        "model": "claude-opus-5",
        "max_tokens": max_tokens,
        "messages": messages,
    }
    if system:
        kwargs["system"] = system
    response = client.messages.create(**kwargs)
    return response.content[0].text

この call_claude() を土台にして、各ミニアプリを積み上げていきます。system パラメータにAIの「役割設定」を渡せるのがポイントです。モデルには現行の claude-opus-5 を指定しています。コスト重視なら claude-sonnet-4-5 などの軽量モデルに差し替えてもそのまま動きます。

📝 ミニアプリ①:文章要約ツール

まず核となる文章要約ツールから実装しましょう。長い記事やドキュメントをClaudeに渡して、要点をまとめてもらいます。

実装コード

def summarize(text: str, style: str = "bullet") -> str:
    """
    文章を要約する関数
    style: 'bullet'=箇条書き / 'short'=1〜2文 / 'detailed'=詳細要約
    """
    style_instruction = {
        "bullet": "箇条書き(3〜5点)で要約してください。",
        "short":  "1〜2文の短い要約にしてください。",
        "detailed": "重要なポイントを漏らさず、詳細に要約してください。",
    }.get(style, "箇条書きで要約してください。")

    system = "あなたは優秀な文章要約アシスタントです。日本語で回答してください。"
    prompt = f"以下の文章を{style_instruction}\n\n---\n{text}\n---"

    # 要約はmax_tokensを抑えてコスト節約
    return call_claude(prompt, system=system, max_tokens=400)


# 使用例
article = """
Pythonは1991年にグイド・ヴァン・ロッサムによって開発された汎用プログラミング言語です。
シンプルで読みやすい文法が特徴で、Web開発・データ分析・AI・自動化など幅広い分野で
活用されています。初心者にとって学習コストが低く、豊富なライブラリも魅力のひとつです。
近年はAI/機械学習の分野での採用が急増しており、業界標準の言語となっています。
"""

print("=== 箇条書き要約 ===")
print(summarize(article, style="bullet"))
print()
print("=== 短い要約 ===")
print(summarize(article, style="short"))

実行結果のイメージ

=== 箇条書き要約 ===
• 1991年にグイド・ヴァン・ロッサムが開発した汎用言語
• シンプルで読みやすい文法が特徴
• Web・データ分析・AI・自動化など幅広い用途
• 初心者にも学習コストが低い
• AI/機械学習分野での採用が急増中

=== 短い要約 ===
Pythonは読みやすい文法と豊富なライブラリを持つ汎用言語で、AI・Web・自動化など幅広い分野で活用されている初心者にも人気の言語です。

style パラメータで出力形式を切り替えられるのが便利なポイントです。用途に合わせて呼び分けましょう。

🌐 ミニアプリ②:多言語翻訳ツール

次は翻訳ツールです。翻訳先の言語を引数で指定できるように設計します。

実装コード

def translate(text: str, target_lang: str = "英語", source_lang: str = "自動検出") -> str:
    """
    テキストを指定言語へ翻訳する関数
    target_lang: '英語' / '日本語' / 'フランス語' など自然言語で指定
    """
    system = (
        "あなたはプロの翻訳者です。原文のニュアンスを保ちながら、"
        "自然で正確な翻訳を提供してください。翻訳結果のみを出力し、"
        "説明や注釈は不要です。"
    )
    prompt = (
        f"以下のテキストを{target_lang}に翻訳してください。"
        f"(原文言語:{source_lang})\n\n{text}"
    )
    return call_claude(prompt, system=system, max_tokens=600)


# 使用例
original_ja = "Pythonは初心者にも扱いやすく、AI開発に最適なプログラミング言語です。"
original_en = "Python is a beginner-friendly programming language ideal for AI development."

print("=== 日本語 → 英語 ===")
print(translate(original_ja, target_lang="英語"))

print()
print("=== 英語 → フランス語 ===")
print(translate(original_en, target_lang="フランス語", source_lang="英語"))

print()
print("=== 英語 → 日本語 ===")
print(translate(original_en, target_lang="日本語", source_lang="英語"))

翻訳ツールのポイント

  • 📌 system に「翻訳結果のみ出力」と明示するのが大事。余計な説明文が入らなくなります
  • 📌 source_lang="自動検出" をデフォルトにしておくと、呼び出し側が楽になります
  • 📌 翻訳は要約より出力が長くなりやすいので max_tokens=600 にしています

🤖 ミニアプリ③:コードレビューBot


3つ目はコードレビューBotです。自分のPythonコードをClaudeに渡して、問題点・改善点・セキュリティ上の懸念をチェックしてもらいます。

実装コード

def code_review(code: str, language: str = "Python", focus: str = "all") -> str:
    """
    コードをレビューする関数
    focus: 'all'=全般 / 'security'=セキュリティ / 'performance'=パフォーマンス / 'readability'=可読性
    """
    focus_map = {
        "all":         "バグ・セキュリティ・パフォーマンス・可読性の全観点から",
        "security":    "セキュリティ上のリスクに特化して",
        "performance": "パフォーマンス改善の観点から",
        "readability": "コードの可読性・保守性の観点から",
    }
    focus_text = focus_map.get(focus, focus_map["all"])

    system = (
        "あなたはシニアソフトウェアエンジニアです。"
        "コードレビューは具体的で建設的なフィードバックを提供してください。"
        "問題点には必ず改善例のコードスニペットを添えてください。"
    )
    prompt = (
        f"以下の{language}コードを{focus_text}レビューしてください。\n"
        f"出力形式:\n"
        f"1. 総評(1〜2文)\n"
        f"2. 問題点・改善点(箇条書き+改善コード例)\n"
        f"3. 良い点\n\n"
        f"```{language.lower()}\n{code}\n```"
    )
    # レビューは詳細になるのでmax_tokensを多めに
    return call_claude(prompt, system=system, max_tokens=1000)


# 使用例:あえて問題のあるコードを渡してみる
sample_code = """
import sqlite3

def get_user(username):
    conn = sqlite3.connect('users.db')
    cursor = conn.cursor()
    query = "SELECT * FROM users WHERE name = '" + username + "'"
    cursor.execute(query)
    result = cursor.fetchone()
    return result
"""

print("=== セキュリティレビュー ===")
print(code_review(sample_code, focus="security"))

print()
print("=== 全般レビュー ===")
print(code_review(sample_code, focus="all"))

SQLインジェクションの脆弱性を含むコードを渡すと、Claudeがきちんと指摘してくれます。実際の開発で自分のコードを貼り付けて使うのにとても便利です。

💰 コスト管理の実践:max_tokens調整と使用量モニタリング

実践アプリを作るうえで避けて通れないのがコスト管理です。Claude APIは使った分だけ課金されるため、何も考えずに使い続けると請求が想定外に膨らみます。

① max_tokensの使い分け指針

max_tokens は「Claudeが返答できる最大トークン数」です。大きくするほど長い返答が返ってきますが、その分コストも上がります。

# タスク別max_tokensの目安
TOKEN_BUDGET = {
    "summary_short":  200,   # 短い要約(1〜2文)
    "summary_bullet": 400,   # 箇条書き要約
    "translation":    600,   # 翻訳(原文の1.5倍を想定)
    "code_review":   1000,   # コードレビュー(詳細コメント込み)
    "chat_simple":    512,   # 簡単な質疑応答
    "long_generation": 2048, # 長文生成(ブログ記事等)
}

「とりあえず1024」にしがちですが、要約タスクに1024は過剰です。用途に合わせて絞ることで、コストを20〜50%削減できることも珍しくありません。

② 使用トークン数をモニタリングする

Claude APIのレスポンスには、使用トークン数が含まれています。これをログに記録する習慣をつけましょう。

def call_claude_with_monitoring(
    prompt: str,
    system: str = "",
    max_tokens: int = 512,
    task_name: str = "unknown"
) -> dict:
    """
    トークン使用量をモニタリングしながらClaudeを呼び出す関数
    戻り値: {'text': 返答テキスト, 'usage': トークン情報}
    """
    messages = [{"role": "user", "content": prompt}]
    kwargs = {
        "model": "claude-opus-5",
        "max_tokens": max_tokens,
        "messages": messages,
    }
    if system:
        kwargs["system"] = system

    response = client.messages.create(**kwargs)

    usage = {
        "input_tokens":  response.usage.input_tokens,
        "output_tokens": response.usage.output_tokens,
        "total_tokens":  response.usage.input_tokens + response.usage.output_tokens,
    }

    # コンソールにログ出力(本番ではファイルやDBに記録を推奨)
    print(f"[{task_name}] input={usage['input_tokens']} / "
          f"output={usage['output_tokens']} / "
          f"total={usage['total_tokens']} tokens")

    return {"text": response.content[0].text, "usage": usage}


# 使用例
result = call_claude_with_monitoring(
    prompt="Pythonのリスト内包表記を1文で説明して",
    max_tokens=100,
    task_name="summary_short"
)
print(result["text"])

③ 累積コストを簡易集計する

複数タスクを連続して実行するときは、累積トークン数を集計しておくと後から分析しやすくなります。

class TokenTracker:
    """セッション内のトークン使用量を追跡するシンプルなクラス"""

    def __init__(self):
        self.total_input  = 0
        self.total_output = 0
        self.call_count   = 0

    def add(self, usage: dict):
        self.total_input  += usage["input_tokens"]
        self.total_output += usage["output_tokens"]
        self.call_count   += 1

    def report(self):
        total = self.total_input + self.total_output
        print(f"--- トークン使用量サマリー ---")
        print(f"API呼び出し回数 : {self.call_count} 回")
        print(f"入力トークン計  : {self.total_input:,}")
        print(f"出力トークン計  : {self.total_output:,}")
        print(f"合計トークン    : {total:,}")


# 使い方
tracker = TokenTracker()

texts = [
    "Pythonはシンプルな文法が特徴の言語です。",
    "機械学習では主にscikit-learnやPyTorchが使われます。",
    "Webフレームワークとして FlaskやDjangoが人気です。",
]

for i, text in enumerate(texts):
    result = call_claude_with_monitoring(
        prompt=f"以下を1文で要約:{text}",
        max_tokens=80,
        task_name=f"summary_{i+1}"
    )
    tracker.add(result["usage"])

tracker.report()

実行するとこのようなサマリーが出力されます👇

[summary_1] input=42 / output=22 / total=64 tokens
[summary_2] input=45 / output=25 / total=70 tokens
[summary_3] input=44 / output=23 / total=67 tokens
--- トークン使用量サマリー ---
API呼び出し回数 : 3 回
入力トークン計  : 131
出力トークン計  : 70
合計トークン    : 201

🧩 ミニアプリを組み合わせて使う:実践パイプライン例


ここまで作った関数を組み合わせると、より実用的なパイプラインが作れます。たとえば「英語記事を翻訳して→要約して出力する」ワークフローはこう書けます。

def translate_and_summarize(english_text: str) -> dict:
    """
    英語テキストを日本語翻訳してから要約するパイプライン
    """
    print("[Step 1] 翻訳中...")
    ja_text = translate(english_text, target_lang="日本語", source_lang="英語")

    print("[Step 2] 要約中...")
    summary = summarize(ja_text, style="bullet")

    return {
        "translated": ja_text,
        "summary": summary,
    }


# 使用例
en_article = """
Python has become the dominant language for artificial intelligence and
machine learning development. Its simple syntax, combined with powerful
libraries like NumPy, PyTorch, and scikit-learn, makes it the go-to choice
for researchers and engineers worldwide.
"""

result = translate_and_summarize(en_article)
print("\n=== 翻訳結果 ===")
print(result["translated"])
print("\n=== 箇条書き要約 ===")
print(result["summary"])

こういったパイプラインを関数として切り出しておくと、Flask APIや定期実行スクリプトにも簡単に組み込めます。

🔧 エラーハンドリングの実装

実用ツールにするなら、エラーハンドリングも忘れずに。レートリミット超過・タイムアウト・APIエラーに対応する基本パターンはこれです。

import time

def call_claude_safe(
    prompt: str,
    system: str = "",
    max_tokens: int = 512,
    retries: int = 3
) -> str:
    """
    リトライ付きの安全なClaude呼び出し関数
    """
    for attempt in range(retries):
        try:
            messages = [{"role": "user", "content": prompt}]
            kwargs = {
                "model": "claude-opus-5",
                "max_tokens": max_tokens,
                "messages": messages,
            }
            if system:
                kwargs["system"] = system
            response = client.messages.create(**kwargs)
            return response.content[0].text

        except anthropic.RateLimitError:
            wait = 2 ** attempt  # 指数バックオフ: 1s, 2s, 4s
            print(f"レートリミット超過。{wait}秒後にリトライ... ({attempt+1}/{retries})")
            time.sleep(wait)

        except anthropic.APIStatusError as e:
            print(f"APIエラー (status={e.status_code}): {e.message}")
            break  # ステータスエラーはリトライしない

        except Exception as e:
            print(f"予期しないエラー: {e}")
            break

    return ""  # 全リトライ失敗時は空文字を返す

anthropic.RateLimitError を個別にキャッチして指数バックオフをかけるのがポイントです。低いレート制限Tierで開発中は特にレートリミットに引っかかりやすいので、このパターンを入れておくだけで安心度が上がります。

📊 まとめ:実践ミニアプリ開発のポイント

この記事で作ったミニアプリと実践テクニックを振り返りましょう。

  • 関数化パターン:1タスク=1関数で設計し、call_claude() を共通土台にする
  • 文章要約ツールstyle 引数で箇条書き・短文・詳細を切り替え
  • 翻訳ツールtarget_lang を自然言語で指定。systemに「結果のみ出力」を明示
  • コードレビューBotfocus 引数でセキュリティ・パフォーマンス・可読性を選択
  • コスト管理:タスク別に max_tokens を設定し、TokenTracker で累積監視
  • パイプライン:関数を組み合わせて「翻訳→要約」などのワークフローを構築
  • エラーハンドリング:指数バックオフ付きリトライで本番運用に耐えるコードに

ここまでの関数を組み合わせれば、CLIツール・Slack Bot・Flask APIなど様々なアプリに発展させられます。まずは1つ「自分が日常で使えるもの」を作ってみてください。作りながら覚えるのが、AIアプリ開発の一番の近道です 🚀

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る

実践Claude Code入門―現場で活用するためのAIコーディングの思考法

もしも

実践Claude Code入門―現場で活用するためのAIコーディングの思考法

AIコーディングの現場活用法を学ぶ一冊

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。