Pydantic AI は、生成 AI を使用した実稼働レベルのアプリケーションの構築を容易にするように設計された Python エージェントフレームワークです。
FastAPI は Pydantic Validation を基盤として、革新的で使いやすい設計を提供することで Web 開発に革命をもたらしましたが、その FastAPI の感覚を GenAI app 開発にもたらすという単純な目的で Pydantic AI は構築されています。
Pydantic AI エージェント・フレームワーク : イントロダクション
作成 : クラスキャット・セールスインフォメーション
作成日時 : 08/17/2025
バージョン : Pydantic AI v0.7.2
* 本記事は ai.pydantic.dev の以下のページを独自に翻訳した上で、補足説明を加えてまとめ直しています :
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
◆ お問合せ : 下記までお願いします。
- クラスキャット セールス・インフォメーション
- sales-info@classcat.com
- ClassCatJP
Pydantic AI : エージェント・フレームワーク : イントロダクション
Pydantic AI は、生成 AI を使用した実稼働レベルのアプリケーションの構築を容易にするように設計された Python エージェントフレームワークです。
FastAPI は、Pydantic のバリデーション を基盤として、革新的で (人間工学的に) 使いやすい設計を提供することで、Web 開発に革命をもたらしました。
同様に、Python の事実上、ほぼすべてのエージェントフレームワークと LLM ライブラリは Pydantic Validation を使用していますが、Pydantic Logfire で LLM を使い始めた際は、同じ感覚を与えてくれるものを見つけられませんでした。
私たちは一つの単純な目的で Pydantic AI を構築しました : その FastAPI の感覚を GenAI app 開発にもたらすことです。
Why use Pydantic AI
- Pydantic チームにより構築 : Pydantic Validation (OpenAI SDK、Anthropic SDK、LangChain、LlamaIndex、AutoGPT、Transformers、CrewAI、Instructor 等の validation 層)を手がけたチームによって構築されました。
- モデル非依存 : OpenAI, Anthropic, Gemini, Deepseek, Ollama, Groq, Cohere と Mistral をサポートし、他のモデル のサポートを実装するための単純なインターフェイスもあります。
- Pydantic Logfire 統合 : LLM により強化されたアプリケーションのリアルタイム・デバッグ、パフォーマンス監視、動作追跡のために Pydantic Logfire とシームレスに 統合 しています。
- 型安全 : できる限り強力で有益な 型チェック を行うように設計されています。
- Python-centric 設計 : Python の馴染みのある制御フローとエージェント構成を活用して AI 駆動型プロジェクトを構築し、どのような他のプロジェクトでも使用できる標準的な Python ベストプラクティスを簡単に適用できます。
- 構造化レスポンス : Pydantic Validation のパワーを活用してモデル出力を 検証・構造化 して、実行全体に渡りレスポンスが一貫していることを保証します。
- 依存性注入 (Injection) システム : エージェントの システムプロンプト、ツール と 出力 validators にデータとサービスを提供する、オプションの 依存性注入 システムを提供します。これはテストや評価駆動型の反復開発に役立ちます。
- ストリーミングされた応答 : 即時検証を備えた、LLM 応答を継続的に ストリーミングする 機能を提供し、検証済み出力へのリアルタイム・アクセスを保証します。
- グラフ・サポート : Pydantic Graph は型ヒントを使用してグラフを定義する強力な方法を提供しています、これは、標準的な制御フローがスパゲティ🍝コードに劣化する可能性がある複雑なアプリケーションで役立ちます。
Hello World の例
Pydantic AI の最小限の例が以下です :
hello_world.py
from pydantic_ai import Agent
agent = Agent(
'google-gla:gemini-1.5-flash',
system_prompt='Be concise, reply with one sentence.',
)
result = agent.run_sync('Where does "hello world" come from?')
print(result.output)
"""
The first known use of "hello, world" was in a 1974 textbook about the C programming language.
"""
「Hello, World」は、プログラミング初心者が最初に作成する基本的なプログラムの出力例として、1978年出版の『The C Programming Language』で広まりました。
(This example is complete, it can be run “as is”)
やり取りは非常に短いはずです: Pydantic AI はシステムプロンプトとユーザクエリを LLM に送信し、モデルはテキスト応答を返します。
それほど興味深いものではありませんが、「ツール」、動的システムプロンプト、構造化レスポンスを簡単に追加してより強力なエージェントを構築できます。
ツール & 依存性注入の例
Pydantic AI を使用して銀行のサポートエージェントを構築する簡潔な例が以下です :
bank_support.py
from dataclasses import dataclass
from pydantic import BaseModel, Field
from pydantic_ai import Agent, RunContext
from bank_database import DatabaseConn
@dataclass
class SupportDependencies:
customer_id: int
db: DatabaseConn
class SupportOutput(BaseModel):
support_advice: str = Field(description='Advice returned to the customer')
block_card: bool = Field(description="Whether to block the customer's card")
risk: int = Field(description='Risk level of query', ge=0, le=10)
support_agent = Agent(
'openai:gpt-4o',
deps_type=SupportDependencies,
output_type=SupportOutput,
system_prompt=(
'You are a support agent in our bank, give the '
'customer support and judge the risk level of their query.'
),
)
@support_agent.system_prompt
async def add_customer_name(ctx: RunContext[SupportDependencies]) -> str:
customer_name = await ctx.deps.db.customer_name(id=ctx.deps.customer_id)
return f"The customer's name is {customer_name!r}"
@support_agent.tool
async def customer_balance(
ctx: RunContext[SupportDependencies], include_pending: bool
) -> float:
"""Returns the customer's current account balance."""
return await ctx.deps.db.customer_balance(
id=ctx.deps.customer_id,
include_pending=include_pending,
)
...
async def main():
deps = SupportDependencies(customer_id=123, db=DatabaseConn())
result = await support_agent.run('What is my balance?', deps=deps)
print(result.output)
"""
support_advice='Hello John, your current account balance, including pending transactions, is $123.45.' block_card=False risk=1
"""
result = await support_agent.run('I just lost my card!', deps=deps)
print(result.output)
"""
support_advice="I'm sorry to hear that, John. We are temporarily blocking your card to prevent unauthorized transactions." block_card=True risk=8
"""
以上