GASでClaude APIの
利用可能モデル一覧を取得する方法

Claude APIのモデルは、新しいものが追加され、古いものは提供が終わります。モデルIDをコードに直接書いたままだと、ある日突然エラーになることがあります。GET /v1/models(Models API)を使えば、いま使えるモデルをGASから取得できます。ページ送り、スプレッドシートへの書き出し、機能での絞り込み、起動時チェックまで、動くコードで解説します。

|著者: (ラスタージ代表)|対象: GAS / Claude API / 運用管理

Table of Contents

なぜモデル一覧をAPIで取得するのか

GASでClaude APIを使う自動化は、モデルIDを指定して呼び出します。このIDが「いつまでも同じように使える」とは限りません。新しいモデルが出れば乗り換えたくなりますし、古いモデルは提供終了の対象になります。

そこでModels APIの出番です。いま自分のAPIキーで使えるモデルをAPI側に聞くことで、次の3つができます。

  • 設定したモデルIDが今も有効か、処理の頭で自動チェックする
  • 最大入力トークン数や対応機能(画像・PDFなど)を見て、用途に合うモデルを選ぶ
  • 一覧をスプレッドシートに残し、担当者が見比べられるようにする

Models APIの基本(GET /v1/models)

エンドポイントはGET https://api.anthropic.com/v1/modelsです。認証は他のAPIと同じくx-api-keyとanthropic-versionヘッダーで行います。クエリパラメータは3つです。

  • limit: 1ページの件数。初期値は20、指定できる範囲は1〜1000
  • after_id: このIDの「後ろ」のページを返す(次のページ用)
  • before_id: このIDの「前」のページを返す(前のページ用)

レスポンスはdata(モデルの配列)、has_more(続きがあるか)、first_id・last_id(ページ送りに使うID)で構成されます。各モデルにはiddisplay_namecreated_atmax_input_tokensmax_tokenscapabilitiesなどが入っており、新しく公開されたモデルほど先に並びます。項目は公式リファレンスに沿って紹介しているため、最新の仕様は末尾の公式ドキュメントで確認してください。

GASでモデル一覧を取得する(ページ送り対応)

UrlFetchApp.fetchでGETするだけの関数です。APIキーはPropertiesServiceに保存し、コードに直接書きません。結果が1ページに収まらないときはhas_moreを見て、last_idをafter_idに渡して続きを取りに行きます。

// Models API: 使えるモデルの一覧を返す。
// GET https://api.anthropic.com/v1/models
// クエリ: limit(1〜1000、初期値20)/ after_id / before_id
// レスポンス: { data: [...], has_more, first_id, last_id }
// 新しく公開されたモデルほど先に並ぶ。

function listClaudeModels() {
  const apiKey = PropertiesService.getScriptProperties()
    .getProperty("CLAUDE_API_KEY");

  const models = [];
  let afterId = null;

  while (true) {
    let url = "https://api.anthropic.com/v1/models?limit=100";
    if (afterId) url += "&after_id=" + encodeURIComponent(afterId);

    const res = UrlFetchApp.fetch(url, {
      method: "get",
      headers: {
        "x-api-key": apiKey,
        "anthropic-version": "2023-06-01",
      },
      muteHttpExceptions: true,
    });

    if (res.getResponseCode() !== 200) {
      throw new Error("Models API エラー: " + res.getContentText());
    }

    const body = JSON.parse(res.getContentText());
    body.data.forEach(function (m) { models.push(m); });

    if (!body.has_more) break;
    afterId = body.last_id; // 次のページはこのIDの後ろから
  }
  return models;
}

muteHttpExceptions: trueを付けているのは、エラー時にもレスポンスの中身を読んで原因を表示するためです。401なら APIキーの誤り、429ならレート制限が考えられます。失敗時の再試行はリトライ処理の記事の方法が使えます。

スプレッドシートに書き出して一覧化する

取得した一覧をシートに書き出しておくと、モデルID・公開日・最大入力トークン数を並べて見比べられます。コードはsetValuesで一括書き込みする形にしています。セルへの1件ずつの書き込みより速く、実行時間の制限にも余裕が出ます。

// 取得した一覧を「モデル一覧」シートに書き出す。
function writeModelsToSheet() {
  const models = listClaudeModels();

  const ss = SpreadsheetApp.getActive();
  const sheet = ss.getSheetByName("モデル一覧") || ss.insertSheet("モデル一覧");
  sheet.clear();

  const header = ["モデルID", "表示名", "公開日", "最大入力トークン", "最大出力トークン"];
  const rows = models.map(function (m) {
    return [
      m.id,
      m.display_name,
      m.created_at ? m.created_at.slice(0, 10) : "",
      m.max_input_tokens,   // null の場合は空欄になる
      m.max_tokens,
    ];
  });

  sheet.getRange(1, 1, 1, header.length).setValues([header]).setFontWeight("bold");
  if (rows.length > 0) {
    sheet.getRange(2, 1, rows.length, header.length).setValues(rows);
  }
  sheet.setFrozenRows(1);
}

月に1回ほどトリガーで実行して差分を確認すれば、「新しいモデルが追加された」「いつものモデルが一覧から消えた」といった変化に気づけます。

画像・PDF対応モデルを絞り込む

各モデルのcapabilitiesには、画像入力・PDF入力・構造化出力などに対応しているかがsupportedの真偽値で入っています。これを使うと、用途に合うモデルだけを抜き出せます。

