OpenAI Agents SDKの 基礎 (3) – Pydantic

1. Pydanticとは何か

  • PythonでAIエージェントやAPIを作っていると「どんなデータが渡ってくるのか」「想定外の値が来たらどうするか」という問題に直面する。Pydanticは、こうした問題をコードの段階で防ぐためのライブラリ、いわば「入力と出力の設計図」である。
  • Pydanticは「データの形」と「ルール」をPythonコードで厳密に定義し自動的に検証してくれる。たとえば、以下の項目を「モデル」として定義すると、間違ったデータは早い段階でエラーとして弾かれるようになる。
     (1) 入力データの項目
     (2) 各項目の型(文字列・数値など)
     (3) 値の範囲や制約
     (4) 各項目の意味(説明文)

2. なぜPydanticが重要なのか

(1) 人間にもAIにも分かりやすい。

Pydanticで定義されたモデルには、①人間が読んでも意味が分かる、②LLMが見てもどんなデータを渡せばよいかが分かるという二重のメリットがある。Agents SDKでは、この分かりやすい構造がそのままツール仕様としてLLMに渡される。

(2) タイプヒント(Type hint)よりも強力な検証ができる。

Pythonのタイプヒント(strint)だけでは、年齢がマイナス、異常に大きな数値、必須項目の欠落といった問題は防げない。この点、Pydanticでは、必須かどうか、数値の下限・上限、説明文まで含めて定義できる。

3. Pydanticモデルの基本構造

Pydanticでは、以下のように、入力データをクラス(class)として定義する。

from pydantic import BaseModel, Field

class PersonInput(BaseModel):
    name: str = Field(..., description="人物の氏名(フルネーム)")
    age: int = Field(..., ge=0, le=150, description="人物の年齢(年)")
    email: str = Field(..., description="人物のメールアドレス")

上のモデルでは、①name は文字列(str)で必須(…)であること、②age は整数(int)で0〜150の範囲(ge,le)であること、③email は文字列で必須であることが定義・説明(description)されている。この「設計図」に合わないデータは実行前にエラーになる。

4. Pydanticとツール関数の組み合わせ

Pydanticモデルは、ツール関数の入力としてそのまま使える。

@function_tool
def process_person(input: PersonInput) -> str:
    """
    人物情報を処理し、その要約を返します。
    """
    return f"{input.name} は {input.age} 歳です。連絡先: {input.email}"

上のコードではツールが呼ばれる前に入力はPydanticで検証され、不正なデータは関数に届かない。そのため関数内では正しいデータが来る前提で安心してコードを書くことができる。

5. Agents SDKにおけるPydanticの役割

OpenAI Agents SDKでは、Pydanticは次のような場面で使われる。

(1) 構造化されたツール入力

LLMがツールを呼ぶ際、「どんなJSONを作ればいいか」を正確に理解できる。

(2) 構造化された出力

エージェントの出力形式を固定でき、後続処理が安定する。

(3) ガードレール(安全装置)

異常値や想定外のデータを早期に検出できる。

6. まとめ

Pydanticは単なる補助ライブラリではなく、①AIエージェントの入力を安全にする、②LLMとのやり取りを明確にする、③後続処理やAPI設計を安定させるという、エージェント設計の土台となる存在である。