ChatGPTなどのAIを使ったサービスなどを作りたいなら、APIを利用するのが簡単だ。
ここでは、APIキーを取得してとりまAPIをCurlで叩いてみる。
ChatGPT(OpenAI)APIキー発行・確認・再発行ページ
ここでできること
- APIキーの一覧
- A新規キーの発行
- A古いキーの削除
※OpenAIはセキュリティ上、既存キーの全文は再表示されないので、必要なら新しいキーを発行する形になる。
OpenAI(ChatGPT)API の公式リファレンス
https://platform.openai.com/docs/api-reference
(platform.openai.com in Bing)
Curlをなげてみる
上のページで取得したAPIキーを使ってCurlからAPIをたたいてみる。これができれば、各種言語からfetchなどのリクエストを投げて加工するのも簡単です。
curlコード
$ API_KEY="<あなたのAPIキー>"
curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY" \
-d '{
"model": "gpt-4o-mini",
"messages": [
{ "role": "user", "content": "こんにちは" }
]
}'
レスポンス例
{
"id": "chatcmpl-D8J2QQyhUu3Ke2cAE74djKEqGTMGI",
"object": "chat.completion",
"created": 1770872178,
"model": "gpt-4o-mini-2024-07-18",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "こんにちは!どうかされましたか?",
"refusal": null,
"annotations": []
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 8,
"completion_tokens": 8,
"total_tokens": 16,
"prompt_tokens_details": {
"cached_tokens": 0,
"audio_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 0,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
}
},
"service_tier": "default",
"system_fingerprint": "fp_842ff35899"
}
セキュリティの注意点
APIキー(sk-proj-...)は絶対に公開してはいけないので例えば安協変数を使う高校はこんな感じ
#!/bin/bash
API_KEY="$OPENAI_API_KEY"
curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY" \
-d '{
"model": "gpt-4o-mini",
"messages": [
{ "role": "user", "content": "こんにちは" }
]
}'
そして、実行前にターミナルで:
export OPENAI_API_KEY=<あなたのキー>
Gemini(Google AI Studio)APIキー発行・確認・再発行ページ
ここでできること
- Gemini APIキーの確認
- 新規キーの発行
- プロジェクト管理
こちらも同様に、既存キーの全文は再表示されないため、必要なら新規発行。
Gemini(Google AI)API の公式リファレンス
Curlをなげてみる
上のページで取得したAPIキーを使ってCurlからAPIをたたいてみる。これができれば、各種言語からfetchなどのリクエストを投げて加工するのも簡単です。
curlコード
$ curl -X POST \
-H "Content-Type: application/json" \
-d '{\
"contents": [\
{\
"role": "user",\
"parts": [\
{ "text": "こんにちは" }\
]\
}\
]\
}' \
"https://generativelanguage.googleapis.com/v1/models/\
gemini-2.5-flash-lite:generateContent?key=<GeminiのあなたのAPIキー>"
レスポンス例
{
"candidates": [
{
"content": {
"parts": [
{
"text": "こんにちは!どうされましたか?何かお手伝いできることはありますか?"
}
],
"role": "model"
},
"finishReason": "STOP",
"index": 0
}
],
"usageMetadata": {
"promptTokenCount": 2,
"candidatesTokenCount": 16,
"totalTokenCount": 18,
"promptTokensDetails": [
{
"modality": "TEXT",
"tokenCount": 2
}
]
},
"modelVersion": "gemini-2.5-flash-lite",
"responseId": "mjaFaaDqMbSX0-kPlMaUuQU"
}
Curlを連続で投げて話がつながるようにするには?
ChatGPT API も Gemini API も、サーバー側で会話状態を保持しない
= stateless。だから、こちらで会話履歴を管理する必要がある。
DBでも何でもよいが、履歴を保持してCurlするたびに渡す必要がある。
curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <GeminiのあなたのAPIキー>" \
-d '{
"model": "gpt-4o-mini",
"messages": [
{ "role": "user", "content": "こんにちは" },
{ "role": "assistant", "content": "こんにちは!今日はどうしますか?" },
{ "role": "user", "content": "元気ですか?" }
]
}'
でも、毎回全履歴を渡してたら重くなりすぎるので、例えばChatGPTでもGeminiでもすべてを毎回やり取りはしていないようだ。たとえば、直近 3〜5ターンだけ送る、重要な文脈だけ残す、古い履歴は捨てるといった方法をとる様かなと思う。まぁ、例えば日付なども前処理が必要で、APIに渡す前に少し手間がかかるのはお約束?