OpenAI Responses API と Agents SDK リリースのまとめ
はじめまして!OpenAI の Developer Experience チームに加わった瀬良(@seratch)と申します。
前職の Slack では公式 SDK の開発と Developer Relations の活動を担当していました。OpenAI でも開発者の皆さんのお役に立てるよう幅広く活動していきますので、よろしくお願いします!
エージェント開発のための新たなツール
OpenAI は、日本時間の 3/12 未明にエージェント型のアプリケーション開発のための新しい API セットと Agents SDK を発表しました。
公式発表も日本語化されていますので、ぜひそちらもお読みください。この記事では実際に利用する上での技術的なポイントを整理してご紹介します。
tl;dr (要点だけ知りたい方向けのまとめ)
後半ではコード例も交えて、詳しく解説していきますが、まずは、すでに OpenAI のプラットフォームに馴染みがあり、要点だけを知りたいという方向けに重要なポイントを整理します。
Responses API
- Chat Completions のシンプルな使いやすさと Assistants (beta) のツール機能を統合
- やりとりが継続している会話の状態を OpenAI 側に管理させることが可能
- これまでの画像ファイルに加えて PDF ファイルを参照した指示が可能(後述の通り、様々な形式のファイルをベクトルストアに追加した上で「ファイル検索」ツールで参照することも可能)
- 今回リリースの組み込みツールだけでなく、今後リリースされる全てのツールを利用可能
- デフォルト設定でリクエストログのダッシュボードを利用可能
- Chat Completions に対して全ての面で上位互換、新規開発では Responses を推奨
- Chat Completions は互換性のある新モデルの提供を含め、今後もサポートを継続
- Assistants (beta) は 2026 年半ばを目処にサポート終了予定(詳細な移行ガイドを提供)
- Playground や Next.js サンプルアプリでフル機能を簡単に試せる
組み込みツール
-
Web 検索(ChatGPT と同じモデル)
- Responses はツールの一つとして利用可能(gpt-4o / gpt-4o-mini モデルのみ)
- Chat Completions ではモデルとしてのみ利用可能
- 価格はこちらを参照
-
ファイル検索(ベクトルストア)
- Assistants (beta) で利用可能だったベクトルストア機能を正式版としてリリース、Responses のツールの一つとして利用可能
- Files API でファイルをアップロード後にベクトルストアに追加することで検索可能
- 今回のリリースでメタデータのフィルタリングなどいくつかの機能を新たに追加
- 価格はこちらを参照
-
コンピュータ操作
- Operator と同様に CUA (Computer-Using Agent) モデルを利用
- 初期リリース時点では Tier 3〜5 の開発者に提供
- Playwright、Docker、Browserbase、Scrapybara のサンプルアプリ
- 現時点では非ブラウザ環境での利用は人による監視下での実行を推奨
- 価格はこちらを参照
- 今後 Code Interpreter も提供される予定
- 組み込みのツールと自前の Function Calling を併用することも可能
Agents SDK
- 実験的な SDK として公開した Swarm で得た知見をもとに開発された正式版のツール
- シンプルなエージェントからマルチエージェントまでオーケストレーション可能
- ハンドオフ、ガードレール、ツール実行などの実装パターンをサポート
- 新しく追加されたトレーシング画面をデフォルト設定で利用可能
- 基本的には内部で Responses API を利用するが、Chat Completions 互換の外部サービスを利用したコードも Agent として組み込むことが可能
- 今回の発表時点では Python 版のみを提供、今後 Node.js 版もリリース予定
統合オブザーバビリティツール
- エージェント型ワークフローの実行状況を追跡・可視化
- Agents SDK を使っていれば、新しいトレーシング画面をデフォルト設定で利用可能
- API を直接使っている場合もリクエストログのダッシュボードを利用可能
- 組み込みのトレーシングに加えてコード内のカスタムスパン機能も利用可能
- 外部サービス・ツールとの連携も可能
公式発表に必要な情報がかなり網羅されていますので、そちらもぜひご確認ください。
それでは、ここからは各機能についてコード例や画面の様子を紹介しながら、少し深掘りしていきたいと思います。
Responses API
Responses API は、エージェント開発向けの新しい API です。これまで広く利用されてきた Chat Completions のシンプルな使いやすさと Assistants (beta) でのみ提供されていた強力なツール機能をシームレスに統合しています。
Chat Completions との機能面での違いについては、こちらに網羅的にまとまっています。ご覧の通り、Responses は全ての面で Chat Completions の上位互換となっていますので、これからの新規のアプリ開発では Responses をおすすめします。とはいえ、Chat Completions も互換性のあるモデルのリリースやサポートは継続されますので、既存のアプリを急いで移行する必要はありません。Responses でしか使えない機能が必要になった際には移行を検討してください。
この記事では Python のコード例とともに紹介していきますが、とりあえず試すなら Playground で試してもらうのが一番簡単だと思います。
また、私のチームからツールの利用も含めた Next.js サンプルアプリも公開していますので、そちらも試してみてください。
基本的な利用方法で最初に気づく Chat Completions との違いは Responses では会話のステート管理をできるようになっているということでしょう。
Chat Completions では、会話全体を表現する messages: List[Dict[str, str]]
を渡すだけのステートレスな呼び出し方法しかなかったのに対して、Responses では OpenAI プラットフォーム側で会話の状態を管理できるようになりました。これにより、一つ前の応答の response.id
を previous_response_id
として渡し、入力は新しいものだけを渡せるようになりました。
この違いにより、パラメーター設計では、今までの messages
という配列ではなく、Instruction Tuning の形式のように instructions
と input
の二つを渡すよう変更しました(利用可能なパラメーターはこちらを参照)。
instructions
はこれまでのシステムプロンプトのようなイメージです。やりとりが始まってからの previous_response_id
を指定した呼び出し時に新しい instructions
を指定すると、それまでの instructions
は破棄され、以降は指定された新しい instructions
に従います。一方で input
の使い方は、これまでよりも幅広いパターンがありますので、順に紹介していきます。
それでは、実際のコードで試してみましょう。
まず、最もシンプルなのは、instructions
なしで単一のテキストプロンプトとして渡すやり方です。配列を渡さなくてよいので、コードがシンプルになりました。
from openai import OpenAI
client = OpenAI() # export OPENAI_API_KEY=sk-proj-....
response = client.responses.create(
model="gpt-4o-mini",
input="asyncio を使った main.py の雛形を作成し、そのコード例だけを出力してください。"
)
print(response.output_text)
response.output_text
で出力に簡単にアクセスできます。
import asyncio
async def main():
print("Hello, asyncio!")
await asyncio.sleep(1)
print("Done!")
if __name__ == "__main__":
asyncio.run(main())
次は input
だけではなく instructions
と組み合わせてみましょう。
from openai import OpenAI
client = OpenAI() # export OPENAI_API_KEY=sk-proj-....
response = client.responses.create(
model="gpt-4o-mini",
instructions="指定された内容に関係のある俳句を考えて、その季語について解説してください。「春」「夏」「秋」「冬」という語は、俳句の中に一切含めてはいけません。",
input="東京",
)
print(response.output_text)
実行するとこんな感じになります。
霞立ち 空遠くなる 都会の日
### 季語の解説
この俳句では、季語「霞」を使用しています。「霞」は春の季語で、春先に空気中の水分が増えることで遠くの景色がぼんやりする現象を指します。都会のビル群の上に霞がかかり、東京の空がより遠く感じられる様子を描写しています。霞は春の訪れを告げる自然現象の一つであり、その儚さと柔らかさが春の穏やかさを表現します。
最初に説明したように Responses では、会話のステートがデフォルトでは自動的に保持されているので、二回目以降は previous_response_id
とともに input
だけでリクエストできます。例えば、こんなコードです。
from openai import OpenAI
client = OpenAI() # export OPENAI_API_KEY=sk-proj-....
response = client.responses.create(
model="gpt-4o-mini",
instructions="指定された内容に関係のある俳句を考えて、その季語について解説してください。「春」「夏」「秋」「冬」という語は、俳句の中に一切含めてはいけません。",
input="東京",
)
print(response.output_text)
response = client.responses.create(
model="gpt-4o-mini",
input="奈良",
previous_response_id=response.id,
)
print(response.output_text)
これの結果は、以下のようになります。
さて、「東京」をテーマにした俳句を考えてみました。
**俳句:**
都市の音 昼も夜も 蝉時雨
**季語:**
蝉時雨
**解説:**
「蝉時雨」とは、夏の季語で、特に蝉の声が重なり合って聞こえる様子を指します。この音は、日中の暑さを強調し、活気ある都市の中での一時を感じさせます。東京のような大都市では、蝉の声が背景音の一部となり、忙しい日常の中でも自然の息吹を感じることができます。蝉時雨は、過ぎ去る季節を象徴するものとしても位置付けられ、静けさと喧噪の狭間にある微妙な感情を表現しています。そのため、この俳句は東京の都市的な側面と共に、自然が融け込む瞬間を映し出しているといえるでしょう。
奈良をテーマにした俳句を考えてみました。
**俳句:**
鹿の声 時の流れを 古都知る
**季語:**
鹿の声(初夏)
**解説:**
この俳句では、奈良の象徴ともいえる鹿の声を通じて、古都の悠久の歴史を感じる様子を表現しています。奈良は古代の都として、多くの文化遺産や自然が共存しており、鹿たちがその土地に根付いていることが感じられます。鹿の声は、歴史と自然が調和した瞬間を象徴しており、奈良の静寂さや神秘的な雰囲気を思い起こさせます。古都特有の時間の流れを感じる一瞬を捉えた詩情あふれる句です。
なお、トークンのカウントについては、Chat Completions で全てのメッセージを引き回していたやり方と基本的には同等になります。ログの確認画面を使って確認してみてください。
ここまでは input
に単一の文字列を渡していましたが、オブジェクトの配列を渡すこともできます。
response = client.responses.create(
model="gpt-4o",
input=[
{
"role": "user",
"content": [
{"type": "input_text", "text": "画像に何が写っていますか?"},
{
"type": "input_image",
"image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
},
],
}
],
)
print(response.output_text)
上のコード例は Wikipedia にアップロードされているこちらの画像に写っているものを質問しています。
実行すると「画像には、緑豊かな草原を貫く木製のボードウォークが描かれています。空には青空と雲が広がっており、自然豊かな風景が広がっています。」という回答が返ってきます。
さらに、今回のリリースから画像だけでなく、 PDF ファイルを参照した指示ができるようになりました。ローカルにある paper.pdf
というファイルをアップロードしてそれについて質問してみます。
ファイルを参照させるには二種類のやり方があります。一つ目は、このように PDF ファイルのコンテンツを Base64 エンコードして埋め込む方法です。
from openai import OpenAI
import base64
client = OpenAI() # export OPENAI_API_KEY=sk-proj-....
with open("./paper.pdf", "rb") as f:
data = f.read()
base64_string = base64.b64encode(data).decode("utf-8")
response = client.responses.create(
model="gpt-4o",
input=[
{
"role": "user",
"content": [
{
"type": "input_file",
"filename": "paper.pdf",
"file_data": f"data:application/pdf;base64,{base64_string}",
},
{"type": "input_text", "text": "著者の一覧を教えてください"},
],
},
],
)
print(response.output_text)
もう一つは、Files API でアップロードして、そのファイルの ID を指定する方法です。アップロードしたファイルは、管理画面の Storage タブで確認できます。
file = client.files.create(
file=open("./paper.pdf", "rb"),
purpose="assistants",
)
response = client.responses.create(
model="gpt-4o",
input=[
{
"role": "user",
"content": [
{"type": "input_file", "file_id": file.id},
{"type": "input_text", "text": "著者の一覧を教えてください"},
],
},
],
)
print(response.output_text)
ファイルを添付している場合も、その内容をログの確認画面で見ることができます。
この記事では触れませんが、今まで通り streaming で出力を受け取ることもできますし、JSON スキーマに従って出力の形式をコントロールすることもできます。今回のリリースのタイミングで、多くのドキュメントページが大幅にアップデートされていますので、ぜひ確認してみてください。
組み込みツール
Responses API の基本的な使い方がわかったところで、次はツールを実行してみましょう。
Responses API では、現時点で Web 検索、ファイル検索(ベクトルストア)、コンピュータ操作という三つの組み込みツールを利用することができます。これに加えて、Assistants (beta) で利用可能だった Code Interpreter も今後提供される予定です。
Web 検索
一つ目は Web 検索です。このツールのバックエンドには ChatGPT で利用できる Web 検索と同じモデルが使われています。
response = client.responses.create(
model="gpt-4o",
tools=[{"type": "web_search_preview"}],
input="OpenAI の API プラットフォーム関連で、最新のリリースについて調べてください",
)
print(response.output_text)
以下のような結果が返ってきます。
OpenAIは最近、開発者向けに新たなツールやAPIを発表しました。2025年3月11日、OpenAIは「Responses API」を公開しました。これは、複雑なタスクを人間の介入なしに実行できる高度なAIエージェントの構築を支援するもので、従来のAssistants APIに代わるものです。この新しいAPIは開発者に無料で提供され、旧APIは2026年半ばまでに段階的に廃止される予定です。 ([reuters.com](https://www.reuters.com/technology/artificial-intelligence/openai-launches-new-developer-tools-chinese-ai-startups-gain-ground-2025-03-11/?utm_source=openai))
また、2024年12月18日には、OpenAIは「OpenAI o1」のAPIを正式にリリースしました。このモデルは、関数呼び出し、構造化出力、画像推論、開発者メッセージ、推論努力の調整といった機能を備えており、複雑なタスクの処理能力が向上しています。さらに、リアルタイムAPIのWebRTC対応や、GoおよびJava向けの公式SDKの提供も開始され、開発者の利便性が大幅に向上しました。 ([gigazine.net](https://gigazine.net/news/20241218-openai-o1-api/?utm_source=openai))
これらのリリースにより、OpenAIは開発者が高度なAIエージェントやアプリケーションを構築するための強力なツールを提供し、AI技術の進化と普及を促進しています。
## OpenAIの最新リリースに関するニュース:
- [OpenAI launches new developer tools as Chinese AI startups gain ground](https://www.reuters.com/technology/artificial-intelligence/openai-launches-new-developer-tools-chinese-ai-startups-gain-ground-2025-03-11/?utm_source=openai)
- [OpenAI reveals GPT-4.5 amid flurry of new AI model releases](https://www.ft.com/content/117ec9b2-745d-4c37-bfc4-6e545a7d3ac1?utm_source=openai)
今回のリリース時点では、gpt-4o と gpt-4o-mini の二つのモデルでのみ利用可能です。
また、tools
パラメーターには Web 検索と他の組み込みツール、自前の Function Calling も一緒に指定することができます。うまく組み合わせると、最新の情報を利用してより複雑な処理を実装できます。例えば、まずはファイル検索で社内の情報を検索し、さらに Web 検索で公開情報も収集する・・といった二段構えの処理を簡単に実装できます。
今回リリースされた三つの組み込みツールのうち、Web 検索だけは Chat Completions でもモデルとしてのみ利用可能です。ただし、これはツールとしての利用ではないので Responses API のように他のツールと組み合わせることはできません。
ファイル検索(ベクトルストア)
ファイル検索は、ベクトルストアに登録されたファイルの中身をセマンティック検索できる組み込みツールです。予めベクトルストアに登録されているドキュメント群の中から、プロンプトに関連性の高いドキュメントを特定します。
ちなみに、上の Responses API の例では、input
に画像や PDF ファイルを Base64 エンコーディングで埋め込んだり、Files API でアップロードしてその ID を参照したりしていました。ちょっと紛らわしいかもしれませんが、このアプローチは「ファイル検索」のツール実行ではありません。input
でファイルを参照しているということは、そもそも検索せずともすでにファイルを特定できていますし、ベクトルストアも使っていないからです。
「ファイル検索」の説明に戻りましょう。
これまで Assistants (beta) でのみ利用可能だったベクトルストア機能を、メタデータのフィルタリングなどいくつか機能の追加を行なった上で、正式版としてリリースしました。今後は Responses のツールの一つとして利用可能です。また、「ツール」としてではなく、単体の Retrieval 機能として、直接呼び出して使うことも可能です。
このツールを利用する手順は、
という下準備をした上で、そのベクトルストアの ID をファイル検索のツールに指定する、という流れになります。
非常に単純な例で試してみましょう。そのままコピペして実行すれば動くはずです。
from openai import OpenAI
import time
client = OpenAI()
# テキストファイルをアップロード
file = client.files.create(
file=(
"seratch-preference.txt", # ファイル名
"瀬良さんが好きな食べ物は「納豆」です。".encode("utf-8"), # bytes
),
purpose="assistants",
)
print(file)
# ベクトルストアを作成し、上のファイルを初期データとして登録
vector_store = client.vector_stores.create(
name="seratch-preference",
file_ids=[file.id],
)
print(vector_store)
# ベクトルストアが利用可能になるまで待つ
while client.vector_stores.retrieve(vector_store.id).status != "completed":
print("ベクトルストアが利用可能になるまで待ちます...")
time.sleep(0.3)
print(vector_store)
# Responses API でファイル検索のツールを利用
response = client.responses.create(
model="gpt-4o-mini",
input="瀬良さんが好きな食べ物は?",
tools=[{"type": "file_search", "vector_store_ids": [vector_store.id]}],
)
print(response.output_text)
「納豆が好き」という回答が返ってくれば成功です。
Cookbook により詳細な RAG の実装例 が掲載されていますので、ご興味あればご覧ください。
また、登録できるファイルの種類や、そのサイズや数など上限が決められているものもありますので、詳しくはドキュメントを参照してください。ベクトルストアの価格や技術的な詳細についてはこちらをご確認ください。
コンピュータ操作
コンピュータ操作は、ブラウザ操作を指示できるプロダクトである Operator と同様に CUA (Computer-Using Agent) モデルを利用しています。このモデルはマウス・キーボードの操作を実行できるので、ブラウザ操作だけでなく OS 上の任意の操作をエージェントに依頼することができます。
初期リリース時点では Tier 3〜5 の開発者の方にのみ提供されています。サンプルコードを実行してみて「モデルが見つからない」というエラーになった場合は、ご自身の Tier で利用できるようになるまで、今しばらくお待ちください🙇
早速、試してみましょう。公式のサンプルアプリをダウンロードしてきて、依存ライブラリをインストールします。
git clone https://github.com/openai/openai-cua-sample-app.git
cd openai-cua-sample-app
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
そして Tier 3 以上の API トークンを指定してください。
export OPENAI_API_KEY=sk-proj-...
ここまでできたら python cli.py --computer local-playwright
を実行してみましょう。Chromium ブラウザが起動して、指示通りに情報を検索してくれます。
以下のスクリーンショットは「明日の東京都の天気は?」と質問してみた様子です。Playwright ベースのコンピュータ実装が、その答えを得るために検索エンジンで検索を実行してくれています。
他にも Docker、Browserbase、Scrapybara のコード例もあります。ぜひ試してみてください。
Agents SDK
Agents SDK は、エージェント開発のために OpenAI が公開した新しい SDK です。このツールは、実験的な SDK として公開した Swarm で得た知見をもとに開発されました。
この SDK の特徴は、シンプルなエージェントからマルチエージェントまでオーケストレーション可能で、ハンドオフ、ガードレール、ツール実行などの実装パターンをサポートしていることです。そして、新しく OpenAI プラットフォームの管理画面に追加されたトレーシング画面を利用することができます。
今回の発表時点では Python 版のみが提供されていますが、今後 Node.js 版もリリース予定(時期は未定)となっています。
この SDK は基本的には内部で Responses API を実行しますが、もし何らかの事情で Chat Completions の資産(=既存の OpenAI 連携コード、Chat Completions 互換の他のプラットフォームを活用したコード)を活用したい場合は、こちらのページを参考に Agent を設定することができます。
すでにサンプル実装例がいくつか公開されていますので、そのうちの一つを実行してみましょう。Agents SDK のリポジトリに Deep Research 風の調査エージェントの実装例が公開されています。
OpenAI のエンジニアの X 投稿でその動きを見ることもできますが、せっかくなので、手元でこのサンプルを実行してみましょう。以下のように実行中のプロセスがターミナル上に表示されます。
$ git clone https://github.com/openai/openai-agents-python.git
$ cd openai-agents-python
$ pip install openai-agents
$ export OPENAI_API_KEY=sk-proj-...
$ python -m examples.research_bot.main
What would you like to research? Cutting-edge examples of generative AI adoption in Japan
View trace: https://platform.openai.com/traces/trace_********************
Starting research...
✅ Will perform 10 searches
✅ Searching... 10/10 completed
✅ Cleaning up formatting...
✅ Report summary
This report provides an in-depth look at Japan’s cutting‐edge adoption of generative AI across multiple sectors. It examines government-led initiatives, innovations in the creative industries, corporate and healthcare applications, academic research and development, as well as retail and manufacturing integrations. The report also highlights strategic partnerships and the challenges Japan faces in scaling generative AI adoption, offering valuable insights and foresight into future directions.
...
リンクが表示されていたトレーシングの管理画面に行くと、こんな感じで表示されています。
かなり手軽に試せることがお分かりいただけたかと思います。
OpenAI が公開しているもの以外では、Stripe からもサンプル例が公開されています。こちらもご興味あれば見てみてください。
終わりに
このまとめ記事が少しでも参考になれば幸いです。
今回は要点をチェックしやすい記事となるように心がけたので、細部まで触れることは避けたのですが、これからも具体例とともにエージェント開発の実装テクニックを紹介していきたいと思っています。
OpenAI のプラットフォームに関する情報発信にご興味があれば、ぜひ私たち OpenAI の Zenn Publication をフォローしておいてください。今後ともよろしくお願いします!
Discussion