Это важно
Чтобы получить ранний доступ к Microsoft Agent 365, необходимо быть частью программы предварительного просмотра Фронтир. Frontier напрямую подключает вас к последним инновациям ИИ от Microsoft. Получите практический опыт с прорывными функциями, делитесь своими впечатлениями с продуктовыми командами и помогите сформировать будущее Искусственного интеллекта. Предпросмотры Frontier подчиняются существующим условиям предварительного просмотра в рамках ваших клиентских соглашений. Так как эти функции по-прежнему находятся в разработке, их доступность и возможности могут меняться со временем.
Чтобы участвовать в экосистеме Agent 365, необходимо добавить в ваш агент возможности наблюдаемости Agent 365. Наблюдаемость агента 365 основана на OpenTelemetry (OTel) и предоставляет единый фреймворк для сбора данных телеметрии согласованно и безопасно на всех платформах агентных решений. Реализуя этот обязательный компонент, ИТ-администраторы позволяют ИТ-администраторам отслеживать действия агента в Microsoft Admin Center (MAC) и разрешать группам безопасности использовать Defender и Purview для обнаружения соответствия требованиям и угроз.
Ключевые преимущества
-
Сквозная видимость: сбор комплексной телеметрии для каждого вызова агента, включая сеансы, вызовы инструментов и исключения, что обеспечивает полную трассировку на разных платформах.
-
Включение безопасности и соответствия: передача унифицированных журналов аудита в Defender и Purview, что позволяет создавать расширенные сценарии безопасности и отчеты о соответствии для агента.
-
Кроссплатформенная гибкость: Использование стандартов OTel и поддержка различных сред выполнения и платформ, таких как Copilot Studio, Foundry и будущие фреймворки агентов.
-
Эффективность работы для администраторов: обеспечение централизованной наблюдаемости в MAC, сокращение времени устранения неполадок и улучшение управления доступом на основе ролей для ИТ-команд, управляющих агентом.
Installation
Используйте эти команды для установки модулей наблюдаемости для языков, поддерживаемых агентом 365.
pip install microsoft-agents-a365-observability-core
pip install microsoft-agents-a365-runtime
npm install @microsoft/agents-a365-observability
npm install @microsoft/agents-a365-runtime
dotnet add package Microsoft.Agents.A365.Observability
dotnet add package Microsoft.Agents.A365.Observability.Runtime
Конфигурация
Переменные среды, необходимые для наблюдения, :
| Переменная среды |
Description |
ENABLE_OBSERVABILITY=true |
Флаг для включения/отключения трассировки. По умолчанию false |
ENABLE_A365_OBSERVABILITY_EXPORTER=true |
True экспорт журналов в нашу службу. В противном случае возвращается к экспортеру консоли |
from microsoft_agents_a365.observability.core import config
def token_resolver(agent_id: str, tenant_id: str) -> str | None:
# Implement secure token retrieval here
return "Bearer <token>"
config.configure(
service_name="my-agent-service",
service_namespace="my.namespace",
token_resolver=token_resolver,
)
Исключите сопоставитель маркеров для входа в консоль.
Переменные среды, необходимые для наблюдения, :
| Переменная среды |
Description |
ENABLE_OBSERVABILITY=true |
Флаг для включения/отключения трассировки. По умолчанию false |
ENABLE_A365_OBSERVABILITY_EXPORTER=true |
True экспорт журналов в нашу службу. В противном случае возвращается к экспортеру консоли |
import { ObservabilityManager } from '@microsoft/agents-a365-observability';
const tokenResolver = (agentId, tenantId) => {
// Your token resolution logic here
return "your-token";
};
// Advanced configuration with builder pattern
const builder = ObservabilityManager.configure(builder =>
builder
.withService('my-agent-service', '1.0.0')
.withTokenResolver((agentId, tenantId) => {
return tokenResolver(agentId, tenantId);
})
);
builder.start();
Установите EnableAgent365Exporter в true в appsettings.json.
Добавьте Program.cs в коллекцию служб в Agent365ExporterOptions. Это изменение настраивает делегата, который экспортер трассировки использует для получения маркера.
Добавьте зависимости, связанные с наблюдаемостью, используя AddA365Tracing().
using Microsoft.Agents.A365.Observability.Runtime;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton(sp =>
{
return new Agent365ExporterOptions
{
ClusterCategory = "prod",
TokenResolver = async (agentId, tenantId) =>
{
// It's recommended to implement caching in your token provider for performance.
var token = await tokenProvider.GetObservabilityTokenAsync(agentId, tenantId);
return token;
}
};
});
builder.AddA365Tracing();
Атрибуты багажа
Используется BaggageBuilder для задания контекстной информации, которая проходит через все диапазоны в запросе.
Пакет SDK копирует все непустые записи багажа в новые запуски спанов, не перезаписывая существующие атрибуты.
from microsoft_agents_a365.observability.core.middleware.baggage_builder import BaggageBuilder
with (
BaggageBuilder()
.tenant_id("tenant-123")
.agent_id("agent-456")
.correlation_id("corr-789")
.build()
):
# Any spans started in this context will receive these as attributes
pass
import { BaggageBuilder } from '@microsoft/agents-a365-observability';
// Create and apply baggage context
using baggageScope = new BaggageBuilder()
// Core identifiers
.tenantId('tenant-123')
.agentId('agent-456')
.correlationId('correlation-789')
.build();
// Execute operations within the baggage context
baggageScope.run(() => {
// All spans created within this context will inherit the baggage values
// Invoke another agent
using agentScope = InvokeAgentScope.start(invokeDetails, agentDetails, tenantDetails);
// ... agent logic
// Execute tools
using toolScope = ExecuteToolScope.start(toolDetails, agentDetails, tenantDetails);
// ... tool logic
});
using var baggageScope = new BaggageBuilder()
.TenantId('tenant-123')
.AgentId('agent-456')
.CorrelationId('correlation-789')
.Build();
// Any spans started in this context will receive them as attributes.
Разрешитель токенов
При использовании экспортера Agent 365 необходимо предоставить функцию разрешения токенов, которая возвращает токен аутентификации.
При использовании SDK Agent 365 Observability с платформой размещения агента, можно создавать токены на основе активностей агента с помощью TurnContext.
from microsoft_agents.activity import load_configuration_from_env
from microsoft_agents.authentication.msal import MsalConnectionManager
from microsoft_agents.hosting.aiohttp import CloudAdapter
from microsoft_agents.hosting.core import (
AgentApplication,
Authorization,
MemoryStorage,
TurnContext,
TurnState,
)
from microsoft_agents_a365.runtime.environment_utils import (
get_observability_authentication_scope,
)
agents_sdk_config = load_configuration_from_env(environ)
STORAGE = MemoryStorage()
CONNECTION_MANAGER = MsalConnectionManager(**agents_sdk_config)
ADAPTER = CloudAdapter(connection_manager=CONNECTION_MANAGER)
ADAPTER.use(TranscriptLoggerMiddleware(ConsoleTranscriptLogger()))
AUTHORIZATION = Authorization(STORAGE, CONNECTION_MANAGER, **agents_sdk_config)
AGENT_APP = AgentApplication[TurnState](
storage=STORAGE, adapter=ADAPTER, authorization=AUTHORIZATION, **agents_sdk_config
)
@AGENT_APP.activity("message", auth_handlers=["AGENTIC"])
async def on_message(context: TurnContext, _state: TurnState):
aau_auth_token = await AGENT_APP.auth.exchange_token(
context,
scopes=get_observability_authentication_scope(),
auth_handler_id="AGENTIC",
)
# cache this auth token and return via token resolver
import {
TurnState,
AgentApplication,
MemoryStorage,
TurnContext,
} from '@microsoft/agents-hosting';
import { Activity, ActivityTypes } from '@microsoft/agents-activity';
import { getObservabilityAuthenticationScope } from '@microsoft/agents-a365-runtime';
interface ConversationState {
count: number;
}
type ApplicationTurnState = TurnState<ConversationState>;
const downloader = new AttachmentDownloader();
const storage = new MemoryStorage();
export const agentApplication = new AgentApplication<ApplicationTurnState>({
authorization: {
agentic: { } // We have the type and scopes set in the .env file
},
storage,
});
agentApplication.onActivity(
ActivityTypes.Message,
async (context: TurnContext, state: ApplicationTurnState) => {
const aauAuthToken = await agentApplication.authorization.exchangeToken(context,'agentic', {
scopes: getObservabilityAuthenticationScope()
} )
// cache this auth token and return via token resolver
};
Добавьте резольвер токенов агентов в коллекцию служб.
using Microsoft.Agents.A365.Observability;
builder.Services.AddAgenticTracingExporter();
В приложении агента зарегистрируйте токен.
using Microsoft.Agents.Builder;
using Microsoft.Agents.Core.Models;
using Microsoft.Extensions.Logging;
using Microsoft.Agents.A365.Observability.Caching;
using System;
using System.Threading.Tasks;
public class MyAgent : AgentApplication
{
private readonly IExporterTokenCache<AgenticTokenStruct> _agentTokenCache;
private readonly ILogger<MyAgent> _logger;
public MyAgent(AgentApplicationOptions options, IExporterTokenCache<AgenticTokenStruct> agentTokenCache, ILogger<MyAgent> logger)
: base(options)
{
_agentTokenCache = agentTokenCache ?? throw new ArgumentNullException(nameof(agentTokenCache));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
protected async Task MessageActivityAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
{
using var baggageScope = new BaggageBuilder()
.TenantId(turnContext.Activity.Recipient.TenantId)
.AgentId(turnContext.Activity.Recipient.AgenticAppId)
.Build();
try
{
_agentTokenCache.RegisterObservability(
turnContext.Activity.Recipient.AgenticAppId,
turnContext.Activity.Recipient.TenantId,
new AgenticTokenStruct
{
UserAuthorization = UserAuthorization,
TurnContext = turnContext
},
EnvironmentUtils.GetObservabilityAuthenticationScope()
);
}
catch (Exception ex)
{
_logger.LogWarning($"Error registering for observability: {ex.Message}");
}
}
}
Автоматическое инструментирование
Автоматическое инструментирование слушает сигналы телеметрии агентских фреймворков (SDK) для трассировок и перенаправляет их в службу наблюдаемости Agent 365. Это устраняет необходимость для разработчиков писать код для мониторинга вручную, упрощает настройку и обеспечивает постоянный мониторинг производительности.
Автоматическое инструментирование поддерживается на нескольких пакетах SDK и платформах:
Замечание
Поддержка автоматического инструментирования зависит от реализации платформы и пакета SDK.
Семантическое ядро
Для автоматического инструментирования требуется использование построителя багажа. Установите идентификатор агента и идентификатор арендатора с помощью BaggageBuilder.
Установите пакет
pip install microsoft-agents-a365-observability-extensions-semantic-kernel
Настройка наблюдаемости
from microsoft_agents_a365.observability.core.config import configure
from microsoft_agents_a365.observability.extensions.semantic_kernel import SemanticKernelInstrumentor
# Configure observability
configure(
service_name="my-semantic-kernel-agent",
service_namespace="ai.agents"
)
# Enable auto-instrumentation
instrumentor = SemanticKernelInstrumentor()
instrumentor.instrument()
# Your Semantic Kernel code is now automatically traced
Семантический ядро не поддерживается в JavaScript.
Добавьте зависимости в коллекцию служб.
using Microsoft.Agents.A365.Observability.Extensions.SemanticKernel;
builder.Services.AddTracing(config => config.WithSemanticKernel());
Установите AgentId и TenantId, используя BaggageBuilder. Убедитесь, что идентификатор, используемый при создании ChatCompletionAgent, совпадает с идентификатором агента, переданного в BaggageBuilder.
using Microsoft.Agents.A365.Observability.Extensions.SemanticKernel;
using Microsoft.Agents.A365.Observability.Runtime.Common;
public class MyAgent
{
public async Task<AgentResponse> ProcessUserRequest(string userInput)
{
using var baggageScope = new BaggageBuilder()
.AgentId(<your-agent-id>) // NOTE: This will be the agent ID with which the TokenResolver delegate is invoked.
.TenantId(<your-tenant-id>) // NOTE: This will be the tenant ID with which the TokenResolver delegate is invoked.
.Build();
var chatCompletionAgent = new ChatCompletionAgent
{
// NOTE: This will be the agent ID with which the TokenResolver delegate is invoked. Should match above.
Id = <your-agent-id>,
...
};
}
}
Открытый ИИ
Для автоматического инструментирования требуется использование построителя багажа. Установите идентификатор агента и идентификатор арендатора с помощью BaggageBuilder.
Установите пакет .
pip install microsoft-agents-a365-observability-extensions-openai
Настройка наблюдаемости.
from microsoft_agents_a365.observability.core.config import configure
from microsoft_agents_a365.observability.extensions.openai_agents import OpenAIAgentsTraceInstrumentor
# Configure observability
configure(
service_name="my-openai-agent",
service_namespace="ai.agents"
)
# Enable auto-instrumentation
instrumentor = OpenAIAgentsTraceInstrumentor()
instrumentor.instrument()
# Your OpenAI Agents code is now automatically traced
Установите пакет
npm install @microsoft/agents-a365-observability-extensions-openai
Настройка наблюдаемости
import { ObservabilityManager } from '@microsoft/agents-a365-observability';
import { OpenAIAgentsTraceInstrumentor } from '@microsoft/agents-a365-observability-extensions-openai';
// Configure observability first
const sdk = ObservabilityManager.configure((builder) =>
builder
.withService('My Agent Service', '1.0.0')
.withConsoleExporter(true)
);
// Create and enable the instrumentor
const instrumentor = new OpenAIAgentsTraceInstrumentor({
enabled: true,
tracerName: 'openai-agents-tracer',
tracerVersion: '1.0.0'
});
sdk.start();
instrumentor.enable();
Добавьте зависимости в коллекцию служб.
using Microsoft.Agents.A365.Observability.Extensions.OpenAI;
builder.Services.AddTracing(config => config.WithOpenAI());
Установите AgentId и TenantId, используя BaggageBuilder. Для вызовов инструментов запустите трассировку с помощью Trace() на экземпляре ChatToolCall.
using Microsoft.Agents.A365.Observability.Extensions.OpenAI;
using Microsoft.Agents.A365.Observability.Runtime.Common;
public class MyAgent
{
public async Task<AgentResponse> ProcessUserRequest(string userInput)
{
using var baggageScope = new BaggageBuilder()
.AgentId(<your-agent-id>) // NOTE: This will be the agent ID with which the TokenResolver delegate is invoked.
.TenantId(<your-tenant-id>) // NOTE: This will be the tenant ID with which the TokenResolver delegate is invoked.
.Build();
// NOTE: This will be the agent and tenant ID with which the TokenResolver delegate will be invoked.
using var scope = chatToolCall.Trace(agentId: <your-agent-id>, <your-tenant-id>);
}
}
Платформа агента
Для автоматического инструментирования требуется использование построителя багажа. Задайте идентификатор агента и идентификатор клиента с помощью BaggageBuilder.
Установите пакет
pip install microsoft-agents-a365-observability-extensions-agent-framework
Настройка наблюдаемости
from microsoft_agents_a365.observability.core.config import configure
from microsoft_agents_a365.observability.extensions.agentframework.trace_instrumentor import (
AgentFrameworkInstrumentor,
)
# Configure observability
configure(
service_name="AgentFrameworkTracingWithAzureOpenAI",
service_namespace="AgentFrameworkTesting",
)
# Enable auto-instrumentation
AgentFrameworkInstrumentor().instrument()
Платформа агента не поддерживается в JavaScript.
Добавьте зависимости в коллекцию служб.
using Microsoft.Agents.A365.Observability.Extensions.AgentFramework;
builder.Services.AddTracing(config => config.WithAgentFramework());
Установите AgentId и TenantId, используя BaggageBuilder.
using Microsoft.Agents.A365.Observability.Runtime.Common;
public class MyAgent : AgentApplication
{
protected async Task MessageActivityAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
{
using var baggageScope = new BaggageBuilder()
.AgentId(<your-agent-id>) // NOTE: This will be the agent ID with which the TokenResolver delegate is invoked.
.TenantId(<your-tenant-id>) // NOTE: This will be the tenant ID with which the TokenResolver delegate is invoked.
.Build();
}
}
LangChain Framework
Автоматическое инструментирование требует использования построителя багажа. Установите идентификатор агента и идентификатор арендатора с помощью BaggageBuilder.
Установите пакет .
pip install microsoft-agents-a365-observability-extensions-langchain
Настройка наблюдаемости
from microsoft_agents_a365.observability.core.config import configure
from microsoft_agents_a365.observability.extensions.langchain import CustomLangChainInstrumentor
# Configure observability
configure(
service_name="my-langchain-agent",
service_namespace="ai.agents"
)
# Enable auto-instrumentation
CustomLangChainInstrumentor()
# Your LangChain code is now automatically traced
Ручное инструментирование
Пакет SDK для отслеживания агента 365 можно использовать для понимания внутренней работы агента.
Пакет SDK предоставляет три области, которые можно запустить: InvokeAgentScope, ExecuteToolScopeи InferenceScope.
Вызов агента
Эта область должна использоваться в начале процесса агента. При области вызова агента вы записываете такие свойства, как текущий вызываемый агент, данные пользователя агента и т. д.
from microsoft_agents_a365.observability.core.invoke_agent_scope import InvokeAgentScope
from microsoft_agents_a365.observability.core.invoke_agent_details import InvokeAgentDetails
from microsoft_agents_a365.observability.core.tenant_details import TenantDetails
from microsoft_agents_a365.observability.core.request import Request
invoke_details = InvokeAgentDetails(
details=agent_details, # AgentDetails instance
endpoint=my_endpoint, # Optional endpoint (with hostname/port)
session_id="session-42"
)
tenant_details = TenantDetails(tenant_id="tenant-123")
req = Request(content="User asks a question")
with InvokeAgentScope.start(invoke_details, tenant_details, req):
# Perform agent invocation logic
response = call_agent(...)
import {
InvokeAgentScope,
ExecutionType,
CallerDetails,
EnhancedAgentDetails
} from '@microsoft/agents-a365-observability';
// Basic agent invocation details
const invokeDetails = {
agentId: 'email-agent-123',
agentName: 'Email Assistant',
...
}
};
const tenantDetails = {
tenantId: 'tenant-789'
};
// Optional: Caller details (human user)
const callerDetails: CallerDetails = {};
// Optional: Caller agent details (for agent-to-agent calls)
const callerAgentDetails: EnhancedAgentDetails = {};
// Enhanced invocation with caller context
using scope = InvokeAgentScope.start(
invokeDetails,
tenantDetails,
callerAgentDetails,
callerDetails
);
try {
// Record input messages
scope.recordInputMessages(['Please help me organize my emails', 'Focus on urgent items']);
// Your agent invocation logic here
const response = await invokeAgent(invokeDetails.request.content);
// Record output messages
scope.recordOutputMessages(['I found 15 urgent emails', 'Here is your organized inbox']);
} catch (error) {
scope.recordError(error as Error);
throw error;
}
// Scope automatically disposed at end of using block
using System;
using System.Threading.Tasks;
using Microsoft.Agents.A365.Observability.Runtime.Tracing.Contracts;
using Microsoft.Agents.A365.Observability.Runtime.Tracing.Scopes;
public class MyAgent
{
public async Task<AgentResponse> ProcessUserRequest(string userInput)
{
var agentDetails = new AgentDetails(
agentId: Guid.NewGuid().ToString(),
agentName: "MyAgent",
agentDescription: "Handles user requests.",
tenantId: "tenant-789"
);
var tenantDetails = new TenantDetails(Guid.Parse("11111111-2222-3333-4444-555555555555"));
var request = new Request(
content: userInput,
executionType: ExecutionType.HumanToAgent,
sessionId: "session-abc",
channelMetadata: new ChannelMetadata("webchat", "https://webchat.contoso.com")
);
var callerDetails = new CallerDetails(
callerId: "user-123",
callerName: "Jane Doe",
callerUpn: "jane.doe@contoso.com",
callerUserId: "user-uuid-456",
tenantId: "tenant-789"
);
var endpoint = new Uri("https://myagent.contoso.com");
var invokeAgentDetails = new InvokeAgentDetails(endpoint, agentDetails, sessionId: "session-abc");
var conversationId = "conv-xyz";
// Start the scope
using var scope = InvokeAgentScope.Start(
invokeAgentDetails: invokeAgentDetails,
tenantDetails: tenantDetails,
request: request,
callerAgentDetails: null,
callerDetails: callerDetails,
conversationId: conversationId
);
// Record input messages
scope.RecordInputMessages(new[] { userInput });
// ... your agent logic here ...
// Simulate agent processing and output
var output = $"Processed: {userInput}";
scope.RecordOutputMessages(new[] { output });
// Optionally record a single response
scope.RecordResponse(output);
return new AgentResponse { Content = output };
}
}
public class AgentResponse
{
public string Content { get; set; }
}
В следующих примерах показано, как инструментировать выполнение инструмента агента для обеспечения наблюдаемости и сбора телеметрии в целях мониторинга и аудита.
from microsoft_agents_a365.observability.core.execute_tool_scope import ExecuteToolScope
from microsoft_agents_a365.observability.core.tool_call_details import ToolCallDetails
tool_details = ToolCallDetails(
tool_name="summarize",
tool_type="function",
tool_call_id="tc-001",
arguments="{'text': '...'}",
description="Summarize provided text",
endpoint=None # or endpoint object with hostname/port
)
with ExecuteToolScope.start(tool_details, agent_details, tenant_details):
result = run_tool(tool_details)
import { ExecuteToolScope } from '@microsoft/agents-a365-observability';
const toolDetails = {
toolName: 'email-search',
arguments: JSON.stringify({ query: 'from:boss@company.com', limit: 10 }),
toolCallId: 'tool-call-456',
description: 'Search emails by criteria',
toolType: 'function',
endpoint: {
host: 'tools.contoso.com',
port: 8080, // Will be recorded since not 443
protocol: 'https'
}
};
using scope = ExecuteToolScope.start(toolDetails, agentDetails, tenantDetails);
try {
// Execute the tool
const result = await searchEmails(toolDetails.arguments);
// Record the tool execution result
scope.recordResponse(JSON.stringify(result));
return result;
} catch (error) {
scope.recordError(error as Error);
throw error;
}
using System;
using System.Threading.Tasks;
using Microsoft.Agents.A365.Observability.Runtime.Tracing.Contracts;
using Microsoft.Agents.A365.Observability.Runtime.Tracing.Scopes;
public class MyToolAgent
{
public async Task<ToolResult> ExecuteTool(string toolName, object parameters)
{
var agentDetails = new AgentDetails(
agentId: Guid.NewGuid().ToString(),
agentName: "ToolAgent",
agentDescription: "Executes tools for users.",
agentAUID: "tool-auid-123",
agentUPN: "toolagent@contoso.com",
agentBlueprintId: "tool-blueprint-456",
agentType: AgentType.EntraEmbodied,
tenantId: "tenant-789"
);
var tenantDetails = new TenantDetails(Guid.Parse("11111111-2222-3333-4444-555555555555"));
var endpoint = new Uri("https://toolagent.contoso.com:8443");
var toolCallDetails = new ToolCallDetails(
toolName: toolName,
arguments: System.Text.Json.JsonSerializer.Serialize(parameters),
toolCallId: Guid.NewGuid().ToString(),
description: "Runs a tool operation.",
toolType: "custom-type",
endpoint: endpoint
);
// Start the scope
using var scope = ExecuteToolScope.Start(
toolCallDetails: toolCallDetails,
agentDetails: agentDetails,
tenantDetails: tenantDetails
);
// ... your tool logic here ...
// Record response
var toolOutput = $"Tool '{toolName}' processed with parameters: {System.Text.Json.JsonSerializer.Serialize(parameters)}";
scope.RecordResponse(toolOutput);
return new ToolResult { Output = toolOutput };
}
}
public class ToolResult
{
public string Output { get; set; }
}
Вывод
В следующих примерах показано, как инструментировать вызовы вывода модели ИИ с отслеживанием наблюдаемости для отслеживания использования маркеров, сведений о модели и метаданных ответа.
from microsoft_agents_a365.observability.core.inference_scope import InferenceScope
from microsoft_agents_a365.observability.core.inference_call_details import InferenceCallDetails
from microsoft_agents_a365.observability.core.request import Request
inference_details = InferenceCallDetails(
operationName=SomeEnumOrValue("chat"),
model="gpt-4o-mini",
providerName="azure-openai",
inputTokens=123,
outputTokens=456,
finishReasons=["stop"],
responseId="resp-987"
)
req = Request(content="Explain quantum computing simply.")
with InferenceScope.start(inference_details, agent_details, tenant_details, req):
completion = call_llm(...)
import { InferenceScope, InferenceOperationType } from '@microsoft/agents-a365-observability';
const inferenceDetails = {
operationName: InferenceOperationType.CHAT,
model: 'gpt-4',
providerName: 'openai',
inputTokens: 150,
outputTokens: 75,
finishReasons: ['stop'],
responseId: 'resp-123456'
};
using scope = InferenceScope.start(inferenceDetails, agentDetails, tenantDetails);
try {
// Record input messages
scope.recordInputMessages(['Summarize the following emails for me...']);
// Call the LLM
const response = await callLLM();
// Record detailed telemetry with granular methods
scope.recordOutputMessages(['Here is your email summary...']);
scope.recordInputTokens(145); // Update if different from constructor
scope.recordOutputTokens(82); // Update if different from constructor
scope.recordResponseId('resp-789123');
scope.recordFinishReasons(['stop', 'max_tokens']);
return response.text;
} catch (error) {
scope.recordError(error as Error);
throw error;
}
using System;
using System.Threading.Tasks;
using Microsoft.Agents.A365.Observability.Runtime.Tracing.Contracts;
using Microsoft.Agents.A365.Observability.Runtime.Tracing.Scopes;
public class MyInferenceAgent
{
public async Task<InferenceResult> RunInference(string input)
{
var agentDetails = new AgentDetails(
agentId: Guid.NewGuid().ToString(),
agentName: "InferenceAgent",
agentDescription: "Performs generative AI inference.",
agentAUID: "inference-auid-123",
agentUPN: "inferenceagent@contoso.com",
agentBlueprintId: "inference-blueprint-456",
agentType: AgentType.EntraEmbodied,
tenantId: "tenant-789"
);
var tenantDetails = new TenantDetails(Guid.Parse("11111111-2222-3333-4444-555555555555"));
var inferenceDetails = new InferenceCallDetails(
operationName: InferenceOperationType.Chat,
model: "gpt-4",
providerName: "OpenAI",
inputTokens: 42,
outputTokens: 84,
finishReasons: new[] { "stop", "length" },
responseId: "response-xyz"
);
// Start the scope
using var scope = InferenceScope.Start(
details: inferenceDetails,
agentDetails: agentDetails,
tenantDetails: tenantDetails
);
// ... your inference logic here ...
// Record input/output messages and other telemetry
scope.RecordInputMessages(new[] { input, "additional context" });
scope.RecordOutputMessages(new[] { "AI response message" });
scope.RecordInputTokens(42);
scope.RecordOutputTokens(84);
scope.RecordResponseId("response-xyz");
scope.RecordFinishReasons(new[] { "stop", "length" });
scope.RecordThoughtProcess("Reasoning step 1; step 2");
return new InferenceResult { Output = "AI response message" };
}
}
public class InferenceResult
{
public string Output { get; set; }
}
Проверка на локальном уровне
Задайте для переменной ENABLE_A365_OBSERVABILITY_EXPORTER среды значение false. Экспортирует диапазоны (трассировки) в консоль.
Задайте для переменной ENABLE_A365_OBSERVABILITY_EXPORTER среды значение false. Экспортирует диапазоны (трассировки) в консоль.
Установите EnableAgent365Exporter в false в appsettings.json. Экспортирует диапазоны (трассировки) в консоль.
Испытайте своего агента с использованием наблюдаемости
После реализации наблюдаемости в агенте проверьте правильность записи телеметрии. Следуйте руководству по тестированию, чтобы настроить среду, а затем сосредоточьтесь главным образом на разделе Просмотр журналов наблюдаемости, чтобы проверить, что ваша реализация наблюдаемости работает должным образом.