API でチャットアプリを作る:Claude / GPT API 入門

AI Navigate Original / 2026/3/24

💬 オピニオンDeveloper Stack & Infrastructure
共有:

要点

  • LLM API は各 SDK 導入後 30 行で動く
  • キー取得・.env 設定、Claude/OpenAI/Vercel AI SDK で初回呼び出し
  • messages 配列でマルチターン、システムプロンプトで役割付与
  • キー漏洩・レート制限・トークン超過に注意、安く試せる

ChatGPT や Claude を自分のアプリに組み込みたい——その入口が LLM API です。ブラウザの ChatGPT は「人が画面で使う」もの、API は「プログラムから呼び出す」もの。両者は同じモデルを別の窓口から使っているだけで、API なら自分のチャットアプリ・社内ツール・自動処理にAIを直接組み込めます。本記事は Claude(Anthropic)GPT(OpenAI) の2大APIを並べ、最初の一歩から会話・料金・つまずきまでを、コピーして動かせる形で解説します。

自分のアプリ リクエスト+APIキー API エンドポイント LLM モデル本体 回答(JSON)が返る

FIG.1 API=アプリが「キー付きの一通の手紙」を送り、回答を受け取る窓口

ブラウザ版と違って、API は人間のログインではなく APIキー で「誰の呼び出しか」を判定し、使った分だけ課金します。だからキーの管理が最初の関門になります(後述)。基本的な使い方は、各社のSDKを入れて十数行。まずはそこから動かしましょう。

01APIキーを取得する

どちらのサービスも、開発者向けのコンソールでキーを発行します。キーは作成直後に一度だけ全体が表示され、以後は再表示されません。その場で安全な場所にコピーしてください。利用には事前のクレジット入金(少額から可)が必要です。

OpenAI(GPT)Anthropic(Claude)
platform.openai.com → 「API keys」console.anthropic.com → 「API Keys」
新規キーを作成 → 一度だけ表示新規キーを作成 → 一度だけ表示
キーは sk-... 形式キーは sk-ant-... 形式
前払いクレジットを入金前払いクレジットを入金

キーは「あなたの財布を開ける合鍵」です。コードに直書きせず、必ず環境変数に逃がします。漏れたと思ったら、コンソールから即座に失効(revoke)させ、新しいキーを発行し直しましょう。

02環境を整える

言語は Node.js(TypeScript)でも Python でも構いません。両社のSDKを入れて、キーを .env に置きます。

# Node.js
npm install @anthropic-ai/sdk openai

# Python
pip install anthropic openai

キーは .env に書き、コードからは環境変数として読み込みます。

ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=sk-...

最初の事故の9割はキーの取り扱いで起きる。.env は必ず .gitignore へ。

03初めての呼び出し

SDKは、環境変数 ANTHROPIC_API_KEY / OPENAI_API_KEY を自動で読みます。だからコードにキーは書きません。下は2026年時点の代表モデルでの最小例です(モデル名は新版が出るたびに更新されるので、各社のモデル一覧で最新を確認してください)。

Claude(Anthropic)

import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();

const msg = await client.messages.create({
  model: "claude-opus-4-8",       // 2026年時点の最上位。用途次第で sonnet / haiku も
  max_tokens: 1024,
  messages: [{ role: "user", content: "東京の今日の見どころは?" }],
});

console.log(msg.content[0].text);

Claude では max_tokens(出力の上限トークン数)が必須です。「役割」を与えるシステム指示は、messages ではなく独立した system パラメータで渡します(05節)。

GPT(OpenAI)

import OpenAI from "openai";
const client = new OpenAI();

const res = await client.chat.completions.create({
  model: "gpt-5.4",               // 量産向けの定番。最上位は gpt-5.5
  messages: [{ role: "user", content: "東京の今日の見どころは?" }],
});

console.log(res.choices[0].message.content);

OpenAI は新規開発には Responses APIclient.responses.create)も用意していますが、上記の Chat Completions 形式は広く使われ続けており、最初の学習にはこちらが分かりやすいです。役割指定は messages 配列に role: "system" を混ぜて行います(Claude との違いに注意)。

1つのコードで両方を扱う:Vercel AI SDK

Claude・GPT・Gemini などを同じ書き方で呼びたいなら、抽象化レイヤーの Vercel AI SDK が便利です。プロバイダのパッケージを足し、モデルを差し替えるだけで乗り換えられます。

import { generateText } from "ai";
import { openai } from "@ai-sdk/openai";
import { anthropic } from "@ai-sdk/anthropic";

const { text } = await generateText({
  model: openai("gpt-5.4"),            // anthropic("claude-opus-4-8") に変えるだけで Claude に
  prompt: "東京の今日の見どころは?",
});

呼び出し・ストリーミング・ツール利用のコードはそのままに、import 1行とモデル文字列だけで provider を切り替えられるのが利点です。1社にロックインされたくない初期開発で重宝します。

04会話を続ける:messages は「積み上げる」

API は1回ごとに記憶を持ちません(ステートレス)。「さっきの話の続き」を理解させるには、過去のやりとりを messages 配列に全部積み上げて毎回送るのが基本です。ここが初学者のいちばんの勘所です。

1ターン目 user: 見どころは? 2ターン目 user: 見どころは? assistant: 今日は… user: 雨でも楽しめる所だけ 前回分を保持 API 配列全体を読む 文脈を踏まえて回答 ターンが進むほど配列は長くなる=送るトークンも増える

FIG.2 会話=過去の user / assistant 発言を配列に積み、毎回まるごと送る

