Agents SDKにおけるツール定義の詳細

OpenAI Agents SDKでは、Python関数に @function_tool デコレーターを付与するだけで、エージェントから呼び出し可能なツールを定義できる。ツールはエージェントが内部知識だけでは対応できない処理、すなわち外部データの取得、計算、API呼び出し、状態参照などを実行するための中核的な仕組みである。

1.Python関数からツールが生成される仕組み

@function_tool を付けた関数について、SDKは以下の情報を自動的に推論する。具体的には、関数名からツール名、ドッグストリングからツールの説明、型ヒントから入力スキーマを推論する。これにより、開発者がJSONスキーマを手書きする必要はなく、関数定義そのものがツール仕様書として機能する。エージェントはツール使用を検討する際、この説明文を読み取るため、人間が読んで意味が分かる名前とdocstringを記述することが極めて重要になる。

2.最小構成のツール定義例

以下は、注文IDを受け取り簡易的な状態を返すツールの例である。

from agents import Agent, Runner, function_tool

@function_tool
def lookup_order_state(order_id: int) -> str:
    """注文IDに基づき注文状態を返す"""
    if order_id < 200:
        return "発送済み"
    elif order_id < 300:
        return "遅延中"
    else:
        return "キャンセル済み"

agent = Agent(
    name="サポートエージェント",
    instructions="顧客からの問い合わせに対応し、必要に応じて注文状態を確認する",
    tools=[lookup_order_state],
    model="gpt-4o",
)

result = Runner.run_sync(agent, "注文番号250の状況を教えて")
print(result.final_output)

この例では、エージェントがユーザー入力を解釈し、自身の判断で lookup_order_state ツールを呼び出す。ツール呼び出しの可否やタイミングはコードではなくLLMの推論に委ねられている点が特徴である。

3.ツール定義の上書き(override)

自動推論されたツール名や説明が不十分な場合、@function_tool の引数(name_override、description_override)を使って明示的に上書きできる。これは、関数名が抽象的すぎる場合や、ユーザー向け表示を意識した名称にしたい場合に有効である。

@function_tool(
    name_override="注文ステータス確認",
    description_override="顧客の注文IDを指定して現在の状態を取得する"
)
def lookup_order_state(order_id: int) -> str:
    if order_id < 200:
        return "発送済み"
    elif order_id < 300:
        return "遅延中"
    else:
        return "キャンセル済み"

このような上書きにより、エージェントがツールの目的を誤解するリスクを下げられる。特に、複数のツールが似た構造を持つ場合や、ローカライズ・表記統一が必要な場面では重要な設計ポイントとなる。

4.同期・非同期の透過的サポート

@function_tool は同期関数と非同期関数の両方に対応している。async def で定義された関数であっても、SDKが内部で適切に await 処理を行うため、エージェント側で特別な分岐を書く必要はない。外部APIやDBアクセスなど、非同期処理を伴うツールを自然に組み込める点は、実務上大きな利点である。

5.まとめ

ツール定義の本質はPython関数をそのままエージェントが理解できる操作単位に昇格させる点にある。関数名・型ヒント・ドッグストリングは単なる補足情報ではなく、エージェントの判断材料そのものになる。そのため、ツール設計では処理内容以上に意味が正確に伝わる言語化を意識する必要がある。