OpenAI Responses API
ADK-Rust は、OpenAI の Responses API(/v1/responses エンドポイント)専用クライアントを提供します。これは Chat Completions API の後継です。Responses API は、現在の GPT-5.6 モデル(推論強度の全範囲を含む)を使用する推奨方法です。
概要
┌─────────────────────────────────────────────────────────────────────┐
│ OpenAI Responses API Client │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ Endpoint: POST /v1/responses │
│ Client: OpenAIResponsesClient │
│ Config: OpenAIResponsesConfig │
│ Feature: openai │
│ │
│ Capabilities: │
│ • Streaming and non-streaming │
│ • Reasoning summaries │
│ • Tool / function calling │
│ • Multi-turn via previous_response_id │
│ • Built-in tools (web search, file search, code interpreter) │
│ • System instructions │
│ • Model-aware sampling controls and max_output_tokens │
│ • Automatic retry with exponential backoff │
│ │
│ vs Chat Completions (OpenAIClient): │
│ • Stateful conversations (server-side context) │
│ • Native reasoning summaries │
│ • Built-in tool hosting │
│ • Simpler multi-turn (no manual message history) │
│ │
└─────────────────────────────────────────────────────────────────────┘
どのクライアントをいつ使用するか
| 機能 | OpenAIClient(Chat Completions) | OpenAIResponsesClient(Responses) |
|---|---|---|
| エンドポイント | /v1/chat/completions | /v1/responses |
| モデル | チャット互換モデル | 現行の GPT および推論モデル |
| 推論の要約 | 利用不可 | ネイティブ対応 |
| 組み込みツール | 利用不可 | ウェブ検索、ファイル検索、コードインタープリター |
| サーバー側の状態 | 手動のメッセージ履歴 | previous_response_id |
| 構造化出力 | response_format | text.format(計画中) |
| 成熟度 | 安定して広く採用されている | より新しく、OpenAIによって推奨されている |
OpenAIResponsesClientは、要約、組み込みツール、またはOpenAIの最新のAPIを使用する場合に使用します。既存の Chat Completions ワークフローとの後方互換性にはOpenAIClientを使用してください。
インストール
[dependencies]
adk-rust = { version = "2.1.0", features = ["openai"] }
adk-tool = "2.1.0"
または、adk-modelを直接使用します。
[dependencies]
adk-model = { version = "2.1.0", features = ["openai"] }
APIキーを設定します。
export OPENAI_API_KEY="sk-..."
クイックスタート
use adk_rust::prelude::*;
use adk_rust::session::{CreateRequest, SessionService};
use adk_rust::futures::StreamExt;
use adk_model::openai::{OpenAIResponsesClient, OpenAIResponsesConfig};
use std::collections::HashMap;
use std::sync::Arc;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
dotenvy::dotenv().ok();
let api_key = std::env::var("OPENAI_API_KEY")?;
// 1. Create the Responses API client
let config = OpenAIResponsesConfig::new(&api_key, "gpt-5.6-terra");
let model = Arc::new(OpenAIResponsesClient::new(config)?);
// 2. Build an agent
let agent = Arc::new(
LlmAgentBuilder::new("assistant")
.instruction("You are a helpful assistant. Be concise.")
.model(model)
.build()?,
);
// 3. Create a session
let sessions: Arc<dyn SessionService> = Arc::new(InMemorySessionService::new());
sessions.create(CreateRequest {
app_name: "my_app".into(),
user_id: "user".into(),
session_id: Some("s1".into()),
state: HashMap::new(),
}).await?;
// 4. Run through the Runner
let runner = Runner::builder()
.app_name("my_app")
.agent(agent)
.session_service(sessions)
.build()?;
let message = Content::new("user").with_text("What is the capital of France?");
let mut stream = runner.run(
adk_rust::UserId::new("user")?,
adk_rust::SessionId::new("s1")?,
message,
).await?;
while let Some(event) = stream.next().await {
let event = event?;
if let Some(content) = &event.llm_response.content {
for part in &content.parts {
if let Some(text) = part.text() {
print!("{text}");
}
}
}
}
println!();
Ok(())
}
構成
基本構成
use adk_model::openai::OpenAIResponsesConfig;
// Minimal — just API key and model
let config = OpenAIResponsesConfig::new("sk-...", "gpt-5.6-luna");
// With organization and project
let config = OpenAIResponsesConfig::new("sk-...", "gpt-5.6-terra")
.with_organization("org-...")
.with_project("proj-...");
// Custom base URL (for proxies or compatible APIs)
let config = OpenAIResponsesConfig::new("sk-...", "gpt-5.6-terra")
.with_base_url("https://my-proxy.example.com/v1");
推論モデル
GPT-5.6 推論モデルの場合は、推論の強度と要約を設定します。
use adk_model::openai::{
OpenAIReasoningEffort, OpenAIResponsesClient,
OpenAIResponsesConfig, ReasoningSummary,
};
let config = OpenAIResponsesConfig::new("sk-...", "gpt-5.6-terra")
.with_reasoning_summary(ReasoningSummary::Detailed);
let model = OpenAIResponsesClient::new_with_reasoning_effort(
config,
OpenAIReasoningEffort::Max,
)?;
| 推論の強度 | 説明 |
|---|---|
None | 最低レイテンシーを実現するために推論を無効にする |
Minimal | 対応モデルでの従来の最小限の推論 |
Low | 低い推論労力 |
Medium | バランスの取れた推論 |
High | 高い推論労力 |
XHigh | 非常に高い推論労力 |
Max | サポートされているモデルでの最大限の推論 |
GPT-5.6 は、Responses API を通じて None、Low、Medium、High、XHigh、および Max をサポートします。Chat Completions は最大 XHigh までサポートします。
| 推論の概要 | 説明 |
|---|---|
Auto | モデルが概要を含めるかどうかを決定 |
Concise | 推論の簡単な概要 |
Detailed | 推論の詳細な要約 |
推論の要約はレスポンスストリーム内でPart::Thinkingとして表示され、モデルの思考プロセスをユーザーに示すことができます。
リトライ設定
use adk_model::retry::RetryConfig;
let client = OpenAIResponsesClient::new(config)?
.with_retry_config(RetryConfig {
max_retries: 3,
..Default::default()
});
レート制限(429)、サーバーエラー(500/502/503/504)、およびネットワーク障害の場合、リトライは自動的に行われます。
利用可能なモデル
| モデル | タイプ | 説明 |
|---|---|---|
gpt-5.6-terra | 推論 | 本番エージェント向けのバランスの取れたデフォルト |
gpt-5.6-sol | 推論 | 最高峰の推論とコーディング |
gpt-5.6-luna | 推論 | コスト効率に優れた大量処理ワークロード |
gpt-5.6 | 推論 | フラッグシップの別名 |
gpt-5 | 推論 | 旧世代との互換性 |
gpt-4.1 ファミリー | チャット | 互換性と明示的なサンプリング制御 |
o3 / o4-mini | 推論 | 旧世代の推論との互換性 |
機能
ツール呼び出し
Function ツールは OpenAIClient と同じように動作します。エージェントにツールを定義すると、runner がツール呼び出しのループを処理します。
use adk_rust::prelude::*;
use adk_model::openai::{OpenAIResponsesClient, OpenAIResponsesConfig};
use adk_tool::FunctionTool;
use std::sync::Arc;
async fn get_weather(
_ctx: Arc<dyn ToolContext>,
args: serde_json::Value,
) -> Result<serde_json::Value> {
let city = args["city"].as_str().unwrap_or("unknown");
Ok(serde_json::json!({
"city": city,
"temperature_f": 72,
"conditions": "Sunny"
}))
}
let weather_tool = FunctionTool::new(
"get_weather",
"Get current weather for a city. Requires a 'city' string parameter.",
get_weather,
);
let config = OpenAIResponsesConfig::new(&api_key, "gpt-5.6-terra");
let model = Arc::new(OpenAIResponsesClient::new(config)?);
let agent = LlmAgentBuilder::new("weather_agent")
.instruction("Use the get_weather tool to answer weather questions.")
.model(model)
.tool(Arc::new(weather_tool))
.build()?;
マルチターン会話
Runner はセッションを通じて会話履歴を自動的に管理します。各ターンのコンテキストは保持されます。
// Turn 1
let msg1 = Content::new("user").with_text("My name is Alice.");
let mut stream = runner.run(uid.clone(), sid.clone(), msg1).await?;
// ... consume stream ...
// Turn 2 — the model remembers the previous turn
let msg2 = Content::new("user").with_text("What is my name?");
let mut stream = runner.run(uid.clone(), sid.clone(), msg2).await?;
// Response: "Your name is Alice."
リクエストごとの推論オーバーライド
LlmRequest 拡張機能を使用して、リクエストごとに推論設定を上書きできます。
use adk_rust::prelude::*;
let agent = LlmAgentBuilder::new("flexible_reasoner")
.model(model)
.generate_content_config(GenerateContentConfig {
extensions: {
let mut ext = std::collections::HashMap::new();
ext.insert("openai".to_string(), serde_json::json!({
"reasoning": {
"effort": "high",
"summary": "detailed"
}
}));
ext
},
..Default::default()
})
.build()?;
組み込みツール
Responses API は OpenAI がホストするツールをサポートしています。adk-tool の型付きラッパーを優先して使用してください。
use adk_tool::OpenAIWebSearchTool;
use std::sync::Arc;
let agent = LlmAgentBuilder::new("researcher")
.model(model)
.tool(Arc::new(OpenAIWebSearchTool::new().preview()))
.build()?;
利用可能なラッパーには、OpenAIWebSearchTool、OpenAIFileSearchTool、OpenAICodeInterpreterTool、OpenAIImageGenerationTool、OpenAIComputerUseTool、OpenAIMcpTool、OpenAILocalShellTool、OpenAIShellTool、OpenAIApplyPatchTool があります。
前回のレスポンス ID
サーバー側の会話状態を使用する場合(ローカルのセッション履歴をバイパスする場合)は、previous_response_id を渡します。
let agent = LlmAgentBuilder::new("stateful")
.model(model)
.generate_content_config(GenerateContentConfig {
extensions: {
let mut ext = std::collections::HashMap::new();
ext.insert("openai".to_string(), serde_json::json!({
"previous_response_id": "resp_abc123"
}));
ext
},
..Default::default()
})
.build()?;
ストリーミングの動作
Responses API クライアントは、テキストと推論の差分をリアルタイムでストリーミングします。
- テキストの差分は、
partial: trueを伴うPart::Textとして到着します - 推論サマリーの差分は、
partial: trueを伴うPart::Thinkingとして到着します - Function 呼び出しは、正しい名前と引数を含む最終
ResponseCompletedイベントから発行されます - 最終イベントには、使用量メタデータと終了理由を含む
turn_complete: trueがあります
つまり、モデルの生成中はテキストがトークン単位で表示され、Function 呼び出しは実行可能な完全なオブジェクトとして到着します。
プロバイダーのメタデータ
すべてのレスポンスには、response_id とともにプロバイダーのメタデータが含まれます。
if let Some(meta) = &response.provider_metadata {
let response_id = meta["openai"]["response_id"].as_str();
// Use for previous_response_id, logging, debugging
}
追加のメタデータには、次のものが含まれる場合があります。
encrypted_content— 推論モデルから提供されるもの(コンテキストの保持用)built_in_tool_outputs— Web 検索、ファイル検索、コードインタープリターの結果
エラーハンドリング
エラーは、適切なカテゴリーを持つ構造化された AdkError にマッピングされます。
| HTTP ステータス | エラーカテゴリ | 再試行可能 |
|---|---|---|
| 401 | Unauthorized | いいえ |
| 429 | RateLimited | はい |
| 500, 502, 503, 504 | Unavailable | はい |
| その他 | Internal | いいえ |
match runner.run(uid, sid, message).await {
Ok(stream) => { /* process stream */ }
Err(e) if e.is_retryable() => { /* retry logic */ }
Err(e) if e.is_unauthorized() => { /* check API key */ }
Err(e) => { /* handle other errors */ }
}
バックグラウンドモードとキャンセル
長時間実行されるリクエストの場合は、background: true を付けて送信し、完了するまでポーリングします。
use adk_model::openai::{OpenAIResponsesClient, OpenAIResponsesConfig};
let client = OpenAIResponsesClient::new(config)?;
// Submit with background: true via extensions
let mut gen_config = GenerateContentConfig::default();
gen_config.extensions.insert("openai".into(), serde_json::json!({ "background": true }));
// ... send request, extract response_id from provider_metadata ...
// Poll until terminal status
let response = client.poll_response("resp_abc123").await?;
// Check provider_metadata["openai"]["status"]: "completed", "in_progress", "failed", "cancelled"
// Cancel a running background response
let cancelled = client.cancel_response("resp_abc123").await?;
ディープリサーチモデル(o3-deep-research、o4-mini-deep-research)では、明示的な background: true がなくてもバックグラウンドモードが自動的に有効になります。
例
7 つのシナリオを網羅した完全な例を examples/openai_responses/ で確認できます。
export OPENAI_API_KEY=sk-...
cargo run --manifest-path examples/openai_responses/Cargo.toml
対象となるシナリオ:
- 基本的な非ストリーミングチャット
- 基本的なストリーミングチャット
- 要約付き推論モデル(
o4-mini互換パス) - 関数ツールを使用したツール呼び出し
- マルチターンの会話
- システム命令
- 温度と生成設定(
gpt-4.1-nano互換パス)
追加の例
6 つの独立したサンプルクレートで、Responses API の具体的な機能を説明しています。
| 例 | 実行コマンド | 機能 |
|---|---|---|
| WebSocket トランスポート | cargo run --manifest-path examples/openai_ws_minimal/Cargo.toml | 低遅延の永続接続 |
| バックグラウンドモード | cargo run --manifest-path examples/openai_background/Cargo.toml | 送信とポーリングのワークフロー |
| 会話 API | cargo run --manifest-path examples/openai_conversations/Cargo.toml | サーバー管理のマルチターン |
| 組み込みツール | cargo run --manifest-path examples/openai_builtin_tools/Cargo.toml | 画像生成、ウェブ検索 |
| 深層調査 | cargo run --manifest-path examples/openai_deep_research/Cargo.toml | 自動バックグラウンド調査 |
| オープンなレスポンス | cargo run --manifest-path examples/openai_open_responses/Cargo.toml | プロバイダーに依存しないエンドポイント |
関連
- クラウドモデルプロバイダー — サポートされているすべてのLLMプロバイダー
- Ollama(ローカル) — モデルをローカルで実行
- LlmAgent — エージェントでモデルを使用
- 関数ツール — エージェントにツールを追加
前へ: ← クラウドプロバイダー | 次へ: Ollama(ローカル) →