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_formattext.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 を通じて NoneLowMediumHighXHigh、および 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()?;

利用可能なラッパーには、OpenAIWebSearchToolOpenAIFileSearchToolOpenAICodeInterpreterToolOpenAIImageGenerationToolOpenAIComputerUseToolOpenAIMcpToolOpenAILocalShellToolOpenAIShellToolOpenAIApplyPatchTool があります。

前回のレスポンス 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 ステータスエラーカテゴリ再試行可能
401Unauthorizedいいえ
429RateLimitedはい
500, 502, 503, 504Unavailableはい
その他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-researcho4-mini-deep-research)では、明示的な background: true がなくてもバックグラウンドモードが自動的に有効になります。


7 つのシナリオを網羅した完全な例を examples/openai_responses/ で確認できます。

export OPENAI_API_KEY=sk-...
cargo run --manifest-path examples/openai_responses/Cargo.toml

対象となるシナリオ:

  1. 基本的な非ストリーミングチャット
  2. 基本的なストリーミングチャット
  3. 要約付き推論モデル(o4-mini 互換パス)
  4. 関数ツールを使用したツール呼び出し
  5. マルチターンの会話
  6. システム命令
  7. 温度と生成設定(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送信とポーリングのワークフロー
会話 APIcargo 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プロバイダーに依存しないエンドポイント


前へ: ← クラウドプロバイダー | 次へ: Ollama(ローカル) →