PydanticAIエージェントとツールの呼び出しをOpenTelemetry (OTEL). PydanticAIはPydanticチームによって構築されたPythonエージェントフレームワークで、生成AIを使用した本番環境グレードのアプリケーションを簡単かつ型安全に構築することができます。エージェントとツールの呼び出しをすべてトレースするためにOTELを使用しています。
Weaveでのトレーシングの詳細については、以下を参照してください OTELトレースをWeaveに送信する.
このガイドでは、OTELを使用してPydanticAIエージェントとツールの呼び出しをトレースし、それらのトレースをWeaveで視覚化する方法を説明します。必要な依存関係のインストール方法、Weaveにデータを送信するためのOTELトレーサーの設定方法、PydanticAIエージェントとツールの計測方法について学びます。また、アプリケーション内のすべてのエージェントでデフォルトでトレースを有効にする方法も紹介します。

前提条件

始める前に、必要なOTEL依存関係をインストールしてください:
pip install opentelemetry-sdk OTELemetry-exporter-otlp-proto-http
次に、WeaveでOTELトレースを設定する.

WeaveでOTELトレースを設定する

PydanticAIからWeaveにトレースを送信するには、OTELをTracerProviderOTLPSpanExporterで設定します。エクスポーターを認証とプロジェクト識別のための正しいエンドポイントとHTTPヘッダーに設定します。
APIキーやプロジェクト情報などの機密性の高い環境変数は、環境ファイル(例:.env)に保存し、os.environを使用してロードすることをお勧めします。これにより、認証情報を安全に保ち、コードベースから分離することができます。

必要な設定

  • Endpoint: https://trace.wandb.ai/otel/v1/traces
  • Headers:
    • Authorization:W&B APIキーを使用した基本認証
    • project_id:W&Bのエンティティ/プロジェクト名(例:myteam/myproject

セットアップ例

以下のコードスニペットは、PydanticAIアプリケーションからWeaveにOTELトレースを送信するためのOTLPスパンエクスポーターとトレーサープロバイダーを設定する方法を示しています。
import base64
import os
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk import trace as trace_sdk
from opentelemetry.sdk.trace.export import SimpleSpanProcessor

# Load sensitive values from environment variables
WANDB_BASE_URL = "https://trace.wandb.ai"
PROJECT_ID = os.environ.get("WANDB_PROJECT_ID")  # Your W&B entity/project name e.g. "myteam/myproject"
WANDB_API_KEY = os.environ.get("WANDB_API_KEY")  # Your W&B API key

OTEL_EXPORTER_OTLP_ENDPOINT = f"{WANDB_BASE_URL}/otel/v1/traces"
AUTH = base64.b64encode(f"api:{WANDB_API_KEY}".encode()).decode()

OTEL_EXPORTER_OTLP_HEADERS = {
    "Authorization": f"Basic {AUTH}",
    "project_id": PROJECT_ID,
}

# Create the OTLP span exporter with endpoint and headers
exporter = OTLPSpanExporter(
    endpoint=OTEL_EXPORTER_OTLP_ENDPOINT,
    headers=OTEL_EXPORTER_OTLP_HEADERS,
)

# Create a tracer provider and add the exporter
tracer_provider = trace_sdk.TracerProvider()
tracer_provider.add_span_processor(SimpleSpanProcessor(exporter))

OTELでPydanticAIエージェントをトレースする

PydanticAIエージェントをトレースしてトレースデータをWeaveに送信するには、InstrumentationSettingsオブジェクトをトレーサープロバイダーで設定してAgent constructorに渡します。これにより、すべてのエージェントとツールの呼び出しがOTEL設定に従ってトレースされます。 以下の例は、トレースを有効にした簡単なエージェントを作成する方法を示しています。重要なステップは、エージェントを初期化するときにinstrument引数を設定することです:
from pydantic_ai import Agent
from pydantic_ai.models.instrumented import InstrumentationSettings

# Create a PydanticAI agent with OTEL tracing
agent = Agent(
    "openai:gpt-4o",
    instrument=InstrumentationSettings(tracer_provider=tracer_provider),
)

result = agent.run_sync("What is the capital of France?")
print(result.output)
エージェントへのすべての呼び出しがトレースされ、Weaveに送信されます。 A trace visualization of a simple PydanticAI agent

OTELでPydanticAIツールをトレースする

WeaveはOTELで計測されたPydanticAIの操作をすべてトレースできます。これにはエージェントとツールの呼び出しの両方が含まれます。つまり、エージェントがツール(例えば@agent.tool_plainでデコレートされた関数)を呼び出すとき、ツールの入力、出力、モデルの推論を含む相互作用全体がキャプチャされ、Weaveで視覚化されます。 以下の例は、システムプロンプトとツールを持つエージェントを作成する方法を示しています。トレースはエージェントとツールの両方に対して自動的に有効になります:
from pydantic_ai import Agent
from pydantic_ai.models.instrumented import InstrumentationSettings

# Create a PydanticAI agent with a system prompt and OTEL tracing
agent = Agent(
    "openai:gpt-4o",
    system_prompt=(
        "You are a helpful assistant that can multiply numbers. "
        "When asked to multiply numbers, use the multiply tool."
    ),
    instrument=InstrumentationSettings(tracer_provider=tracer_provider),
)

# Define a tool
@agent.tool_plain
def multiply(a: int, b: int) -> int:
    """Multiply two numbers."""
    return a * b

# Ask the agent to use the tool
result = agent.run_sync("What is 7 multiplied by 8?")
print(result.output)
A trace visualization of a tool call エージェントの呼び出しとツールの呼び出しの両方がWeaveでトレースされ、アプリケーションの完全な推論と実行パスを検査できます。

すべてのエージェントをデフォルトで計測する

アプリケーション内のすべてのPydanticAIエージェントにOTELトレースを適用するには、Agent.instrument_all()メソッドを使用します。これにより、InstrumentationSettingsパラメータを明示的に指定しないエージェントに対してデフォルトのinstrumentインスタンスが設定されます。
from pydantic_ai import Agent
from pydantic_ai.models.instrumented import InstrumentationSettings

# Set up default instrumentation for all agents
Agent.instrument_all(InstrumentationSettings(tracer_provider=tracer_provider))

# Now, any new agent will use this instrumentation by default
agent1 = Agent("openai:gpt-4o")
agent2 = Agent("openai:gpt-4o", system_prompt="Be helpful.")

result = agent1.run_sync("What is the capital of France?")
print(result.output)
これは、設定を繰り返すことなく、すべてのエージェントで一貫したトレースを行いたい大規模なアプリケーションに役立ちます。詳細については、PydanticAI OTELドキュメントを参照してください。

詳細情報