Aracılığıyla paylaş


Observability

Gözlemlenebilirlik, güvenilir ve sürdürülebilir sistemler oluşturmanın önemli bir yönüdür. Agent Framework, gözlemlenebilirlik için yerleşik destek sağlayarak aracılarınızın davranışını izlemenize olanak sağlar.

Bu kılavuz, aracılarınızın nasıl performans sergilediğini anlamanıza ve ortaya çıkabilecek sorunları tanılamanıza yardımcı olmak için Agent Framework ile gözlemlenebilirliği etkinleştirme adımlarını gösterir.

OpenTelemetry Tümleştirmesi

Agent Framework OpenTelemetry ile tümleşir ve daha belirgin olarak Agent Framework , OpenTelemetry GenAI Anlam Kuralları'na göre izlemeler, günlükler ve ölçümler yayar.

Gözlemlenebilirliği Etkinleştir (C#)

Sohbet istemcinizde gözlemlenebilirliği etkinleştirmek için sohbet istemcisini aşağıdaki gibi oluşturmanız gerekir:

// Using the Azure OpenAI client as an example
var instrumentedChatClient = new AzureOpenAIClient(new Uri(endpoint), new DefaultAzureCredential())
    .GetChatClient(deploymentName)
    .AsIChatClient() // Converts a native OpenAI SDK ChatClient into a Microsoft.Extensions.AI.IChatClient
    .AsBuilder()
    .UseOpenTelemetry(sourceName: "MyApplication", configure: (cfg) => cfg.EnableSensitiveData = true)    // Enable OpenTelemetry instrumentation with sensitive data
    .Build();

Uyarı

DefaultAzureCredential geliştirme için uygundur ancak üretimde dikkatli bir şekilde dikkate alınması gerekir. Üretimde gecikme sorunları, istenmeyen kimlik bilgisi yoklama ve geri dönüş mekanizmalarından kaynaklanan olası güvenlik risklerini önlemek için belirli bir kimlik bilgisi (ör ManagedIdentityCredential. ) kullanmayı göz önünde bulundurun.

Aracınızın gözlemlenebilirliğini etkinleştirmek için aracıyı aşağıdaki gibi oluşturmanız gerekir:

var agent = new ChatClientAgent(
    instrumentedChatClient,
    name: "OpenTelemetryDemoAgent",
    instructions: "You are a helpful assistant that provides concise and informative responses.",
    tools: [AIFunctionFactory.Create(GetWeatherAsync)]
).WithOpenTelemetry(sourceName: "MyApplication", enableSensitiveData: true);    // Enable OpenTelemetry instrumentation with sensitive data

Önemli

Sohbet istemcileriniz ve aracılarınız için gözlemlenebilirliği etkinleştirdiğinizde, özellikle hassas veriler etkinleştirildiğinde yinelenen bilgiler görebilirsiniz. Hem sohbet istemcisi hem de aracı tarafından yakalanan sohbet bağlamı (istemler ve yanıtlar dahil) her iki yayılma alanında da yer alır. Gereksinimlerinize bağlı olarak, yinelenenleri önlemek için yalnızca sohbet istemcisinde veya yalnızca aracıda gözlemlenebilirliği etkinleştirmeyi seçebilirsiniz. LLM ve Aracılar için yakalanan öznitelikler hakkında daha fazla bilgi için bkz. GenAI Anlam Kuralları .

Uyarı

Üretim günlüklerinde ve izlemelerde kullanıcı bilgilerini kullanıma sunma ihtimalinden, yalnızca geliştirme veya test ortamlarında hassas verileri etkinleştirin. Hassas veriler istemleri, yanıtları, işlev çağrısı bağımsız değişkenlerini ve sonuçları içerir.

Konfigürasyon

Artık sohbet istemciniz ve aracınız izlendiğine göre, OpenTelemetry dışarı aktarıcılarını telemetri verilerini istediğiniz arka uçtan gönderecek şekilde yapılandırabilirsiniz.

İzler

İzlemeleri istenen arka uçtan dışarı aktarmak için, uygulama başlangıç kodunuzda OpenTelemetry SDK'sını yapılandırabilirsiniz. Örneğin, izlemeleri bir Azure İzleyici kaynağına aktarmak için:

using Azure.Monitor.OpenTelemetry.Exporter;
using OpenTelemetry;
using OpenTelemetry.Trace;
using OpenTelemetry.Resources;
using System;

var SourceName = "MyApplication";

var applicationInsightsConnectionString = Environment.GetEnvironmentVariable("APPLICATION_INSIGHTS_CONNECTION_STRING")
    ?? throw new InvalidOperationException("APPLICATION_INSIGHTS_CONNECTION_STRING is not set.");

var resourceBuilder = ResourceBuilder
    .CreateDefault()
    .AddService(ServiceName);

using var tracerProvider = Sdk.CreateTracerProviderBuilder()
    .SetResourceBuilder(resourceBuilder)
    .AddSource(SourceName)
    .AddSource("*Microsoft.Extensions.AI") // Listen to the Experimental.Microsoft.Extensions.AI source for chat client telemetry.
    .AddSource("*Microsoft.Extensions.Agents*") // Listen to the Experimental.Microsoft.Extensions.Agents source for agent telemetry.
    .AddAzureMonitorTraceExporter(options => options.ConnectionString = applicationInsightsConnectionString)
    .Build();

Tip

Arka ucunuza bağlı olarak, farklı ihracatçılar kullanabilirsiniz. Daha fazla bilgi için OpenTelemetry .NET belgelerine bakın. Yerel geliştirme için Aspire Panosu'nu kullanmayı göz önünde bulundurun.

Metrics

Benzer şekilde, ölçümleri istenen arka uçtan dışarı aktarmak için uygulama başlangıç kodunuzda OpenTelemetry SDK'sını yapılandırabilirsiniz. Örneğin, ölçümleri bir Azure İzleyici kaynağına aktarmak için:

using Azure.Monitor.OpenTelemetry.Exporter;
using OpenTelemetry;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using System;

var applicationInsightsConnectionString = Environment.GetEnvironmentVariable("APPLICATION_INSIGHTS_CONNECTION_STRING")
    ?? throw new InvalidOperationException("APPLICATION_INSIGHTS_CONNECTION_STRING is not set.");

var resourceBuilder = ResourceBuilder
    .CreateDefault()
    .AddService(ServiceName);

using var meterProvider = Sdk.CreateMeterProviderBuilder()
    .SetResourceBuilder(resourceBuilder)
    .AddSource(SourceName)
    .AddMeter("*Microsoft.Agents.AI") // Agent Framework metrics
    .AddAzureMonitorMetricExporter(options => options.ConnectionString = applicationInsightsConnectionString)
    .Build();

Kayıtlar

Günlükler, kullandığınız günlük çerçevesi aracılığıyla yakalanır, örneğin Microsoft.Extensions.Logging. Günlükleri bir Azure İzleyici kaynağına aktarmak için, günlük sağlayıcısını uygulama başlangıç kodunuzda yapılandırabilirsiniz:

using Azure.Monitor.OpenTelemetry.Exporter;
using Microsoft.Extensions.Logging;

var applicationInsightsConnectionString = Environment.GetEnvironmentVariable("APPLICATION_INSIGHTS_CONNECTION_STRING")
    ?? throw new InvalidOperationException("APPLICATION_INSIGHTS_CONNECTION_STRING is not set.");

using var loggerFactory = LoggerFactory.Create(builder =>
{
    // Add OpenTelemetry as a logging provider
    builder.AddOpenTelemetry(options =>
    {
        options.SetResourceBuilder(resourceBuilder);
        options.AddAzureMonitorLogExporter(options => options.ConnectionString = applicationInsightsConnectionString);
        // Format log messages. This is default to false.
        options.IncludeFormattedMessage = true;
        options.IncludeScopes = true;
    })
    .SetMinimumLevel(LogLevel.Debug);
});

// Create a logger instance for your application
var logger = loggerFactory.CreateLogger<Program>();

Aspire Panosu

Geliştirme sırasında izlemelerinizi ve ölçümlerinizi görselleştirmenin hızlı bir yolu olarak Aspire Panosu'nu kullanmayı göz önünde bulundurun. Daha fazla bilgi için Bkz. Aspire Dashboard belgeleri. Aspire Panosu verileri bir OpenTelemetry Toplayıcısı aracılığıyla alır ve bu verileri izleme sağlayıcınıza aşağıdaki gibi ekleyebilirsiniz:

using var tracerProvider = Sdk.CreateTracerProviderBuilder()
    .SetResourceBuilder(resourceBuilder)
    .AddSource(SourceName)
    .AddSource("*Microsoft.Extensions.AI") // Listen to the Experimental.Microsoft.Extensions.AI source for chat client telemetry.
    .AddSource("*Microsoft.Extensions.Agents*") // Listen to the Experimental.Microsoft.Extensions.Agents source for agent telemetry.
    .AddOtlpExporter(options => options.Endpoint = new Uri("http://localhost:4317"))
    .Build();

Başlangıç Yapmak

Agent Framework deposunda OpenTelemetry'nin etkinleştirildiği bir aracının tam örneğine bakın.

Tip

Çalıştırılabilir örneklerin tamamı için .NET örneklerine bakın.

Bağımlılıklar

Dahil edilen paketler

Python uygulamanızda gözlemlenebilirliği etkinleştirmek için aşağıdaki OpenTelemetry paketleri varsayılan olarak yüklenir:

Ihracatçı

Gereksiz bağımlılıkları ve otomatik izlemeyle ilgili olası sorunları önlemek için varsayılan olarak dışarı verenleri yüklemeyiz . Farklı arka uçlar için çok çeşitli ihracatçılar mevcuttur, böylece ihtiyaçlarınıza en uygun olanları seçebilirsiniz.

gereksinimlerinize göre yüklemek isteyebileceğiniz bazı yaygın ihracatçılar:

  • gRPC protokolü desteği için: yükleme opentelemetry-exporter-otlp-proto-grpc
  • HTTP protokolü desteği için: yükleme opentelemetry-exporter-otlp-proto-http
  • Azure Application Insights için: yükleme azure-monitor-opentelemetry

Daha fazla dışarı aktarıcı ve izleme paketi bulmak için OpenTelemetry Kayıt Defteri'ni kullanın.

Gözlemlenebilirliği Etkinleştirme (Python)

Gözlemlenebilirliği yapılandırmak için beş desen

Gereksinimlerinize bağlı olarak uygulamanızda gözlemlenebilirliği yapılandırmanın birden çok yolunu belirledik:

En basit yaklaşım: Ortam değişkenleri aracılığıyla her şeyi yapılandırın:

from agent_framework.observability import configure_otel_providers

# Reads OTEL_EXPORTER_OTLP_* environment variables automatically
configure_otel_providers()

Ya da yalnızca konsol verenleri istiyorsanız ortam değişkenini ENABLE_CONSOLE_EXPORTERS ayarlayın:

ENABLE_CONSOLE_EXPORTERS=true
from agent_framework.observability import configure_otel_providers

# Console exporters are enabled via the ENABLE_CONSOLE_EXPORTERS env var
configure_otel_providers()

2. Özel İhracatçılar

İhracatçılar üzerinde daha fazla denetim için bunları kendiniz oluşturun ve öğesine configure_otel_providers()geçirin:

from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.exporter.otlp.proto.grpc._log_exporter import OTLPLogExporter
from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter
from agent_framework.observability import configure_otel_providers

# Create custom exporters with specific configuration
exporters = [
    OTLPSpanExporter(endpoint="http://localhost:4317", compression=Compression.Gzip),
    OTLPLogExporter(endpoint="http://localhost:4317"),
    OTLPMetricExporter(endpoint="http://localhost:4317"),
]

# These will be added alongside any exporters from environment variables
configure_otel_providers(exporters=exporters, enable_sensitive_data=True)

3. Üçüncü taraf kurulumu

Birçok üçüncü taraf OpenTelemetry paketinin kendi kurulum yöntemleri vardır. Önce bu yöntemleri kullanabilir, ardından Aracı Çerçevesi izleme kod yollarını etkinleştirmek için çağırabilirsiniz enable_instrumentation() :

from azure.monitor.opentelemetry import configure_azure_monitor
from agent_framework.observability import create_resource, enable_instrumentation

# Configure Azure Monitor first
configure_azure_monitor(
    connection_string="InstrumentationKey=...",
    resource=create_resource(),  # Uses OTEL_SERVICE_NAME, etc.
    enable_live_metrics=True,
)

# Then activate Agent Framework's telemetry code paths
# This is optional if ENABLE_INSTRUMENTATION and/or ENABLE_SENSITIVE_DATA are set in env vars
enable_instrumentation(enable_sensitive_data=False)

Langfuse için:

from agent_framework.observability import enable_instrumentation
from langfuse import get_client

langfuse = get_client()

# Verify connection
if langfuse.auth_check():
    print("Langfuse client is authenticated and ready!")

# Then activate Agent Framework's telemetry code paths
enable_instrumentation(enable_sensitive_data=False)

4. El ile kurulum

Tam denetim için, dışarı verenleri, sağlayıcıları ve araçları el ile ayarlayabilirsiniz. Uygun hizmet adına ve sürümüne sahip bir kaynak oluşturmak için yardımcı işlevini create_resource() kullanın. El ile izleme hakkında ayrıntılı yönergeler için OpenTelemetry Python belgelerine bakın.

5. Otomatik izleme (sıfır kod)

Uygulamanızı kod değişikliği olmadan otomatik olarak işaretlemek için OpenTelemetry CLI aracını kullanın:

opentelemetry-instrument \
    --traces_exporter console,otlp \
    --metrics_exporter console \
    --service_name your-service-name \
    --exporter_otlp_endpoint 0.0.0.0:4317 \
    python agent_framework_app.py

Daha fazla bilgi için OpenTelemetry Sıfır kod Python belgelerine bakın .

İzlemeleri ve ölçümleri kullanma

Gözlemlenebilirlik yapılandırıldıktan sonra özel aralıklar veya ölçümler oluşturabilirsiniz:

from agent_framework.observability import get_tracer, get_meter

tracer = get_tracer()
meter = get_meter()
with tracer.start_as_current_span("my_custom_span"):
    # do something
    pass
counter = meter.create_counter("my_custom_counter")
counter.add(1, {"key": "value"})

Bunlar, varsayılan olarak izleme kitaplığı adı olarak ayarlanmış genel sağlayıcıdan agent_framework bir izleyici veya ölçüm döndüren OpenTelemetry API'sinin sarmalayıcılarıdır.

Ortam değişkenleri

Aşağıdaki ortam değişkenleri Agent Framework gözlemlenebilirliğini denetler:

  • ENABLE_INSTRUMENTATION - Varsayılan değer, falseOpenTelemetry izlemesini etkinleştirmek için olarak ayarlanır true .
  • ENABLE_SENSITIVE_DATA - Hassas verilerin (istemler, yanıtlar, işlev çağrısı bağımsız değişkenleri ve sonuçlar) günlüğe kaydedilmesini etkinleştirmek için varsayılan olarak falseayarlanır true . Hassas verileri kullanıma sunma ihtimaline karşı bu ayara dikkat edin.
  • ENABLE_CONSOLE_EXPORTERS - Varsayılan olarak, falsetelemetri için konsol çıkışını etkinleştirmek üzere olarak ayarlanır true .
  • VS_CODE_EXTENSION_PORT - AI Toolkit veya Azure AI Foundry VS Code uzantısı tümleştirmesi için bağlantı noktası.

Uyarı

Hassas bilgiler istemleri, yanıtları ve daha fazlasını içerir ve yalnızca geliştirme veya test ortamlarında etkinleştirilmelidir. Hassas verileri kullanıma sunma ihtimaline karşı bunu üretim ortamında etkinleştirmeniz önerilmez.

Standart OpenTelemetry ortam değişkenleri

İşlev, configure_otel_providers() standart OpenTelemetry ortam değişkenlerini otomatik olarak okur:

OTLP Yapılandırması (Aspire Panosu, Jaeger vb. için):

  • OTEL_EXPORTER_OTLP_ENDPOINT - Tüm sinyaller için temel uç nokta (örn. http://localhost:4317)
  • OTEL_EXPORTER_OTLP_TRACES_ENDPOINT - İzlemelere özgü uç nokta (temeli geçersiz kılar)
  • OTEL_EXPORTER_OTLP_METRICS_ENDPOINT - Ölçümlere özgü uç nokta (temeli geçersiz kılar)
  • OTEL_EXPORTER_OTLP_LOGS_ENDPOINT - Günlüklere özgü uç nokta (temeli geçersiz kılar)
  • OTEL_EXPORTER_OTLP_PROTOCOL - Kullanılacak protokol (grpc veya http, varsayılanı: grpc)
  • OTEL_EXPORTER_OTLP_HEADERS - Tüm sinyaller için üst bilgiler (örn. key1=value1,key2=value2)

Hizmet Kimliği:

  • OTEL_SERVICE_NAME - Hizmet adı (varsayılan: agent_framework)
  • OTEL_SERVICE_VERSION - Hizmet sürümü (varsayılan: paket sürümü)
  • OTEL_RESOURCE_ATTRIBUTES - Ek kaynak öznitelikleri

Daha fazla ayrıntı için OpenTelemetry belirtimlerine bakın.

Microsoft Foundry kurulumu

Microsoft Foundry, yayma alanlarınıza yönelik görselleştirmelerle izleme için yerleşik desteğe sahiptir.

Foundry'nizin bir Azure İzleyici örneğiyle yapılandırıldığından emin olun, ayrıntılara bakın

azure-monitor-opentelemetry Paketi yükleyin:

pip install azure-monitor-opentelemetry

Gözlemlenebilirliği doğrudan öğesinden AzureAIClientyapılandırın:

Azure AI Foundry projeleri için gözlemlenebilirliği doğrudan içinden AzureAIClientyapılandırabilirsiniz:

from agent_framework.azure import AzureAIClient
from azure.ai.projects.aio import AIProjectClient
from azure.identity.aio import AzureCliCredential

async def main():
    async with (
        AzureCliCredential() as credential,
        AIProjectClient(endpoint="https://<your-project>.foundry.azure.com", credential=credential) as project_client,
        AzureAIClient(project_client=project_client) as client,
    ):
        # Automatically configures Azure Monitor with connection string from project
        await client.configure_azure_monitor(enable_live_metrics=True)

Tip

için client.configure_azure_monitor() bağımsız değişkenleri paketinden configure_azure_monitor() temel alınan azure-monitor-opentelemetry işleve geçirilir. Ayrıntılar için belgelere bakın; bağlantı dizesini ve kaynağı ayarlama işlemini üstleniriz.

Azure İzleyici'yi yapılandırın ve isteğe bağlı olarak izleme özelliğini etkinleştirin:

Application Insights ile Azure dışı yapay zeka projeleri için, Foundry'de özel bir aracı oluşturduğunuzdan emin olun, ayrıntılara bakın.

Ardından aracınızı Foundry'de kayıtlı openTelemetry aracı kimliğiyle çalıştırın ve azure izleyicisini aşağıdaki gibi yapılandırın:

from azure.monitor.opentelemetry import configure_azure_monitor
from agent_framework.observability import create_resource, enable_instrumentation

configure_azure_monitor(
    connection_string="InstrumentationKey=...",
    resource=create_resource(),
    enable_live_metrics=True,
)
# optional if you do not have ENABLE_INSTRUMENTATION in env vars
enable_instrumentation()

# Create your agent with the same OpenTelemetry agent ID as registered in Foundry
agent = Agent(
    chat_client=...,
    name="My Agent",
    instructions="You are a helpful assistant.",
    id="<OpenTelemetry agent ID>"
)
# use the agent as normal

Aspire Panosu

Azure kurulumu olmadan yerel geliştirme için Docker aracılığıyla yerel olarak çalışan ve mükemmel bir telemetri görüntüleme deneyimi sağlayan Aspire Panosu'nu kullanabilirsiniz.

Docker ile Aspire Panosu'nu ayarlama

# Pull and run the Aspire Dashboard container
docker run --rm -it -d \
    -p 18888:18888 \
    -p 4317:18889 \
    --name aspire-dashboard \
    mcr.microsoft.com/dotnet/aspire-dashboard:latest

Bu komut panoyu şu komutla başlatır:

  • Web Kullanıcı Arabirimi: Şu konumda kullanılabilir: http://localhost:18888
  • OTLP uç noktası: Uygulamalarınızın telemetri verilerini göndermesi için adresinde http://localhost:4317 kullanılabilir

Uygulamanızı yapılandırma

Aşağıdaki ortam değişkenlerini ayarlayın:

ENABLE_INSTRUMENTATION=true
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317

Veya bunları dosyanıza .env ekleyin ve örneğinizi çalıştırın.

Örneğinizin çalışması tamamlandıktan sonra, telemetri verilerini görmek için bir web tarayıcısında adresine gidin http://localhost:18888 . Panoda kimlik doğrulaması yapmak ve izlemelerinizi, günlüklerinizi ve ölçümlerinizi keşfetmeye başlamak için Aspire Dashboard araştırma kılavuzunu izleyin.

Yayılma alanları ve ölçümler

Her şey ayarlandıktan sonra, sizin için otomatik olarak oluşturulan span'ları ve ölçümleri görmeye başlayacaksınız, yayılma alanları şunlardır:

  • invoke_agent <agent_name>: Bu, her aracı çağrısı için en üst düzey yayılma alanıdır, alt öğe olarak diğer tüm yayılma aralıklarını içerir.
  • chat <model_name>: Aracı temel sohbet modelini çağırdığında bu yayılma alanı oluşturulur, istem ve yanıtı öznitelik olarak (olarak ayarlanırsa enable_sensitive_dataTrue) içerir.
  • execute_tool <function_name>: Aracı bir işlev aracını çağırdığında bu yayılma alanı oluşturulur, olarak ayarlanırsa enable_sensitive_dataTrueişlev bağımsız değişkenlerini ve sonucu öznitelik olarak içerir.

Oluşturulan ölçümler şunlardır:

  • Sohbet istemcisi ve chat işlemleri için:

    • gen_ai.client.operation.duration (histogram): Bu ölçüm her işlemin süresini saniye cinsinden ölçer.
    • gen_ai.client.token.usage (histogram): Bu ölçüm belirteç kullanımını belirteç sayısı olarak ölçer.
  • İşlemler sırasında işlev çağırma için execute_tool :

    • agent_framework.function.invocation.duration (histogram): Bu ölçüm, her işlev yürütmesinin süresini saniye cinsinden ölçer.

Örnek izleme çıkışı

Gözlemlenebilirlik etkinleştirilmiş bir aracı çalıştırdığınızda, aşağıdaki konsol çıkışına benzer izleme verileri görürsünüz:

{
    "name": "invoke_agent Joker",
    "context": {
        "trace_id": "0xf2258b51421fe9cf4c0bd428c87b1ae4",
        "span_id": "0x2cad6fc139dcf01d",
        "trace_state": "[]"
    },
    "kind": "SpanKind.CLIENT",
    "parent_id": null,
    "start_time": "2025-09-25T11:00:48.663688Z",
    "end_time": "2025-09-25T11:00:57.271389Z",
    "status": {
        "status_code": "UNSET"
    },
    "attributes": {
        "gen_ai.operation.name": "invoke_agent",
        "gen_ai.system": "openai",
        "gen_ai.agent.id": "Joker",
        "gen_ai.agent.name": "Joker",
        "gen_ai.request.instructions": "You are good at telling jokes.",
        "gen_ai.response.id": "chatcmpl-CH6fgKwMRGDtGNO3H88gA3AG2o7c5",
        "gen_ai.usage.input_tokens": 26,
        "gen_ai.usage.output_tokens": 29
    }
}

Bu izleme şunları gösterir:

  • İzleme ve yayılma tanımlayıcıları: İlgili işlemleri ilişkilendirmek için
  • Zamanlama bilgileri: İşlem başlatıldığında ve sona erdiğinde
  • Aracı meta verileri: Aracı Kimliği, adı ve yönergeleri
  • Model bilgileri: Kullanılan yapay zeka sistemi (OpenAI) ve yanıt kimliği
  • Belirteç kullanımı: Maliyet izleme için giriş ve çıkış belirteci sayıları

Samples

Depoda microsoft/agent-framework bu özellikleri gösteren bir dizi örnek vardır. Daha fazla bilgi için gözlemlenebilirlik örnekleri klasörüne bakın. Bu klasör, sıfır kod telemetrisini kullanmaya yönelik örnekler de içerir.

Tam örnek

# Copyright (c) Microsoft. All rights reserved.

import asyncio
from random import randint
from typing import Annotated

from agent_framework import Agent, tool
from agent_framework.observability import configure_otel_providers, get_tracer
from agent_framework.openai import OpenAIChatClient
from opentelemetry.trace import SpanKind
from opentelemetry.trace.span import format_trace_id
from pydantic import Field

"""
This sample shows how you can observe an agent in Agent Framework by using the
same observability setup function.
"""


# NOTE: approval_mode="never_require" is for sample brevity. Use "always_require" in production; see samples/02-agents/tools/function_tool_with_approval.py and samples/02-agents/tools/function_tool_with_approval_and_sessions.py.
@tool(approval_mode="never_require")
async def get_weather(
    location: Annotated[str, Field(description="The location to get the weather for.")],
) -> str:
    """Get the weather for a given location."""
    await asyncio.sleep(randint(0, 10) / 10.0)  # Simulate a network call
    conditions = ["sunny", "cloudy", "rainy", "stormy"]
    return f"The weather in {location} is {conditions[randint(0, 3)]} with a high of {randint(10, 30)}°C."


async def main():
    # calling `configure_otel_providers` will *enable* tracing and create the necessary tracing, logging
    # and metrics providers based on environment variables.
    # See the .env.example file for the available configuration options.
    configure_otel_providers()

    questions = ["What's the weather in Amsterdam?", "and in Paris, and which is better?", "Why is the sky blue?"]

    with get_tracer().start_as_current_span("Scenario: Agent Chat", kind=SpanKind.CLIENT) as current_span:
        print(f"Trace ID: {format_trace_id(current_span.get_span_context().trace_id)}")

        agent = Agent(
            client=OpenAIChatClient(),
            tools=get_weather,
            name="WeatherAgent",
            instructions="You are a weather assistant.",
            id="weather-agent",
        )
        thread = agent.create_session()
        for question in questions:
            print(f"\nUser: {question}")
            print(f"{agent.name}: ", end="")
            async for update in agent.run(
                question,
                session=thread,
                stream=True,
            ):
                if update.text:
                    print(update.text, end="")


if __name__ == "__main__":
    asyncio.run(main())

Sonraki Adımlar