powered by TechFeed
表示モード
ハウツー

ツール呼び出しループを自前で書かなくていい — OpenAI Agents SDKで10行から始めるAIエージェント開発

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のエコシステムと直結できる...

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を参照していただきたい。