Skip to main content
Function Calling(FC)はエージェント構築の基盤です: モデルは関数を実行しません — ただ「どの関数を、どの引数で呼び出すか」を出力するだけです。実行はご自身のコードで行い、その結果をモデルに返すと、モデルが最終回答を生成します。 このページは、公式 OpenAI ドキュメント(developers.openai.com/api/docs/guides/function-calling、2026年6月時点)を基にしています。両方のエンドポイント向けの例は、そのままコピーして使えます。

完全なコールループ

1

関数を定義する

関数名、説明、パラメータ JSON Schema をリクエストと一緒に送信します
2

モデルが呼び出しを返す

モデルが呼び出しを行うと判断すると、関数名と JSON 引数を返します
3

ローカルで実行する

コードが引数をパースし、実際に関数を実行します(DB を照会する、外部 API を呼び出す…)
4

結果を送り返す

結果を会話とともに 2 回目のリクエストで送信すると、モデルはそれに基づいて回答します

2 つのエンドポイント間のキー形式の違い

同じ機能ですが、/v1/chat/completions/v1/responses ではフィールド形式が異なります。これが最もよくある統合の落とし穴です:
この 2 つの形式は混在できません。Chat Completions のネストされた function: {...} 定義を /v1/responses に送る(またはその逆にする)ことは、SDK の「invalid parameter」エラーの最も一般的な原因です。

Chat Completions の完全な例

完全な define → call → execute → return ループを通じた天気の検索:

完全な例: 応答

3つの違いに注目してください。ツール定義はフラットで、呼び出しはトップレベルの function_call アイテムとして返され、結果は function_call_output として返されます。previous_response_id を使うと、2回目のリクエストで完全な履歴を再送する必要はありません:

strict モード (構造化出力)

strict: true は、モデルの引数が JSON Schema に厳密に一致する ことを保証します — 幻覚によるフィールドや欠落したフィールドはありません。要件は 3 つです:
  1. スキーマには "additionalProperties": false を含める必要があります
  2. すべてのフィールドは required に必ず含める必要があります(オプションは "type": ["string", "null"] で表します)
  3. サポートされている JSON Schema のサブセットのみ(基本型、enum、配列、ネストされたオブジェクト、…)
strict モード は parallel function calls と併用できません: strict なスキーマ保証が必要な場合は、parallel_tool_calls: false も設定してください。

parallel_tool_calls と tool_choice

並列呼び出し

parallel_tool_calls はデフォルトでオンです: モデルは1回のターンで複数の関数を要求できます(例: 北京と上海の天気を同時に取得するなど)。それぞれを実行したら、次のリクエストの前に すべての結果を返してください — 各結果は、その call_id (レスポンス) または tool_call_id (チャット) に対応していなければなりません。

tool_choice の戦略

allowed_tools の部分集合

多くのツールがあるものの、このターンでは一部だけ公開したい場合は、allowed_tools 形式の tool_choice を使って呼び出し可能なサブセットを制限します — これは tools リスト自体を変更しない ため、キャッシング の安定したプレフィックスを壊しません:

ストリーミング中の関数呼び出し

チャット補完: インデックスごとに組み立てる

関数引数は断片ごとにストリーミングされます。index ごとに arguments 文字列を蓄積し、ストリーム終了後に json.loads します:

Responses: セマンティックイベントを監視する

response.function_call_arguments.delta イベントは引数の増分を運び、response.function_call_arguments.done が完全な引数を返します — インデックスを手動で組み立てる必要はありません。

ベストプラクティスと落とし穴

優れたツール定義の書き方:
  • 名前と説明はモデル向けに書く: 「いつ呼び出すか」を明確に記述します。例: "Get real-time weather; call only when the user explicitly asks about weather"
  • enum でパラメータを絞り込む: 値を列挙できるなら、自由形式の文字列は使わないでください。これで幻覚による引数の大半を防げます
  • ツール定義はプロンプトの早い段階に置き、安定させる: ツールはキャッシュプレフィックスに参加します。安定した定義にすると入力が 90% オフになります(キャッシュ課金 を参照)
  • エージェントループに上限を設ける: 最大ラウンド数を設定し、モデルが call → return → call の循環で無駄に課金を発生させないようにします
よくある落とし穴:

モデル対応と選択

gpt-5シリーズ全体で関数呼び出しに対応しています。シナリオ別には次のとおりです。

関連リンク

  • このグループ: Native Calls · Compatible Mode · Cache Billing
  • token の取得 / 管理: https://api.apiyi.com/token
  • OpenAI 公式ドキュメント: developers.openai.com/api/docs/guides/function-calling