messages: [
  { role: "user", content: "東京の今日の見どころは?" },
  { role: "assistant", content: "今日は…" },        // 前回のAIの返答
  { role: "user", content: "雨でも楽しめる場所だけに絞って" },
]

裏返すと、会話が長くなるほど毎回送る量が増え、料金もレスポンス時間も膨らみます。実アプリでは、古い発言を要約して圧縮したり、直近Nターンだけ残すなどの工夫を入れます。

05システムプロンプト:AIに役割を与える

口調・立場・守るべきルールを固定したいときは「システムプロンプト」を使います。2社で渡し方が違うので、ここは丁寧に。

Claude(独立パラメータ)OpenAI(配列の先頭に混ぜる)
system に文字列で渡す messagesrole:"system" として置く
// Claude
client.messages.create({
  model: "claude-opus-4-8",
  max_tokens: 1024,
  system: "あなたは丁寧な旅行ガイドです。",
  messages: [{ role: "user", content: "..." }],
});

// OpenAI
client.chat.completions.create({
  model: "gpt-5.4",
  messages: [
    { role: "system", content: "あなたは丁寧な旅行ガイドです。" },
    { role: "user", content: "..." },
  ],
});

システムプロンプトは「毎ターン効く土台の指示」です。とはいえ AIに渡したからといって絶対に守られるわけではありません。重要な制約(出力形式、禁止事項)は、システム指示だけに頼らず、受け取った後にコード側でも検証するのが安全です。

06料金の感覚をつかむ

API は「読んだ文字(入力トークン)」と「書いた文字(出力トークン)」の両方に課金されます。出力のほうが単価が高いのが各社共通の傾向です。下は2026年6月時点の代表的な公開価格(100万トークンあたり・USD)。価格は頻繁に改定されるため、必ず各社の料金ページで最新を確認してください

モデル(例)入力 / 出力(USD・100万トークン)
Claude Opus 4.8(最上位)$5 / $25
Claude Sonnet 4.6(標準)$3 / $15
Claude Haiku 4.5(軽量・低価格)$1 / $5
GPT-5.4(量産向け)$2.50 / $15
GPT-5.5(最上位)$5 / $30
0 入力 読む 出力 書く(高い) 1トークン ≒ 英語0.75語       ≒ 日本語0.5〜1文字 チャット1往復=数百〜数千トークン

FIG.3 課金は入力+出力。出力単価が高い=「長く喋らせる」ほど効いてくる

目安として、1トークンは英語で約0.75語、日本語で約0.5〜1文字。ふつうのチャット1往復は数百〜数千トークンで、個人開発の試作なら月 $5〜20 程度で十分試せます。コストを抑える定番は、用途に合わせて安いモデル(Haiku / GPT-5.4 など)に寄せる、繰り返し送るシステムプロンプトにプロンプトキャッシュ(各社が提供、キャッシュ済み入力を最大9割引)を効かせる、急がない一括処理にバッチ(約5割引)を使う、の3つです。

07つまずきやすいポイントと対処

01

キーの漏洩

APIキーをコードに直書き・GitHubにコミットしない。.env.gitignore に入れ、環境変数で読む。漏れたらコンソールから即失効+再発行。フロントエンド(ブラウザ側JS)にキーを置かず、必ずサーバ経由で呼ぶ。

02

レート制限(429エラー)

短時間に呼びすぎると 429 Too Many Requests が返る。一定時間待って再試行(指数バックオフ=待ち時間を倍々に伸ばす)を入れる。多くのSDKは自動リトライを備えるが、上限や待ち方は把握しておく。

03

出力が途中で切れる

max_tokens(Claudeは必須)が小さいと回答が尻切れになる。長文を期待するなら上限を上げる。逆に上げすぎると料金が膨らむので、用途に合う値に。

04

もっともらしい嘘(ハルシネーション)

AIは事実でない内容を自信たっぷりに返すことがある。価格・仕様・法令など正確さが要る情報は、一次情報で必ず裏取りする。重要な処理はAIの出力をそのまま使わず、コード側で検証する。

Production Mindset

「動いた」と「本番で安全」は別物

最小コードはすぐ動きますが、ユーザーに出すならキーをサーバ側に隠すエラーとリトライを設計する入力と出力をコードで検証するの3点が土台になります。とくにキーをブラウザに置く実装は事故の典型。AIの呼び出しは必ず自分のサーバ(API Route やバックエンド)を経由させ、キーはそこだけが知る状態にしましょう。

本番では Active CPU 課金Provisioned Throughput(安定した処理枠の確保)、クラウド経由のAPI(AWS Bedrock / Google Vertex AI)といった選択肢も視野に入ります。まずは小さく動かし、ユーザーが増えてから段階的に堅くしていけば十分です。

08次に学ぶこと

最初の呼び出しが動いたら、次は「使えるアプリ」へ近づけるステップへ。いずれも各社SDK・Vercel AI SDK の両方で対応しています。

ストリーミング

回答を1文字ずつ流して表示。体感速度が大きく上がる(ChatGPT風のタイプ表示)。

ツール利用

AIに関数・外部API・検索を呼ばせる。天気取得・DB照会など「行動するAI」の土台。

構造化出力

JSONなど決まった形で返させ、プログラムで安全に処理。スキーマ指定で精度が安定。

その先は、クラウド経由API(Bedrock / Vertex)や、社内文書を根拠に答えさせる RAG(検索拡張生成)へと広がります。まずは本記事の最小コードを実際に動かし、料金ダッシュボードで消費トークンを眺めるところから始めましょう。手を動かすほど、料金とレスポンスの感覚が身についていきます。