Pydantic AI vía OpenTelemetry
El mismo agente que el inicio rápido de Pydantic AI, pero trazado con OpenTelemetry. No se importa nada de TraceAgent: el agente solo exporta trazas OpenTelemetry al servidor. Usa un modelo simulado, así que se ejecuta sin clave de API.
Ejecutar
pip
pip install pydantic-ai-slim opentelemetry-sdk opentelemetry-exporter-otlp-proto-httpuv
uv add pydantic-ai-slim opentelemetry-sdk opentelemetry-exporter-otlp-proto-httpArranca el servidor de TraceAgent en http://127.0.0.1:8000, guarda el script de abajo como otel_quickstart.py y ejecuta:
python otel_quickstart.py
El script
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from pydantic_ai import Agent
from pydantic_ai.capabilities import Instrumentation
from pydantic_ai.messages import ModelResponse, TextPart, ToolCallPart
from pydantic_ai.models.function import FunctionModel
from pydantic_ai.models.instrumented import InstrumentationSettings
def fake_model(messages, info):
"""Hace de LLM: primero pide la herramienta y luego responde."""
if len(messages) == 1:
return ModelResponse(parts=[ToolCallPart("weather", {"city": "Madrid"})])
return ModelResponse(parts=[TextPart("It is sunny in Madrid, 23 degrees.")])
# 1. Envía las trazas OpenTelemetry al servidor de TraceAgent. No se importa nada de TraceAgent.
provider = TracerProvider()
provider.add_span_processor(BatchSpanProcessor(OTLPSpanExporter(endpoint="http://127.0.0.1:8000/v1/traces")))
# 2. Tu agente de siempre, con la instrumentación propia de Pydantic AI.
agent = Agent(
FunctionModel(fake_model), # en tu propio agente, usa una cadena de modelo real, p. ej. "openai:gpt-4o"
name="otel-quickstart",
capabilities=[Instrumentation(settings=InstrumentationSettings(tracer_provider=provider))],
)
@agent.tool_plain
def weather(city: str) -> str:
"""Devuelve el tiempo de una ciudad."""
return f"Sunny, 23 degrees in {city}."
# 3. Úsalo como siempre.
result = agent.run_sync("What is the weather in Madrid?")
print(result.output)
# 4. Un script corto debe vaciar el exportador antes de salir, o las trazas se pierden.
provider.shutdown()
Salida:
It is sunny in Madrid, 23 degrees.
Qué hace
- Configura un exportador OpenTelemetry que apunta al servidor de TraceAgent
- Construye un agente de Pydantic AI con su propia instrumentación
- El modelo simulado pide la herramienta
weathery después responde - Vacía el exportador para que no se pierda ningún span
El servidor crea la ejecución por sí mismo, con el nombre otel-quickstart y los mismos eventos que la versión con hooks.
Más información
- Ingesta OpenTelemetry: cómo se convierten los spans en una ejecución, cómo asociar a una ejecución del SDK y la privacidad