コンテンツへスキップ

media AI活用の最前線

ツール比較・実践ガイド 33分で読めます

【2026年最新】Claude Files API|PDF・CSV解析実装ガイド

【2026年最新】Claude Files API|PDF・CSV解析実装ガイド

Files APIとは何か|従来のAPI呼び出しとの決定的な違い

「同じPDFを毎回アップロードするのが面倒で、APIコストも膨らんでいる……」

先日、ある研修先のエンジニアからこんな相談を受けました。契約書レビューの自動化を組もうとしていたのですが、100ページ超のPDFを毎リクエストごとに送信していたため、コストと処理時間の両方が想定より3倍以上かかっていたんです。正直、もったいないと思いました。

その解決策が、AnthropicのFiles APIです。ファイルを一度アップロードするだけで、そのfile_idを使い回せる「アップロード一回・使い放題」の設計です。顧問先でこれを導入してもらったところ、同じPDFを参照するワークフローのAPIコストが約60%削減できました(測定期間:2026年3月〜4月、対象:契約書レビューボット月間5,000リクエスト、測定方法:Anthropic利用明細比較)。

この記事では、Anthropic公式ドキュメントをベースに、Files APIの仕組みからPDF・CSV・コードファイルの実装例、セキュリティ対策、Claude Codeとの使い分けまでを、コピペ可能なコードサンプルつきで解説します。

AIエージェントやドキュメント処理ワークフローの設計に携わる方に、ぜひ今日から使い始めてほしい内容です。

この記事の要点:

  • Files APIはファイルを一度アップロードしてfile_idで使い回す設計。ファイル操作自体は無料
  • PDF・プレーンテキスト・画像を直接参照できる。CSVはテキスト変換して送信
  • ストレージ上限:ファイルあたり500MB、組織全体500GB。ファイル内容はinputトークン課金
  • ベータ機能(anthropic-beta: files-api-2025-04-14ヘッダー必須)

対象読者: Anthropic APIを使って業務自動化・ドキュメント処理を構築する開発者・DX推進担当者

読了後にできること: PythonでPDFをアップロードしてfile_idを取得し、毎回の送信コストを削減するワークフローを構築できる

なお、AIエージェントの設計思想や全体像については、AIエージェント導入完全ガイドで体系的にまとめています。Files APIはエージェントがファイルを扱う際のコア機能ですので、あわせて参照してください。

Files APIの仕組み|アップロード一回、使い放題の設計

Files APIは以下の4つのオペレーションで構成されます。

  • Upload: ファイルをAnthropicのセキュアストレージに送信し、file_idを受け取る
  • Reference: Messagesリクエストでfile_idを使ってファイルを参照する(再送信不要)
  • Download: Skillsやコード実行ツールが生成したファイルを取得する
  • Manage: ファイル一覧の取得・メタデータ確認・削除

最大の特徴は「一度アップロードしたファイルは明示的に削除するまで残る」点です。同じ契約書テンプレートや社内規定PDFを繰り返し参照するユースケースで、送信コストと処理時間の両方を大幅に削減できます。

対応フォーマット一覧

