5a558eb09e
TypeScript SDK Compatibility V1.x E2E Tests / Select Node version matrix (push) Has been cancelled
TypeScript SDK Compatibility V1.x E2E Tests / TypeScript SDK Compatibility V1.x E2E Tests Node ${{matrix.node_version}} (push) Has been cancelled
TypeScript SDK E2E Tests / TypeScript SDK E2E Tests Node ${{matrix.node_version}} (push) Has been cancelled
Opik Optimizer - E2E Tests / build-opik (push) Has been cancelled
TypeScript SDK Compatibility V1.x E2E Tests / build-opik (push) Has been cancelled
Python SDK E2E Tests / Select Python version matrix (push) Has been cancelled
Python SDK E2E Tests / Python SDK E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Python SDK E2E Tests / build-opik (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / Select Python version matrix (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / Python SDK Compatibility V1.x E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / build-opik (push) Has been cancelled
TypeScript SDK E2E Tests / Select Node version matrix (push) Has been cancelled
TypeScript SDK E2E Tests / build-opik (push) Has been cancelled
Opik Optimizer - E2E Tests / Opik Optimizer E2E Tests Python ${{matrix.python_version}} (push) Has been cancelled
Opik Optimizer - E2E Tests / Opik Optimizer Integration Smoke Tests (push) Has been cancelled
🐙 Code Quality / detect (push) Has been cancelled
🐙 Code Quality / lint (${{ matrix.leg.name }}) (push) Has been cancelled
🐙 Code Quality / summary (push) Has been cancelled
TypeScript SDK Library Integration Tests / Check Secrets (push) Has been cancelled
TypeScript SDK Library Integration Tests / opik-vercel (Vercel AI SDK / eve) (push) Has been cancelled
SDK Library Integration Tests Runner / Check Secrets (push) Has been cancelled
SDK Library Integration Tests Runner / Missed OpenAI API Key Warning (push) Has been cancelled
SDK Library Integration Tests Runner / Build (push) Has been cancelled
SDK Library Integration Tests Runner / openai_tests (push) Has been cancelled
SDK Library Integration Tests Runner / langchain_tests (push) Has been cancelled
SDK Library Integration Tests Runner / langchain_legacy_tests (push) Has been cancelled
SDK Library Integration Tests Runner / llama_index_tests (push) Has been cancelled
SDK Library Integration Tests Runner / anthropic_tests (push) Has been cancelled
SDK Library Integration Tests Runner / mistral_tests (push) Has been cancelled
SDK Library Integration Tests Runner / groq_tests (push) Has been cancelled
SDK Library Integration Tests Runner / aisuite_tests (push) Has been cancelled
SDK Library Integration Tests Runner / haystack_tests (push) Has been cancelled
SDK Library Integration Tests Runner / dspy_tests (push) Has been cancelled
SDK Library Integration Tests Runner / crewai_v0_tests (push) Has been cancelled
SDK Library Integration Tests Runner / crewai_v1_tests (push) Has been cancelled
SDK Library Integration Tests Runner / genai_tests (push) Has been cancelled
SDK Library Integration Tests Runner / adk_tests (push) Has been cancelled
SDK Library Integration Tests Runner / adk_legacy_1_3_0_tests (push) Has been cancelled
SDK Library Integration Tests Runner / evaluation_metrics_tests (push) Has been cancelled
SDK Library Integration Tests Runner / bedrock_tests (push) Has been cancelled
SDK Library Integration Tests Runner / litellm_tests (push) Has been cancelled
SDK Library Integration Tests Runner / harbor_tests (push) Has been cancelled
SDK Library Integration Tests Runner / Slack Notification (push) Has been cancelled
Lint Opik Helm Chart / render-equality (push) Has been cancelled
Opik Optimizer - Unit Tests / Opik Optimizer Unit Tests Python ${{matrix.python_version}} (push) Has been cancelled
Python BE E2E Tests / Python BE E2E (push) Has been cancelled
Python Backend Tests / run-python-backend-tests (push) Has been cancelled
Python SDK Unit Tests / Python SDK Unit Tests ${{matrix.python_version}} (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
SDK E2E Libraries Integration Tests / Check Secrets (push) Has been cancelled
SDK E2E Libraries Integration Tests / Missed OpenAI API Key Warning (push) Has been cancelled
SDK E2E Libraries Integration Tests / build-opik (push) Has been cancelled
SDK E2E Libraries Integration Tests / E2E Lib Integration Python ${{matrix.python_version}} (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-gemini) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-langchain) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-openai) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-otel) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-vercel) (push) Has been cancelled
TypeScript SDK Build & Publish / build-and-publish (push) Has been cancelled
TypeScript SDK Unit Tests / Test on Node ${{ matrix.node-version }} (push) Has been cancelled
Backend Tests / discover-tests (push) Has been cancelled
Backend Tests / ${{ matrix.name }} (push) Has been cancelled
Build and Publish SDK / build-and-publish (push) Has been cancelled
Build Opik Docker Images / set-version (push) Has been cancelled
Build Opik Docker Images / build-backend (push) Has been cancelled
Build Opik Docker Images / build-sandbox-executor-python (push) Has been cancelled
Build Opik Docker Images / build-python-backend (push) Has been cancelled
Build Opik Docker Images / build-frontend (push) Has been cancelled
Build Opik Docker Images / create-git-tag (push) Has been cancelled
ClickHouse Migration Cluster Check / validate-clickhouse-migrations (push) Has been cancelled
Docs - Publish / run (push) Has been cancelled
E2E Tests - Post Merge (v2) / 🧪 E2E v2 Tests (${{ github.event.inputs.tier || 't1' }}) (push) Has been cancelled
E2E Tests - Post Merge (v2) / 📢 Slack Notification (push) Has been cancelled
Frontend Unit Tests / Test on Node 20 (push) Has been cancelled
Guardrails E2E Tests / Select Python version matrix (push) Has been cancelled
Guardrails E2E Tests / Guardrails E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Guardrails E2E Tests / 📢 Slack Notification (push) Has been cancelled
Guardrails Backend Unit Tests / Guardrails Backend Unit Tests (push) Has been cancelled
Guardrails Backend Unit Tests / 📢 Slack Notification (push) Has been cancelled
Lint Opik Helm Chart / lint-helm-chart (Helm v3.21.0) (push) Has been cancelled
Lint Opik Helm Chart / lint-helm-chart (Helm v4.2.0) (push) Has been cancelled
Lint Opik Helm Chart / unittest-helm-chart (push) Has been cancelled
220 lines
8.9 KiB
Plaintext
220 lines
8.9 KiB
Plaintext
---
|
|
description: Start here to integrate Opik into your Microsoft Agent Framework-based
|
|
.NET application for end-to-end LLM observability, unit testing, and optimization.
|
|
headline: Microsoft Agent Framework | Opik Documentation
|
|
og:description: Build and deploy AI agents with the Microsoft Agent Framework, featuring
|
|
multi-language support and advanced orchestration capabilities.
|
|
og:site_name: Opik Documentation
|
|
og:title: Microsoft Agent Framework for AI Development - Opik
|
|
title: Observability for Microsoft Agent Framework (.NET) with Opik
|
|
canonical-url: https://www.comet.com/docs/opik/integrations/microsoft-agent-framework-dotnet
|
|
---
|
|
|
|
[Microsoft Agent Framework](https://github.com/microsoft/agent-framework) is a comprehensive multi-language framework for building, orchestrating, and deploying AI agents and multi-agent workflows with support for both Python and .NET implementations.
|
|
|
|
The framework provides everything from simple chat agents to complex multi-agent workflows with graph-based orchestration, built-in OpenTelemetry integration for distributed tracing and monitoring, and a flexible middleware system for request/response processing.
|
|
|
|
## Account Setup
|
|
|
|
[Comet](https://www.comet.com/site?from=llm&utm_source=opik&utm_medium=colab&utm_content=agent-framework-dotnet&utm_campaign=opik) provides a hosted version of the Opik platform, [simply create an account](https://www.comet.com/signup?from=llm&utm_source=opik&utm_medium=colab&utm_content=agent-framework-dotnet&utm_campaign=opik) and grab your API Key.
|
|
|
|
> You can also run the Opik platform locally, see the [installation guide](https://www.comet.com/docs/opik/self-host/overview/?from=llm&utm_source=opik&utm_medium=colab&utm_content=agent-framework-dotnet&utm_campaign=opik) for more information.
|
|
|
|
<Frame>
|
|
<img src="/img/tracing/microsoft-agent-framework-dotnet_integration.png" alt="Microsoft Agent Framework .NET tracing" />
|
|
</Frame>
|
|
|
|
## Getting started
|
|
|
|
To use the Microsoft Agent Framework .NET integration with Opik, you will need to have the Agent Framework and the required OpenTelemetry packages installed:
|
|
|
|
```bash
|
|
# Agent Framework (2 packages)
|
|
dotnet add package Microsoft.Agents.AI --prerelease
|
|
dotnet add package Microsoft.Extensions.AI.OpenAI --prerelease
|
|
|
|
# Hosting (1 package)
|
|
dotnet add package Microsoft.Extensions.Hosting
|
|
|
|
# OpenTelemetry (3 packages)
|
|
dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol
|
|
dotnet add package OpenTelemetry.Extensions.Hosting
|
|
dotnet add package OpenTelemetry.Instrumentation.Http
|
|
```
|
|
|
|
You will also need to configure your OpenAI API key:
|
|
|
|
```bash
|
|
export OPENAI_API_KEY=<your-openai-api-key>
|
|
```
|
|
|
|
In addition, you will need to set the following environment variables to configure OpenTelemetry to send data to Opik:
|
|
|
|
<Tabs>
|
|
<Tab value="Opik Cloud" title="Opik Cloud">
|
|
If you are using Opik Cloud, you will need to set the following
|
|
environment variables:
|
|
|
|
```bash wordWrap
|
|
export OTEL_EXPORTER_OTLP_ENDPOINT=https://www.comet.com/opik/api/v1/private/otel/v1/traces
|
|
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=<your-api-key>,Comet-Workspace=default"
|
|
export OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
|
|
```
|
|
|
|
<Tip>
|
|
To log the traces to a specific project, you can add the
|
|
`projectName` parameter to the `OTEL_EXPORTER_OTLP_HEADERS`
|
|
environment variable:
|
|
|
|
```bash wordWrap
|
|
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=<your-api-key>,Comet-Workspace=default,projectName=<your-project-name>"
|
|
```
|
|
|
|
You can also update the `Comet-Workspace` parameter to a different
|
|
value if you would like to log the data to a different workspace.
|
|
</Tip>
|
|
</Tab>
|
|
<Tab value="Enterprise deployment" title="Enterprise deployment">
|
|
If you are using an Enterprise deployment of Opik, you will need to set the following
|
|
environment variables:
|
|
|
|
```bash wordWrap
|
|
export OTEL_EXPORTER_OTLP_ENDPOINT=https://<comet-deployment-url>/opik/api/v1/private/otel/v1/traces
|
|
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=<your-api-key>,Comet-Workspace=default"
|
|
export OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
|
|
```
|
|
|
|
<Tip>
|
|
To log the traces to a specific project, you can add the
|
|
`projectName` parameter to the `OTEL_EXPORTER_OTLP_HEADERS`
|
|
environment variable:
|
|
|
|
```bash wordWrap
|
|
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=<your-api-key>,Comet-Workspace=default,projectName=<your-project-name>"
|
|
```
|
|
|
|
You can also update the `Comet-Workspace` parameter to a different
|
|
value if you would like to log the data to a different workspace.
|
|
</Tip>
|
|
</Tab>
|
|
<Tab value="Self-hosted instance" title="Self-hosted instance">
|
|
|
|
If you are self-hosting Opik, you will need to set the following environment
|
|
variables:
|
|
|
|
```bash
|
|
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:5173/api/v1/private/otel/v1/traces
|
|
export OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
|
|
```
|
|
|
|
<Tip>
|
|
To log the traces to a specific project, you can add the `projectName`
|
|
parameter to the `OTEL_EXPORTER_OTLP_HEADERS` environment variable:
|
|
|
|
```bash
|
|
export OTEL_EXPORTER_OTLP_HEADERS="projectName=<your-project-name>"
|
|
```
|
|
|
|
</Tip>
|
|
</Tab>
|
|
|
|
</Tabs>
|
|
|
|
## Using Opik with Microsoft Agent Framework (.NET)
|
|
|
|
The Microsoft Agent Framework has built-in OpenTelemetry instrumentation. You need to configure the OpenTelemetry SDK to use HTTP/Protobuf protocol and export to Opik. Here's a complete example:
|
|
|
|
```csharp
|
|
using Microsoft.Agents.AI;
|
|
using Microsoft.Extensions.AI;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.Hosting;
|
|
using OpenAI;
|
|
using OpenTelemetry;
|
|
using OpenTelemetry.Resources;
|
|
using OpenTelemetry.Trace;
|
|
|
|
#pragma warning disable OPENAI001
|
|
|
|
const string SourceName = "AgentFramework";
|
|
|
|
// Create host with OpenTelemetry configuration
|
|
var builder = Host.CreateApplicationBuilder(args);
|
|
|
|
// Configure OpenTelemetry
|
|
builder.Services.AddOpenTelemetry()
|
|
.ConfigureResource(resource => resource
|
|
.AddService(serviceName: "agent-framework-demo", serviceVersion: "1.0.0"))
|
|
.WithTracing(tracing => tracing
|
|
.AddSource(SourceName) // Our custom spans
|
|
.AddSource("*Microsoft.Extensions.AI") // Chat client telemetry
|
|
.AddSource("*Microsoft.Extensions.Agents*") // Agent telemetry
|
|
.AddHttpClientInstrumentation() // HTTP calls
|
|
.AddOtlpExporter()); // Reads OTEL_EXPORTER_OTLP_* env vars automatically
|
|
|
|
var host = builder.Build();
|
|
await host.StartAsync();
|
|
|
|
// Create instrumented chat client
|
|
// Note: OpenAI SDK requires explicit API key, but you can read from env var
|
|
var apiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY")
|
|
?? throw new InvalidOperationException("OPENAI_API_KEY environment variable is required");
|
|
|
|
using var instrumentedChatClient = new OpenAIClient(apiKey)
|
|
.GetChatClient("gpt-4o-mini")
|
|
.AsIChatClient() // Convert to Microsoft.Extensions.AI.IChatClient
|
|
.AsBuilder()
|
|
.UseOpenTelemetry( // Enable telemetry on chat client
|
|
sourceName: SourceName,
|
|
configure: (cfg) => cfg.EnableSensitiveData = true)
|
|
.Build();
|
|
|
|
// Create instrumented agent
|
|
var agent = new ChatClientAgent(
|
|
instrumentedChatClient,
|
|
name: "Assistant",
|
|
instructions: "You are a helpful assistant.")
|
|
.AsBuilder()
|
|
.UseOpenTelemetry(SourceName) // Enable telemetry on agent
|
|
.Build();
|
|
|
|
// Run agent - telemetry is automatic!
|
|
Console.WriteLine(await agent.RunAsync("Write a haiku about AI agents."));
|
|
|
|
// Ensure traces are flushed
|
|
var tracerProvider = host.Services.GetService<TracerProvider>();
|
|
tracerProvider?.ForceFlush();
|
|
await Task.Delay(2000);
|
|
|
|
await host.StopAsync();
|
|
```
|
|
|
|
<Note>
|
|
**Important**: The .NET OpenTelemetry SDK requires explicitly setting `OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf` to use HTTP with Protocol Buffers. If not set, it defaults to gRPC which is not supported by Opik's endpoint.
|
|
|
|
You can also configure this programmatically:
|
|
```csharp
|
|
.AddOtlpExporter(options =>
|
|
{
|
|
options.Protocol = OtlpExportProtocol.HttpProtobuf;
|
|
})
|
|
```
|
|
</Note>
|
|
|
|
The framework will automatically:
|
|
- Create traces for agent executions
|
|
- Log input prompts and outputs
|
|
- Track token usage and performance metrics
|
|
- Capture any errors or exceptions
|
|
|
|
## Further improvements
|
|
|
|
If you would like to see us improve this integration, simply open a new feature
|
|
request on [Github](https://github.com/comet-ml/opik/issues).
|
|
|
|
## Reference
|
|
|
|
For more information about the Microsoft Agent Framework OpenTelemetry integration, see:
|
|
- [Agent Framework OpenTelemetry Sample](https://github.com/microsoft/agent-framework/tree/main/dotnet/samples/02-agents/AgentOpenTelemetry)
|
|
- [OpenTelemetry .NET Documentation](https://opentelemetry.io/docs/languages/net/)
|