10月26日、Abid Ali Awanが「Building Your First AI Agent in Python with the OpenAI Agents SDK」と題した記事を公開した。この記事では、OpenAI Agents SDKを使ってPythonでAIエージェントをゼロから構築する手順について詳しく紹介されている。
ツール呼び出しループを自分で書かなくていい
AIエージェントの実装でこれまで面倒だったのが、ツール呼び出しのループ処理だ。モデルがツールの使用を要求し、その結果を受け取り、再度モデルに渡す——この往復処理を自前で実装する必要があった。LangChainやAutoGen、旧Swarmsといったエージェントフレームワークも同種の課題に取り組んできたが、OpenAI Agents SDKは2025年3月にOpenAIが正式公開したファーストパーティSDKであり、OpenAI APIとの統合が最もシームレスな選択肢と位置づけられる。
※編集部の考察:LangChainなど既存フレームワークと比較したとき、サードパーティ依存なしにOpenAIのエコシステムと直結できる点が差別化要素になりうる。
OpenAI Agents SDKはこのループ処理の部分を Runner が自動的に担う。開発者はエージェントにツールを渡すだけでよく、「いつどのツールを呼ぶか」はモデルが判断する。
通常のLLMアプリケーションのフローが:
プロンプト → モデル → レスポンス
であるのに対し、エージェントのフローは:
ユーザー → エージェント → (必要なら)ツール → エージェント → 最終回答
となる。この「推論→ツール実行→継続」のループをSDKが管理することで、開発者は本質的なロジックに集中できる。
最小構成:10行で動くリサーチエージェント
まずSDKをインストールする。
pip install openai-agents
export OPENAI_API_KEY="your-api-key"
以下が最小限のエージェント実装だ:
from agents import Agent, Runner, WebSearchTool
agent = Agent(
name="Research Assistant",
instructions=(
"You are a concise research assistant. "
"Use web search when current information is required."
),
tools=[WebSearchTool()],
)
result = Runner.run_sync(
agent,
"What are the latest developments in Python?"
)
print(result.final_output)
WebSearchTool() はOpenAIがホストするツールで、検索APIを自前で叩く必要はない。モデルが「最新情報が必要」と判断したときに自動で呼び出す。
カスタムPython関数をツールとして渡す
@tool デコレータを付けるだけで、任意のPython関数をエージェントのツールにできる。
from agents.decorators import tool
@tool
def calculate_total(price: float, quantity: int) -> float:
"""Calculate the total cost of an order."""
return price * quantity
SDKは関数名・引数・型ヒント・docstringを自動でスキーマ化する。JSONスキーマを手書きする必要はない。
ここで重要なのが docstring だ。モデルはこれを読んで「このツールをいつ使うべきか」を判断する。説明が曖昧だとモデルが適切なタイミングで呼び出せないため、明確に書くことが推奨されている。
agent = Agent(
name="Assistant",
instructions="Help with research and calculations.",
tools=[WebSearchTool(), calculate_total],
)
result = Runner.run_sync(
agent,
"I need 14 GPUs costing $2.49 each per hour. What will they cost per hour?"
)
# 出力: 14 GPUs x $2.49/hour = $34.86 per hour.
会話履歴の永続化:SQLiteSession
会話のたびに文脈がリセットされるエージェントは実用的でない。SDKは SQLiteSession による永続化をサポートしている。
from agents import SQLiteSession
session = SQLiteSession("user_1", "conversations.db")
while True:
message = input("You: ")
result = Runner.run_sync(agent, message, session=session)
print("Agent:", result.final_output)
SQLiteファイルに履歴が保存されるため、プログラムを再起動しても会話の文脈が引き継がれる。より大規模な用途向けに、Redis・SQLAlchemy・MongoDB のバックエンドも提供されている。
トレーシングがデフォルト有効
SDKはデフォルトでトレーシングが有効になっており、OpenAIのダッシュボードからエージェントの動作を検査できる。どのツールが呼ばれたか、モデルがどう判断したか、どこでエラーが発生したかを追跡できるため、ツール呼び出しのデバッグや指示文の改善に役立つ。
まとめ:まず1つのワークフローを動かす
この記事が示す構成のポイントは以下の3点だ:
@toolデコレータでPython関数を即座にツール化Runnerがツール呼び出しループを自動管理SQLiteSessionで会話履歴を永続化
記事ではここからの拡張として、外部API連携・MCPサーバー(Model Context Protocol:エージェントが外部ツールやデータソースと標準化された手順でやり取りするための仕様)・ガードレール・マルチエージェントのハンドオフを挙げている。ただし「必要になったときだけ追加する」という方針を強調しており、まず1つのワークフローを実用的に動かすことを優先している。
手を動かすなら、WebSearchTool() を使った最小構成から始め、@tool で自前関数を1つ追加してみるのが最も早い理解への近道だ。 その上で会話履歴やトレーシングを足していくことで、本番運用に近い構成へ段階的に育てられる。
詳細はBuilding Your First AI Agent in Python with the OpenAI Agents SDKを参照していただきたい。