// capabilities で対応機能を絞り込む。
// capabilities は null の場合があるので必ずチェックする。
function supports(model, key) {
  const c = model.capabilities;
  return !!(c && c[key] && c[key].supported);
}

function findPdfCapableModels() {
  return listClaudeModels().filter(function (m) {
    return supports(m, "pdf_input");
  });
}

function logModelsByFeature() {
  const models = listClaudeModels();
  models.forEach(function (m) {
    Logger.log(
      m.id +
      " | 画像: " + supports(m, "image_input") +
      " | PDF: " + supports(m, "pdf_input") +
      " | 構造化出力: " + supports(m, "structured_outputs")
    );
  });
}

capabilitiesはnullになる場合があります。コードでは必ずnullチェックを入れてください。また、機能に対応していることと、その機能があなたの用途で十分な精度を出すことは別の話です。最終的には実データで試して判断します。

設定したモデルIDが有効か起動時に確認する

実務で最も効くのがこの使い方です。モデルIDはスクリプトプロパティの1か所だけに持たせ、毎日の自動処理の頭で、そのIDが一覧に存在するかを確認します。提供終了などで使えなくなった場合に、本処理が途中で止まる前に、分かりやすいメッセージでエラーにできます。

// 設定してあるモデルIDが「今も使えるか」を起動時に確認する。
// モデルIDは1か所(スクリプトプロパティ)だけに持たせる。
function assertModelAvailable() {
  const props = PropertiesService.getScriptProperties();
  const modelId = props.getProperty("CLAUDE_MODEL"); // 例: 使いたいモデルのID

  const ids = listClaudeModels().map(function (m) { return m.id; });

  if (ids.indexOf(modelId) === -1) {
    throw new Error(
      "モデル「" + modelId + "」は一覧にありません。" +
      "スクリプトプロパティ CLAUDE_MODEL を見直してください。"
    );
  }
  return modelId;
}

// 毎日の自動処理の頭で呼べば、提供終了などで使えなくなる前に気づける。
function dailyJob() {
  const model = assertModelAvailable();
  // ここから本来の処理(messages API の呼び出しなど)
}

エラーはメールやチャットに通知するようにしておくと、担当者がすぐ気づけます。通知の作り方はGASのエラー通知の記事で解説しています。

キャッシュして呼び出し回数を減らす

モデル一覧は頻繁には変わりません。処理のたびに取得すると無駄な通信になるため、CacheServiceで数時間キャッシュしておくと効率的です。1件あたりの保存サイズに上限があるので、必要な項目だけに絞って保存します。

// 一覧は毎回取りに行かず、CacheService で6時間キャッシュする。
function listClaudeModelsCached() {
  const cache = CacheService.getScriptCache();
  const hit = cache.get("claude_models");
  if (hit) return JSON.parse(hit);

  const models = listClaudeModels();
  // キャッシュ1件の上限は100KB。大きいときは id だけに絞って保存する。
  const slim = models.map(function (m) {
    return { id: m.id, display_name: m.display_name };
  });
  cache.put("claude_models", JSON.stringify(slim), 21600); // 秒
  return slim;
}

キャッシュの基本はCacheServiceの記事にまとめています。

まとめ

Models API(GET /v1/models)を使えば、いま使えるClaudeモデルをGASから取得できます。ポイントは3つです。ページ送りに対応して全件取ること、モデルIDを1か所に集めて起動時に有効か確認すること、capabilitiesはnullを考慮して使うことです。モデルの入れ替わりを前提に作っておけば、AI自動化を長く安定して運用できます。

よくある質問

Models APIはモデルの情報を返すだけで、文章を生成しないため、トークン課金の対象になる処理ではありません。ただしAPIキーによる認証が必要で、リクエスト回数のレート制限は他のエンドポイントと同様に適用されます。料金の扱いは変わることがあるため、最新の内容は公式ドキュメントの料金ページで確認してください。

limitパラメータで1ページあたりの件数を指定でき、初期値は20件、指定できる範囲は1〜1000件です。結果が1ページに収まらないときはレスポンスのhas_moreがtrueになり、last_idをafter_idに渡すと次のページを取得できます。本記事のコードはこのページ送りに対応しています。

動作はしますが、おすすめしません。モデルは新しいものが追加され、古いものは提供が終了することがあります。IDをコードの中に散らすと、変更のたびに修正箇所を探す手間が生じます。スクリプトプロパティや設定シートに1か所だけ書き、起動時にModels APIで有効なIDか確認する構成にすると、提供終了による突然のエラーに早く気づけます。

レスポンスのcapabilitiesに、画像入力(image_input)、PDF入力(pdf_input)、構造化出力(structured_outputs)などの対応状況がsupportedの真偽値で入っています。取得した一覧をこの値で絞り込めば、「PDFを読めるモデルだけ」のように条件に合うモデルを抽出できます。capabilitiesはnullになる場合があるので、コードではnullチェックを入れておきます。

公式のレスポンス仕様には、モデルID・表示名・公開日時・最大入力トークン数・最大出力トークン数・対応機能が含まれますが、料金の項目は載っていません。料金は公式の料金ページで確認し、コスト計算が必要なときは別途単価の表を自分で管理します。

関連するサービス・記事

Official Docs

この記事で扱ったサービスの公式ドキュメントです。仕様や上限値は変わることがあるため、実装前に最新の内容をご確認ください。

AI×GASの業務自動化を
相談する。

Claude APIを使った自動化は、モデルの入れ替わりやエラー通知まで含めて設計すると、長く安心して運用できます。要件整理から運用設計までご相談いただけます。

AI×GAS自動化を見る