ファイル種別MIMEタイプコンテンツブロック主なユースケース
PDFapplication/pdfdocument契約書・議事録・技術仕様書の解析
プレーンテキストtext/plaindocumentログファイル・Markdown・ソースコード
画像(JPEG/PNG/GIF/WebP)image/*imageスクリーンショット・図表の解析
データセット等各種container_uploadコード実行ツールでのデータ分析

CSVについての注意点: CSVはdocumentブロックでは直接扱えません。Pythonのpandas等でテキストに変換してからメッセージのtextとして送る方式が公式推奨です(詳細は後述)。

対応モデル

  • 画像: Claude 3系以降の全モデル
  • PDF: Claude 3.5以降の全モデル
  • データセット(コード実行ツール経由): Claude Haiku 4.5、Claude 3.7以降

注意: Files APIはAmazon BedrockおよびGoogle Vertex AIでは現在サポートされていません(2026年5月時点)。

AI活用、何から始めればいい?

100社以上の研修実績をもとに、30分の無料相談で貴社の課題を整理します。

無料相談はこちら 資料ダウンロード(無料)

アップロード手順|curl・Python SDK 実装

ベータヘッダーの設定

Files APIを使うには、全リクエストに以下のヘッダーが必要です。

anthropic-beta: files-api-2025-04-14

curlでのアップロード

# PDFをアップロードしてfile_idを取得
curl -X POST https://api.anthropic.com/v1/files 
  -H "x-api-key: $ANTHROPIC_API_KEY" 
  -H "anthropic-version: 2023-06-01" 
  -H "anthropic-beta: files-api-2025-04-14" 
  -F "file=@/path/to/contract.pdf"

# レスポンス例
# {
#   "id": "file_011CNha8iCJcU1wXNR6q4V8w",
#   "type": "file",
#   "filename": "contract.pdf",
#   "mime_type": "application/pdf",
#   "size_bytes": 1024000,
#   "created_at": "2026-01-15T09:00:00Z",
#   "downloadable": false
# }

Python SDKでのアップロード

import anthropic

client = anthropic.Anthropic(api_key="YOUR_API_KEY")

# ファイルをアップロード
with open("/path/to/document.pdf", "rb") as f:
    uploaded = client.beta.files.upload(
        file=("document.pdf", f, "application/pdf"),
    )

file_id = uploaded.id
print(f"アップロード成功: {file_id}")

# file_idを使ってMessagesリクエスト
response = client.beta.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=2048,
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "このドキュメントの要点を500字で整理してください。"},
                {
                    "type": "document",
                    "source": {
                        "type": "file",
                        "file_id": file_id,
                    },
                },
            ],
        }
    ],
    betas=["files-api-2025-04-14"],
)

print(response.content[0].text)

研修でこのコードを見せると、「え、これだけでいいんですか?」と驚かれることが多いです。実際、従来のBase64エンコードしてmessageに埋め込む方式と比べると、コード量は半分以下になります。

ファイル管理の基本操作

# ファイル一覧取得
files = client.beta.files.list()

# メタデータ取得
metadata = client.beta.files.retrieve_metadata(file_id)

# 削除
result = client.beta.files.delete(file_id)
print(f"削除完了: {result}")

# curlで削除
# curl -X DELETE "https://api.anthropic.com/v1/files/$FILE_ID" 
#   -H "x-api-key: $ANTHROPIC_API_KEY" 
#   -H "anthropic-version: 2023-06-01" 
#   -H "anthropic-beta: files-api-2025-04-14"

トークン課金とコスト試算

課金の仕組み

Files APIの操作(アップロード・ダウンロード・一覧取得・削除)自体は無料です。課金が発生するのは、file_idをMessagesリクエストで参照したときで、ファイルの内容がinputトークンとして計上されます。

モデルinputトークン(標準)outputトークン
Claude Haiku 4.5$1 / 100万トークン$5 / 100万トークン
Claude Sonnet 4.6$3 / 100万トークン$15 / 100万トークン
Claude Opus 4.6$5 / 100万トークン$25 / 100万トークン

(出典: Anthropic公式価格表、参照日: 2026-05-04)

PDFのトークン試算

PDFのトークン消費量はコンテンツによって大きく変わります。目安として、テキスト主体の文書は1ページあたり約750〜1,500トークン程度です。

試算例: 10ページの契約書レビューを月100回実行

  • PDF: 10ページ × 1,000トークン = 10,000inputトークン
  • プロンプト + システム: 約500トークン
  • output: 約1,500トークン
  • 合計/回: 12,000トークン
  • 月100回 × Claude Sonnet 4.6: input $3.60 + output $2.25 = 約$5.85/月

コスト削減の鍵はプロンプトキャッシング

Files APIとプロンプトキャッシングを組み合わせると、さらに大幅なコスト削減が可能です。キャッシュヒット時はinputトークンの10%(標準の90%オフ)で処理できます。

# プロンプトキャッシングとFiles APIの組み合わせ
response = client.beta.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=2048,
    system=[
        {
            "type": "text",
            "text": "あなたは契約書レビューの専門家です。",
            "cache_control": {"type": "ephemeral"},  # システムプロンプトをキャッシュ
        }
    ],
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "document",
                    "source": {"type": "file", "file_id": file_id},
                    "cache_control": {"type": "ephemeral"},  # ドキュメントもキャッシュ
                },
                {"type": "text", "text": "この契約書の問題点を列挙してください。"},
            ],
        }
    ],
    betas=["files-api-2025-04-14"],
)

Batch APIと組み合わせれば標準料金の50%割引になります。大量のドキュメントをバッチ処理する場合は「Files API + プロンプトキャッシング + Batch API」の三重組み合わせが最もコスト効率が高くなります。

PDF解析実装例|議事録・契約書の処理

議事録の構造化サマリー自動生成

顧問先の製造業(従業員300名規模)で実際に導入した事例です。週次会議の議事録PDF(平均12ページ)を自動でサマリー生成する仕組みを作りました。

import anthropic
import json
from pathlib import Path

client = anthropic.Anthropic(api_key="YOUR_API_KEY")

def process_meeting_minutes(pdf_path: str) -> dict:
    """議事録PDFを解析して構造化サマリーを返す"""

    # ファイルアップロード
    with open(pdf_path, "rb") as f:
        uploaded = client.beta.files.upload(
            file=(Path(pdf_path).name, f, "application/pdf"),
        )

    file_id = uploaded.id

    # 構造化サマリー生成
    response = client.beta.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=3000,
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "document",
                        "source": {"type": "file", "file_id": file_id},
                    },
                    {
                        "type": "text",
                        "text": """この議事録を以下のJSON形式で整理してください。
情報が不足している場合は「不明」と記載してください。

{
  "meeting_date": "YYYY-MM-DD",
  "attendees": ["参加者名"],
  "agenda_items": [
    {
      "title": "議題名",
      "summary": "内容の要約(200字以内)",
      "decisions": ["決定事項"],
      "action_items": [
        {
          "task": "タスク内容",
          "owner": "担当者",
          "due_date": "期限"
        }
      ]
    }
  ],
  "next_meeting": "次回日程"
}

JSONのみを返してください。説明文は不要です。""",
                    },
                ],
            }
        ],
        betas=["files-api-2025-04-14"],
    )

    # 使用済みのfile_idを削除(PII対策)
    client.beta.files.delete(file_id)

    return json.loads(response.content[0].text)


# 使用例
result = process_meeting_minutes("/path/to/meeting_20260501.pdf")
print(json.dumps(result, ensure_ascii=False, indent=2))

このコードのポイントは最後のclient.beta.files.delete(file_id)です。議事録には個人情報が含まれることが多いため、処理後は速やかに削除しています(PII対策については後述)。

契約書レビューのポイント抽出

def review_contract(pdf_path: str, review_points: list[str]) -> dict:
    """契約書のレビューポイントを抽出する"""

    with open(pdf_path, "rb") as f:
        uploaded = client.beta.files.upload(
            file=(Path(pdf_path).name, f, "application/pdf"),
        )

    points_text = "n".join(f"- {p}" for p in review_points)

    response = client.beta.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=4000,
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "document",
                        "source": {"type": "file", "file_id": uploaded.id},
                        "citations": {"enabled": True},  # 引用機能を有効化
                    },
                    {
                        "type": "text",
                        "text": f"""以下の観点で契約書をレビューし、問題点・確認事項を指摘してください。
該当箇所は文書から引用して示してください。

レビュー観点:
{points_text}

仮定した点は「仮定」と明記してください。""",
                    },
                ],
            }
        ],
        betas=["files-api-2025-04-14"],
    )

    client.beta.files.delete(uploaded.id)
    return {"review": response.content[0].text}


# 使用例
result = review_contract(
    "/path/to/service_agreement.pdf",
    review_points=[
        "解約条件・解約通知期間",
        "損害賠償の上限額と免責事項",
        "知的財産権の帰属",
        "秘密保持義務の範囲と期間",
        "準拠法・管轄裁判所",
    ]
)
print(result["review"])

citations機能を有効にすると、Claudeが回答中で文書の該当箇所を自動的に引用してくれます。「第3条第2項に…」のような形で根拠が明示されるため、レビュー結果の信頼性が大幅に上がります。

CSV解析実装例|売上データ・ログ解析

CSVはテキスト変換が必要

CSVはdocumentブロックでは直接扱えません。pandasで読み込んでテキスト変換してから送るのが公式推奨の方法です。

事例区分: 想定シナリオ

以下は100社以上の研修・コンサル経験をもとに構成した典型的な実装パターンです。

import anthropic
import pandas as pd

client = anthropic.Anthropic(api_key="YOUR_API_KEY")

def analyze_sales_csv(csv_path: str, question: str) -> str:
    """売上CSVをClaudeで分析する"""

    # pandasで読み込んでテキスト変換
    df = pd.read_csv(csv_path)

    # データの概要情報も追加すると精度が上がる
    summary = f"""
データ概要:
- 行数: {len(df):,}行
- 列: {', '.join(df.columns.tolist())}
- 期間: {df.index.min() if hasattr(df.index, 'min') else '不明'}

最初の5行:
{df.head().to_string()}

統計サマリー:
{df.describe().to_string()}

全データ:
{df.to_string(max_rows=200)}
"""

    response = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=3000,
        messages=[
            {
                "role": "user",
                "content": f"{summary}nn質問: {question}nn数字と根拠を明確に示してください。",
            }
        ],
    )

    return response.content[0].text


# 売上データの分析
result = analyze_sales_csv(
    "/path/to/sales_2026Q1.csv",
    "前四半期比で売上が最も伸びた商品カテゴリトップ3と、その要因を分析してください",
)
print(result)

大量ログファイルの解析

ログファイルはサイズが大きくなりがちです。Files APIのテキストファイル対応(text/plain)を使えば、最大500MBのログを扱えます。ただし、全ログをcontextに入れるとトークン上限を超えることがあるため、事前フィルタリングを推奨します。

def analyze_error_logs(log_path: str) -> str:
    """エラーログをFiles API経由で解析する"""

    # エラーのみを事前フィルタリング(コスト削減)
    with open(log_path, "r", encoding="utf-8") as f:
        error_lines = [line for line in f if "ERROR" in line or "CRITICAL" in line]

    # フィルタ済みテキストをtxt形式でアップロード
    import io
    log_content = "n".join(error_lines[:1000])  # 最大1000行
    log_bytes = log_content.encode("utf-8")

    uploaded = client.beta.files.upload(
        file=("filtered_errors.txt", io.BytesIO(log_bytes), "text/plain"),
    )

    response = client.beta.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=3000,
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "document",
                        "source": {"type": "file", "file_id": uploaded.id},
                    },
                    {
                        "type": "text",
                        "text": """このエラーログを解析して以下を教えてください:
1. 最も頻出するエラーの種類(件数とパーセンテージ)
2. 時間帯別のエラー発生パターン
3. 最優先で対処すべきエラーとその理由
4. 推奨する調査手順

不確かな部分は「推測」と明記してください。""",
                    },
                ],
            }
        ],
        betas=["files-api-2025-04-14"],
    )

    client.beta.files.delete(uploaded.id)
    return response.content[0].text

コードベース解析|リポジトリ全体読み込み

Files APIの強力な用途のひとつが、コードベース全体をClaudeに読み込ませた技術分析です。Claude Codeを使わずに「既存コードの品質評価」「依存関係の解析」「ドキュメント自動生成」などを実現できます。

import anthropic
import zipfile
import io
from pathlib import Path

client = anthropic.Anthropic(api_key="YOUR_API_KEY")

def analyze_codebase(repo_path: str, question: str) -> str:
    """コードベースをZip化してFiles APIで解析する"""

    # リポジトリをZip圧縮(.git, node_modules等を除外)
    zip_buffer = io.BytesIO()
    with zipfile.ZipFile(zip_buffer, "w", zipfile.ZIP_DEFLATED) as zf:
        repo = Path(repo_path)
        exclude_dirs = {".git", "node_modules", "__pycache__", ".venv", "dist", "build"}

        for file_path in repo.rglob("*"):
            if file_path.is_file():
                # 除外フォルダをスキップ
                if any(excl in file_path.parts for excl in exclude_dirs):
                    continue
                # バイナリファイルをスキップ
                suffix = file_path.suffix.lower()
                if suffix in {".png", ".jpg", ".gif", ".ico", ".woff", ".ttf"}:
                    continue

                relative = file_path.relative_to(repo)
                zf.write(file_path, relative)

    zip_buffer.seek(0)

    # Zip をテキストファイルとしてアップロード(コード実行ツールなしの場合)
    # 注: コード実行ツールが使える場合は container_upload ブロックを使うほうが高機能
    # ここでは単純なコードレビューを想定

    # 代替: 全ファイルをテキスト結合してアップロード
    all_code = []
    repo = Path(repo_path)
    for file_path in sorted(repo.rglob("*.py")):
        if any(excl in file_path.parts for excl in exclude_dirs):
            continue
        relative = file_path.relative_to(repo)
        try:
            content = file_path.read_text(encoding="utf-8")
            all_code.append(f"# === {relative} ===n{content}n")
        except UnicodeDecodeError:
            continue

    combined = "n".join(all_code)
    combined_bytes = combined.encode("utf-8")

    uploaded = client.beta.files.upload(
        file=("codebase.txt", io.BytesIO(combined_bytes), "text/plain"),
    )

    response = client.beta.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=5000,
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "document",
                        "source": {"type": "file", "file_id": uploaded.id},
                    },
                    {"type": "text", "text": question},
                ],
            }
        ],
        betas=["files-api-2025-04-14"],
    )

    client.beta.files.delete(uploaded.id)
    return response.content[0].text


# 使用例
result = analyze_codebase(
    "/path/to/my-project",
    """このコードベースを分析して以下を教えてください:
1. アーキテクチャの概要(主要コンポーネントと役割)
2. セキュリティ上の懸念点(上位3件)
3. パフォーマンス改善の余地がある箇所
4. テストカバレッジの状況

不確かな部分は「推測」と明記してください。""",
)
print(result)

実際に研修でこれを見せると、「リポジトリ全体を読ませた上でレビューできるのか!」とエンジニアの方々が驚かれます。Claude Codeのようにファイルを一つひとつ開く操作なしに、全体像を把握したレビューが可能になります。

セキュリティ|PII対策と運用上の注意点

ファイルのスコープと永続性

Files APIで重要なのは、アップロードしたファイルが同じワークスペースのAPIキー全体で共有される点です。

  • ファイルは明示的に削除するまで保持される(自動削除なし)
  • 同じワークスペースに紐づく他のAPIキーからもアクセス可能
  • 削除後はすぐにAPIからアクセス不可になるが、アクティブなリクエスト内では短時間残ることがある
  • Files APIはZero Data Retention(ZDR)非対象(重要!)

PII対策の実装パターン

import anthropic
from pathlib import Path
import re

client = anthropic.Anthropic(api_key="YOUR_API_KEY")

def process_with_pii_cleanup(pdf_path: str, task: str) -> str:
    """PII対策つきでPDFを処理する"""

    with open(pdf_path, "rb") as f:
        uploaded = client.beta.files.upload(
            file=(Path(pdf_path).name, f, "application/pdf"),
        )

    file_id = uploaded.id

    try:
        response = client.beta.messages.create(
            model="claude-sonnet-4-6",
            max_tokens=3000,
            messages=[
                {
                    "role": "user",
                    "content": [
                        {
                            "type": "document",
                            "source": {"type": "file", "file_id": file_id},
                        },
                        {
                            "type": "text",
                            "text": f"""{task}

重要: 個人名・メールアドレス・電話番号・住所などの個人情報を出力に含めないでください。
必要な場合は「[氏名]」「[連絡先]」のようにマスキングしてください。""",
                        },
                    ],
                }
            ],
            betas=["files-api-2025-04-14"],
        )
        return response.content[0].text
    finally:
        # 必ずファイルを削除(finallyで確実に実行)
        client.beta.files.delete(file_id)
        print(f"ファイル削除完了: {file_id}")


# ZDR(Zero Data Retention)が必要なユースケースには Files API を使わない
# 代わりに毎回 Base64 でインラインエンコードして送信する
def process_with_zdr(pdf_path: str, task: str) -> str:
    """ZDR要件がある場合のBase64インライン方式"""
    import base64

    with open(pdf_path, "rb") as f:
        pdf_data = base64.standard_b64encode(f.read()).decode("utf-8")

    response = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=3000,
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "document",
                        "source": {
                            "type": "base64",
                            "media_type": "application/pdf",
                            "data": pdf_data,
                        },
                    },
                    {"type": "text", "text": task},
                ],
            }
        ],
    )
    return response.content[0].text

セキュリティチェックリスト

  • 個人情報(氏名・住所・マイナンバー等)を含むファイルは処理後すぐ削除する
  • 医療・金融・法律関連のファイルはZDRポリシーを確認し、必要ならインライン方式を使う
  • APIキーはファイルスコープに直結する。本番・開発でAPIキーを分けることを推奨
  • ストレージ上限(500GB)に近づいたら定期的に不要ファイルを削除するクリーンアップジョブを設定する

Claude Codeとの使い分け

「Files APIとClaude Codeはどう使い分けるの?」というのも研修でよく出る質問です。

観点Files API(直接)Claude Code
主な用途自動化パイプライン・バッチ処理インタラクティブな開発・調査
ファイル操作APIで明示的に管理自動(Claudeが判断)
コード実行別途コード実行ツールが必要組み込み(即実行)
コスト管理細かく制御可能自動最適化(制御しにくい)
適したシーン毎日動くバッチ処理、定型レポート生成コードレビュー、技術調査、探索的分析

シンプルな判断基準として、「プログラムで動かしたい」ならFiles API、「自分でインタラクティブに試したい」ならClaude Codeと考えてください。

また、Claude Codeのコンテキスト管理についてはClaude Code 100万トークンの使いこなし方で詳しく解説しています。Files APIでコスト節約しながらClaude Codeで実装するという組み合わせも有効です。

ストレージ上限と制限事項

項目上限
ファイルあたりの最大サイズ500 MB
組織全体のストレージ500 GB
APIリクエスト(ベータ期間中)約100リクエスト/分
ファイル名の長さ1〜255文字
ファイル名の禁止文字< > : ” | ? * /など

よくあるエラーと対処法

  • 404 File not found: file_idが存在しないか、別のワークスペースのキーでアクセスしている
  • 400 Invalid file type: 画像ファイルをdocumentブロックに入れるなどのタイプミスマッチ
  • 400 Exceeds context window size: 500MBのテキストファイルをそのまま送ろうとした場合など
  • 413 File too large: 500MB超のファイル。事前分割が必要
  • 403 Storage limit exceeded: 500GB到達。不要ファイルの一括削除が必要

【要注意】よくある失敗パターンと回避策

失敗1: ベータヘッダーを忘れる

❌ 通常のclient.messages.createをそのまま使う
betas=["files-api-2025-04-14"]を必ず指定する

これが最も多い初期エラーです。ヘッダーなしでfile_idを参照すると「Invalid source type」のような分かりにくいエラーが返ってきます。

失敗2: CSVを直接documentブロックで送ろうとする

❌ CSVをそのままuploadしてdocumentブロックで参照する
⭕ pandasで読み込んでto_string()でテキスト変換してから送る

CSVはPDFやプレーンテキストと違い、documentブロックに直接入れられません。変換が必要です。

失敗3: 削除し忘れてストレージが溜まる

❌ 処理後にfile_idをそのまま放置する
⭕ try/finallyでファイル削除を確実に実行する

特に機密ファイルは処理後即削除を徹底してください。監査の観点からも重要です。

失敗4: ZDRが必要な場面でFiles APIを使う

❌ 医療情報・金融個人情報をFiles APIにアップロードする
⭕ ZDRが必要な場合はBase64インライン方式を使う

Files APIはZDR非対象であることを必ずコンプライアンス担当者と確認してから導入してください。

失敗5: 大きなファイルをまるごと送って500エラー

❌ 200ページのPDFをそのまま1回のリクエストに入れる
⭕ コンテキストウィンドウ(最大100万トークン)を超えないよう分割処理する

1ページ約1,000トークンとすると、200ページは約20万トークン。これ自体は問題ありませんが、システムプロンプトや出力も含めた総量がcontextを超えないよう注意が必要です。

まとめ|今日から始める3つのアクション

Files APIは「ファイルを毎回送る非効率」を解消する実用的なツールです。特にドキュメント処理・コードレビュー自動化・ログ分析を繰り返し行うワークフローで、コストと処理時間の削減効果が大きくなります。

  1. 今日やること: 手元の小さなPDF(社内マニュアル等)をcurlでアップロードし、file_idを取得してみる。5分で完了します
  2. 今週中: 毎日実行している繰り返し処理(定型レポート・ログチェック等)にFiles APIを組み込み、Before/Afterのコストを比較する
  3. 今月中: プロンプトキャッシングと組み合わせた本格的なドキュメント処理パイプラインを構築し、月間コストを測定する

Files APIはまだベータ版ですが、2025年4月のリリース以来、実務での利用が着実に増えています。今のうちに実装パターンを習得しておくと、エージェント実装の幅が大きく広がります。

Claudeを使った業務自動化の全体像については、AIエージェント導入完全ガイドもあわせて参照してください。n8nとの組み合わせについてはn8n×Claude API統合|業務自動化フロー10選が参考になります。


参考・出典


著者: 佐藤傑(さとう・すぐる)
株式会社Uravation代表取締役。早稲田大学法学部在学中に生成AIの可能性に魅了され、X(旧Twitter)で活用法を発信(@SuguruKun_ai、フォロワー約10万人)。100社以上の企業向けAI研修・導入支援を展開。著書『AIエージェント仕事術』(SBクリエイティブ)。SoftBank IT連載7回執筆(NewsPicks最大1,125ピックス)。

ご質問・ご相談は お問い合わせフォーム からお気軽にどうぞ。

佐藤傑
この記事を書いた人 佐藤傑

株式会社Uravation代表取締役。早稲田大学法学部在学中に生成AIの可能性に魅了され、X(旧Twitter)で活用法を発信(@SuguruKun_ai、フォロワー10万人超)。100社以上の企業向けAI研修・導入支援を展開。著書累計3万部突破。SoftBank IT連載7回執筆(NewsPicks最大1,125ピックス)。

この記事をシェア

📧 週1回、AIツール最新情報をお届け

Claude Code・Codex・Cursorなど最新AI実務情報を、月8-12本の厳選記事から要約してメール配信。すでに3,000人以上のAI担当者が購読中です。

※ いつでも登録解除できます。配信頻度は週1〜2回程度。

最適なAIツールの選定でお悩みの方へ

AI顧問サービスでは、貴社の業務に最適なAIツールの選定から導入・社内浸透まで月額制でサポート。Claude・ChatGPT・Cursor等の使い分けも実務観点で助言します。

✓ 1対1のマンツーマン ✓ 全12回・3ヶ月 ✓ 実務ベースの指導
AI顧問サービスを見る まずは無料相談

contact お問い合わせ

生成AI研修や開発のご依頼、お見積りなど、
お気軽にご相談ください。

Claude Code 個別指導(1対1・12セッション)をご希望の方はこちらから別途お申し込みください

Claude Code 個別指導 無料相談