Autogen
Braintrust traces AutoGen applications via OpenTelemetry.
This integration uses Braintrust's Python SDK configuration for OpenTelemetry.
uv add braintrust[otel] autogen-agentchat opentelemetry-instrumentation-openai python-dotenv
To trace Autogen spans with Braintrust, configure these environment variables:
BRAINTRUST_API_KEY=your-api-key BRAINTRUST_PARENT=project_name:autogen-demo OPENAI_API_KEY=your-openai-key
When you create your agent, enable telemetry and export the data using OpenTelemetry:
import asyncio import os from typing import Optional from autogen_agentchat.agents import AssistantAgent from autogen_agentchat.conditions import MaxMessageTermination, TextMentionTermination from autogen_agentchat.teams import SelectorGroupChat from autogen_agentchat.ui import Console from autogen_core import SingleThreadedAgentRuntime from autogen_ext.models.openai import OpenAIChatCompletionClient from braintrust.otel import BraintrustSpanProcessor from dotenv import load_dotenv from opentelemetry import trace from opentelemetry.instrumentation.openai import OpenAIInstrumentor from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import TracerProvider def setup_tracing() -> None: provider = TracerProvider() provider.add_span_processor(BraintrustSpanProcessor(filter_ai_spans=True)) trace.set_tracer_provider(provider) OpenAIInstrumentor().instrument() def percentage_change_tool(start: float, end: float) -> float: if start == 0: return float("inf") return ((end - start) / start) * 100 async def main(task: Optional[str] = None) -> None: load_dotenv() setup_tracing() model_client = OpenAIChatCompletionClient(model="gpt-4o") tracer = trace.get_tracer("autogen-demo-bot") with tracer.start_as_current_span("run_team"): planning_agent = AssistantAgent( "PlanningAgent", description="Plans tasks and delegates.", model_client=model_client, system_message=( "You are a planning agent. You only plan and delegate tasks; do not execute them.\n" "When assigning tasks, use this format: 1. <agent> : <task>\n" 'After all tasks are complete, summarize the findings and end with "TERMINATE".' ), ) data_analyst_agent = AssistantAgent( "DataAnalystAgent", description="Performs calculations.", model_client=model_client, tools=[percentage_change_tool], system_message=("You are a data analyst. Use the tools provided to compute numeric results."), ) termination = TextMentionTermination("TERMINATE") | MaxMessageTermination(max_messages=25) if not task: task = "You started with 100 apples, now you have 120 apples. what is the percentage change?" runtime = SingleThreadedAgentRuntime(tracer_provider=trace.get_tracer_provider()) runtime.start() selector_prompt = ( "Select an agent to perform task.\n\n{roles}\n\nCurrent conversation context:\n{history}\n\n" "Read the above conversation, then select an agent from {participants} to perform the next task.\n" "Make sure the planner agent has assigned tasks before other agents start working.\nOnly select one agent." ) team = SelectorGroupChat( [planning_agent, data_analyst_agent], model_client=model_client, termination_condition=termination, selector_prompt=selector_prompt, allow_repeated_speaker=True, runtime=runtime, ) await Console(team.run_stream(task=task)) await runtime.stop() await model_client.close() if __name__ == "__main__": asyncio.run(main())