ChatGPT APIの「InvalidRequestError: Unrecognized request argument」エラー原因と解決方法
このエラーで何が起きているか
「InvalidRequestError: Unrecognized request argument」というエラーは、ChatGPT APIに送信したリクエストに、そのバージョンが認識できないパラメータ(引数)が含まれていることを示しています。つまり、APIの仕様に存在しないキーをJSONで渡してしまっているということです。
このエラーが出ると、APIへのリクエストが完全に拒否されるため、チャット機能やテキスト生成が全く動作しなくなります。開発中はもちろん、本番環境でも同じことが起きれば、ユーザーに迷惑がかかります。
よくあるパターンが「バージョンの不一致」です。2023年11月のopenai 1.0.0リリースで openai.ChatCompletion という使い方が廃止されました。旧バージョン(openai < 1.0.0)の書き方で新しいバージョン(openai >= 1.0.0)のライブラリを実行すると、Pythonが「そんな引数は知りません」という意味のエラーを返します。
エラーが発生する主な原因
1. パラメータ名のタイプミスまたは古い名前の使用
最も多い原因は、APIドキュメントに記載されていないパラメータ名をリクエストに含めることです。例えば、以下のようなケースが考えられます。
- 古いドキュメントやブログ記事を参考にして、廃止されたパラメータ名を使っている
- パラメータ名を間違えて入力している(スペルミスなど)
- 別のAI APIのパラメータ名と混同している
OpenAIの公式APIドキュメントでは定期的に仕様が更新されるため、参考ページの日付をきちんと確認することが重要です。
2. APIバージョンの不一致
使用しているSDK(Python、JavaScript、Node.jsなど)のバージョンが古い場合、最新のOpenAI APIで追加されたパラメータに対応していないことがあります。逆に、古いAPIを使用しているのに新しいパラメータを送信しても、エラーが発生します。
3. JSONの構造が間違っている
リクエストボディのJSON形式が不正な場合、APIが想定外のキーとして解釈することがあります。ネストが深すぎる、キー名がダブルクォートで囲まれていない、カンマが抜けているなど、JSON構文のエラーが原因になることもあります。
原因の確認:自分のバージョンはどちらか
まずは今インストールされているopenai ライブラリのバージョンを確認しましょう。
pip show openai
実行結果がこんな感じで表示されます:
Name: openai
Version: 1.3.0
Summary: The official Python library for the OpenAI API
...
バージョンが 1.0.0 以上なら、コード側を新しい形式に書き直す必要があります。
エラーが起きるコード(旧形式)
この書き方だとエラーになります:
import openai
openai.api_key = "sk-xxxx..."
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "こんにちは"}
]
)
print(response.choices[0].message.content)
上記を openai >= 1.0.0 で実行すると:
AttributeError: module 'openai' has no attribute 'ChatCompletion'
または:
InvalidRequestError: Unrecognized request argument supplied: messages
というエラーが出ます。
解決方法1:コードを新形式に書き直す(推奨)
openai >= 1.0.0 では、APIキーの設定方法と呼び出し方法が両方変わりました。以下が新しい正しい形式です:
from openai import OpenAI
client = OpenAI(api_key="sk-xxxx...")
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "user", "content": "こんにちは"}
],
temperature=0.7,
max_tokens=100
)
print(response.choices[0].message.content)
何が変わったか
| 項目 | 旧形式(< 1.0.0) | 新形式(>= 1.0.0) |
|---|---|---|
| インポート | import openai | from openai import OpenAI |
| APIキー設定 | openai.api_key = "sk-..." | client = OpenAI(api_key="sk-...") |
| 呼び出し | openai.ChatCompletion.create() | client.chat.completions.create() |
| 結果の形式 | 辞書形式 | オブジェクト形式 |
環境変数から自動でAPIキーを読み込む場合
from openai import OpenAI
# 環境変数 OPENAI_API_KEY が自動的に読み込まれます
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "user", "content": "こんにちは"}
]
)
print(response.choices[0].message.content)
この場合、事前に以下のコマンドで環境変数を設定しておいてください:
Linux/Mac の場合:
export OPENAI_API_KEY='sk-xxxx...'
Windows PowerShell の場合:
$env:OPENAI_API_KEY='sk-xxxx...'
Windows コマンドプロンプト の場合:
set OPENAI_API_KEY=sk-xxxx...
解決方法2:SDKをアップデートする
Python、Node.js、JavaScriptなどのSDKを使っている場合、古いバージョンが原因かもしれません。以下のコマンドでアップデートしてください。
Python の場合:
pip install --upgrade openai
Node.js / JavaScript の場合:
npm install openai@latest
アップデート後、古いコードが新しいSDKで正しく動作するかテストしてください。SDKの新しいバージョンでは、パラメータ名が変更されていたり、バリデーションが厳しくなっていたりする場合があります。
また、JavaScript(Node.js)での正しいリクエスト形式は以下の通りです:
const OpenAI = require('openai');
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY
});
async function chat() {
try {
const response = await openai.chat.completions.create({
model: "gpt-4o",
messages: [
{
role: "user",
content: "こんにちは"
}
],
temperature: 0.7,
max_tokens: 100
// 以下のような古いパラメータはNG:
// "max_completion_tokens": 100, // ← 廃止されたパラメータ
// "frequency_penalty_range": [0, 2] // ← 存在しないパラメータ
});
console.log(response.choices[0].message.content);
} catch (error) {
console.error("Error:", error.message);
}
}
chat();
解決方法3:旧バージョンを使い続ける
コードを修正できない理由がある場合は、openai ライブラリを旧バージョンに落とすことも可能です。ただ、セキュリティアップデートが適用されなくなるため、本来は推奨されません。
pip install 'openai<1.0.0'
旧バージョンであれば、openai.ChatCompletion.create() の書き方がそのまま動きます。
ただし、この方法は一時的な回避策と考えてください。 長期的には必ず新形式に書き直した方がいいです。
よくあるつまずきポイント
1. 古いブログ記事やStack Overflowの回答を参考にしてしまう
インターネットには2023年以前の古い記事が大量に存在します。OpenAIのAPIは仕様が頻繁に変更されるため、記事の日付をきちんと確認してください。特に以下のパラメータは過去に名前が変わっているので注意が必要です。
max_tokensは正しい(max_completion_tokensではない)presence_penaltyとfrequency_penaltyが存在する(両方を同時に指定可能)
2. メッセージの結果を辞書として扱おうとするとエラー
新形式では結果がオブジェクトなので、こういう書き方は動きません:
# NG: 新形式ではこう書くと KeyError が出ます
message = response["choices"][0]["message"]["content"]
正しい書き方:
# OK: オブジェクトのドット記法で値を取得
message = response.choices[0].message.content
3. SDKのバージョンと公式ドキュメントが異なるバージョンを参考にしている
OpenAI公式のPythonクライアントは v0.x から v1.0 への移行時に、コードの書き方が大きく変わりました。古い v0.x のコードを v1.0 以上のSDKで実行すると、当然エラーが出ます。自分が使っているSDKのバージョンに対応したドキュメントを確認するようにしましょう。
4. TypeScriptで型定義がない場合
TypeScriptを使っている場合、IDEの型チェックがエラーを事前に警告してくれることがあります。型定義を活用すれば、無効なパラメータをコンパイル時に発見できます。
import OpenAI from "openai";
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY
});
async function chat() {
const response = await openai.chat.completions.create({
model: "gpt-4o",
messages: [
{
role: "user",
content: "こんにちは"
}
],
temperature: 0.7,
max_tokens: 100
// IDEが無効なキーをリアルタイムで指摘する
});
console.log(response.choices[0].message.content);
}
chat();
5. APIキーが間違っていないのにエラーが出る場合
“Unrecognized request argument” というメッセージの場合、実は API キーの問題ではなく、コードの書き方が問題です。再度上記の「新形式」コードと見比べて、形式が一致しているか確認しましょう。エラーメッセージを見ると、どのパラメータが認識されていないのか書かれていることがあります:
InvalidRequestError: Unrecognized request argument supplied: max_completion_tokens
このメッセージから「max_completion_tokens」が問題だと判断でき、それを削除または正しい名前に変更すれば解決します。
移行チェックリスト
既存プロジェクトを新形式に移行するときは、以下を確認してください:
# 1. 現在のバージョンを確認
pip show openai
# 2. 最新の openai ライブラリにアップグレード
pip install --upgrade openai
# 3. コード内の以下を全て置き換え:
# openai.api_key = ... → client = OpenAI()
# openai.ChatCompletion.create(...) → client.chat.completions.create(...)
# response["choices"][0]["message"]["content"] → response.choices[0].message.content
実装後は、簡単なテストコードで動作確認しましょう:
from openai import OpenAI
client = OpenAI(api_key="sk-xxxx...")
# テスト実行
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "テスト"}]
)
# 正常に動作すればメッセージが表示される
print("成功:", response.choices[0].message.content)
応用:複数のエラーメッセージと対応表
ChatGPT API使用時に出るエラーはいくつかパターンがあります。このエラーが出た時の判断材料にしてください:
| エラーメッセージ | 原因 | 対処法 |
|---|---|---|
module 'openai' has no attribute 'ChatCompletion' | openai >= 1.0.0で旧形式コード | 新形式に書き直す |
InvalidRequestError: Unrecognized request argument | 引数の名前や形式が新仕様と異なる | コード内の全引数を確認 |
AuthenticationError: Incorrect API key | APIキーが無効または有効期限切れ | OpenAIダッシュボードで新しいキーを取得 |
RateLimitError: Rate limit exceeded | APIの呼び出し回数が多すぎる | 呼び出し間隔を広げるか、待機処理を入れる |
参考:公式ドキュメント対応
OpenAI公式ドキュメントでも、openai 1.0.0以降の新形式での実装が記載されています。古い書籍やオンライン記事を参考にする場合は、記事の公開日がいつか確認してから参考にするといいでしょう。
openai ライブラリが 1.0.0 以降に更新されたのは2023年11月なので、それ以前の記事や解説は旧形式で書かれていることが多いです。
次のステップ
新形式への移行ができたら、以下の活用を検討してください:
- 非同期処理への対応:AsyncOpenAIを使った高速化
- エラーハンドリング強化:try-except で例外をキャッチし、詳細なログを記録することで問題発生時の原因特定が容易になる
- トークン数管理:tiktoken ライブラリで入力文字数を事前計算
- 複数モデルの使い分け:gpt-4o や gpt-4o-mini などの使い分け戦略
- SDKバージョンの固定:本番環境では SDKバージョンを固定して、テスト環境で新バージョンを検証してから本番に反映させる
あわせて読みたい
- Claude Code 403 Forbiddenエラー【原因・解決手順】APIキー・権限設定
- Claude Code「Connection timeout」エラーの原因と解決方法|3つの対処法
- Claude Code「Extension Not Found」エラーの原因と解決方法|3ステップで直す