注册外部智能体以进行可观测性与评估(预览)
本文说明如何把运行在 Foundry 之外的智能体登记为外部智能体:配置 OpenTelemetry 跨度,在门户核验追踪,并基于已采集遥测运行评估。Foundry 只保存登记元数据。

目录
#注册外部智能体以进行可观测性与评估(预览)
重要
本文中标为预览(preview)的项目目前处于预览阶段。此预览不提供服务级别协议(service-level agreement),Microsoft 不建议将其用于生产工作负载。某些功能可能不受支持,或能力受到限制。更多信息见 适用于 Microsoft Azure 预览版的补充使用条款。
重要
当你把外部智能体(external agent)与其他 Microsoft 产品和服务一起使用时,必须阅读这些产品和服务的全部相关文档,并理解相关风险与合规考量。
如果你把外部智能体与任何第三方服务器、智能体、代码或非 Azure Direct 模型("第三方系统(Third-Party Systems)")一起使用,风险由你自行承担。第三方系统属于 Microsoft 产品条款下的非 Microsoft 产品(Non-Microsoft Products),并受其自身的第三方许可条款约束。你负责任何使用行为及相关费用。
我们建议审查与第三方系统共享和从第三方系统接收的全部数据,并了解第三方在数据处理、共享、保留和数据位置方面的做法。同样,如果你连接或集成非 Foundry 的 Microsoft 服务和功能,审查其数据做法也很重要。你有责任管理自己的数据是否会流出本组织的合规与地理边界、由此产生的影响,以及是否已配置适当的权限、边界和审批。
你有责任在自己的具体使用场景中仔细审查并测试所构建的应用程序,并做出全部适当的决定与定制。这包括实施你自己的负责任人工智能(responsible AI)缓解措施,例如元提示(metaprompt)、内容过滤器或其他安全系统,并确保应用程序达到适当的质量、可靠性、安全性和可信标准。见 Foundry 智能体服务透明度说明。
Microsoft Foundry 智能体服务(Microsoft Foundry Agent Service)让你登记运行在 Foundry 之外的智能体,宿主可以是任意云、本地(on-premises)或其他主机,从而使用 Foundry 的追踪视图(trace view)和评估体验。对这些智能体,Foundry 只存储登记元数据。它不托管、不代理、也不调用该运行时。
外部智能体不同于控制平面自定义智能体(Control Plane custom agents)。后者的流量经过人工智能网关(AI Gateway)。使用外部智能体时,你的智能体保留其现有终结点,只共享 OpenTelemetry 遥测。不需要人工智能网关。
在本文中,你将了解如何:
- 为外部智能体装埋点,使其向应用程序洞察(Application Insights)发出 OpenTelemetry 跨度(span)。
- 在 Foundry 中把该智能体登记为
external智能体。 - 在 Foundry 门户中核验追踪。
- 针对该智能体已采集的遥测运行基于追踪的评估。
下图表示数据流:你的外部智能体把带有 gen_ai.agent.id 属性的 OpenTelemetry 跨度发到连接到 Foundry 项目的 Application Insights 资源。另一次登记调用在 Foundry 中创建智能体记录。Foundry 门户随后按智能体 ID 匹配追踪,并在智能体追踪视图中显示它们。
重要
外部智能体处于预览阶段。创建和更新请求需要 Foundry-Features: ExternalAgents=V1Preview 标头。SDK 调用方通过以 allow_preview=True 构造 AIProjectClient 来启用此功能。
先决条件
- 一个运行在 Foundry 之外、能够向该 Application Insights 资源发出 OpenTelemetry 跨度的智能体。
- Python 3.11 或更高版本。
- 项目上的 Foundry 用户(Foundry User) 角色。
- 所连接 Application Insights 资源上的 读者(Reader) 角色或 监控读者(Monitoring Reader) 角色,以便查看追踪。
Foundry 的 RBAC 角色最近已更名。Foundry 用户(Foundry User)、Foundry 所有者(Foundry Owner)、Foundry 账户所有者(Foundry Account Owner) 和 Foundry 项目管理员(Foundry Project Manager) 以前分别名为 Azure AI User、Azure AI Owner、Azure AI Account Owner 和 Azure AI Project Manager。更名铺开期间,某些地方可能仍显示旧名称。角色 ID 和核心权限不因更名而改变。
- 已配置
DefaultAzureCredential。使用az login登录,或设置托管标识或服务主体。
- (仅评估需要)一个带有支持聊天补全的 GPT 模型的 Azure OpenAI 部署(例如
gpt-5-mini)。
用 OpenTelemetry 为外部智能体装埋点
在 Foundry 中登记智能体之前,把它配置为向连接到 Foundry 项目的 Application Insights 资源导出 OpenTelemetry 跨度。每个跨度必须带有 gen_ai.agent.id 属性,Foundry 才能把该跨度归属到正确的智能体登记。
安装 Microsoft OpenTelemetry 包
pip install "microsoft-opentelemetry[langchain]"配置导出器
在智能体启动期间、在任何应当被装埋点的框架导入之前,运行一次以下代码:
import os
os.environ.setdefault("AZURE_EXPERIMENTAL_ENABLE_GENAI_TRACING", "true")
os.environ.setdefault("OTEL_SEMCONV_STABILITY_OPT_IN", "gen_ai_latest_experimental")
os.environ.setdefault("OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT", "SPAN_AND_EVENT")
from microsoft.opentelemetry import use_microsoft_opentelemetry
# Human-readable name for the agent
AGENT_NAME = os.environ.get("AGENT_NAME", "weather-agent")
# Unique ID emitted as gen_ai.agent.id on every span.
# Foundry matches traces to registrations by this value.
OTEL_AGENT_ID = os.environ.get("OTEL_AGENT_ID", f"{AGENT_NAME}-v1")
use_microsoft_opentelemetry(
enable_azure_monitor=True,
azure_monitor_connection_string=os.environ["APPLICATIONINSIGHTS_CONNECTION_STRING"],
sampling_ratio=1.0,
instrumentation_options={
"fastapi": {"enabled": False},
"langchain": {
"enabled": True,
"agent_id": OTEL_AGENT_ID,
"agent_name": AGENT_NAME,
},
},
)在运行智能体的主机上设置 APPLICATIONINSIGHTS_CONNECTION_STRING 环境变量。使用链接到 Foundry 项目的 Application Insights 资源的连接字符串。要找到连接字符串,打开 Foundry 门户,进入你的项目,然后选择 管理(Manage) > 项目详细信息(Project details) > 已连接资源(Connected resources)。选择该 Application Insights 资源以查看其连接字符串。也可以直接在 Azure 门户中打开该 Application Insights 资源,并从 概述(Overview) 页复制连接字符串。
配置之后,来自你的智能体框架的后续 OpenTelemetry 跨度会自动流向 Application Insights。每个跨度必须把 gen_ai.agent.id 属性设为你在登记期间选作 otel_agent_id 的值。
如果你的智能体框架不会自动设置此属性,请手动添加:
from opentelemetry import trace
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("agent-run") as span:
span.set_attribute("gen_ai.agent.id", "travel-planner-agent-v1")
# ... your agent logic ...提示
对于特定框架的自动装埋点(LangChain、LangGraph),适用于 Python 的 Microsoft OpenTelemetry 发行版可以通过 instrumentation_options 自动设置 gen_ai.agent.id。对于 .NET 和 JavaScript,见 .NET 发行版和 JavaScript 发行版。一般指导见为人工智能智能体框架配置追踪。
在 Foundry 中登记外部智能体
智能体把跨度发到 Application Insights 之后,在 Foundry 中登记它,使这些跨度出现在限定到该智能体的 Foundry 追踪视图中。登记会在 Foundry 中创建一条命名记录,把传入追踪(按 gen_ai.agent.id 匹配)链接到 Foundry 智能体体验。没有这次登记,追踪仍会流入 Application Insights,但不会出现在 Foundry 智能体追踪视图中,你也不能运行限定到该智能体的基于追踪的评估。
安装 SDK
pip install azure-ai-projects>=2.3.0 azure-identity>=1.17.0创建登记
可以在 Foundry 门户中按以下步骤创建登记:
- 打开你的项目,选择 生成(Build) > 智能体(Agents) > 新建智能体(New agent)。
- 选择 链接外部智能体(Link external agent)。
- 在出现的窗口中,输入智能体名称、描述和 OpenTelemetry ID。
把 FOUNDRY_PROJECT_ENDPOINT 环境变量设为你的项目终结点。可以在 Foundry 门户中该项目的 概述(Overview) 页找到此值。
import os
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import ExternalAgentDefinition
from azure.identity import DefaultAzureCredential
endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
# Create the project client with preview features enabled.
project = AIProjectClient(
endpoint=endpoint,
credential=DefaultAzureCredential(),
allow_preview=True,
)
# Register the externally hosted agent.
agent = project.agents.create_version(
agent_name="travel-planner-agent",
description="Travel planning agent hosted externally.",
definition=ExternalAgentDefinition(
# Set explicitly when the running agent emits a gen_ai.agent.id
# value that differs from the Foundry agent name.
otel_agent_id="travel-planner-agent-v1",
),
)
print(f"Registered external agent: {agent.name}")
print(f"Resolved otel_agent_id: {agent.versions.latest.definition.otel_agent_id}")输出
Registered external agent: travel-planner-agent
Resolved otel_agent_id: travel-planner-agent-v1注意
otel_agent_id 参数是可选的,默认值为智能体 name。仅当正在运行的智能体已经发出一个与 Foundry 智能体名称不同的稳定 gen_ai.agent.id 值时,才显式设置它。
当使用新名称调用时,create_version() 方法会原子地创建智能体记录及其第一个登记修订。从用户角度看,外部智能体没有版本。对 otel_agent_id 的编辑会在同一名称下创建新的内部修订。
把 FOUNDRY_PROJECT_ENDPOINT 环境变量设为你的项目终结点。外部智能体支持位于预发布包中,因此用 dotnet add package Azure.AI.Projects.Agents --prerelease 和 dotnet add package Azure.Identity 安装。
#pragma warning disable AAIP001
using System;
using Azure.AI.Projects.Agents;
using Azure.Identity;
var endpoint = Environment.GetEnvironmentVariable("FOUNDRY_PROJECT_ENDPOINT");
// External agents are in preview. The AAIP001 pragma opts in to the preview surface.
AgentAdministrationClient agentsClient = new(
endpoint: new Uri(endpoint),
tokenProvider: new DefaultAzureCredential());
// Register the externally hosted agent.
ExternalAgentDefinition definition = new()
{
// Set explicitly when the running agent emits a gen_ai.agent.id
// that differs from the Foundry agent name.
OtelAgentId = "travel-planner-agent-v1",
};
ProjectsAgentVersionCreationOptions options = new(definition)
{
Description = "Travel planning agent hosted externally.",
};
ProjectsAgentVersion agent = agentsClient.CreateAgentVersion(
agentName: "travel-planner-agent",
options: options,
// Create and update requests require the ExternalAgents preview feature.
foundryFeatures: "ExternalAgents=V1Preview");
Console.WriteLine($"Registered external agent: {agent.Name}");输出
Registered external agent: travel-planner-agent把 FOUNDRY_PROJECT_ENDPOINT 环境变量设为你的项目终结点。在 Foundry 门户中该项目的 概述(Overview) 页找到此值。
安装所需包:
npm install @azure/ai-projects @azure/identityimport { AIProjectClient } from "@azure/ai-projects";
import { DefaultAzureCredential } from "@azure/identity";
const projectEndpoint =
process.env["FOUNDRY_PROJECT_ENDPOINT"] || "<project endpoint>";
const project = new AIProjectClient(
projectEndpoint,
new DefaultAzureCredential(),
);
const agentName = "travel-planner-agent";
// Set explicitly when the running agent emits a gen_ai.agent.id value
// that differs from the Foundry agent name.
const otelAgentId = "travel-planner-agent-v1";
// Register the externally hosted agent. External agents are a preview
// feature, so the `ExternalAgents=V1Preview` opt-in is required.
const agent = await project.agents.createVersion(
agentName,
{
kind: "external",
otel_agent_id: otelAgentId,
},
{
foundryFeatures: "ExternalAgents=V1Preview",
description: "Travel planning agent hosted externally.",
},
);
console.log(`Registered external agent: ${agent.name}`);
console.log(`Resolved otel_agent_id: ${otelAgentId}`);输出
Registered external agent: travel-planner-agent
Resolved otel_agent_id: travel-planner-agent-v1注意
otel_agent_id 字段是可选的,默认值为智能体 name。仅当正在运行的智能体已经发出一个与 Foundry 智能体名称不同的稳定 gen_ai.agent.id 值时,才显式设置它。
当使用新名称调用时,createVersion() 方法会原子地创建智能体记录及其第一个登记修订。从用户角度看,外部智能体没有版本。对 otel_agent_id 的编辑会在同一名称下创建新的内部修订。
在 Foundry 门户中核验追踪
在智能体发送流量且跨度进入 Application Insights 之后(通常为 2–5 分钟),核验追踪是否出现在 Foundry 门户中:
- 打开 Foundry 门户。
- 进入你的项目。
- 从左侧窗格选择 智能体(Agents)。
- 选择外部智能体名称(例如 travel-planner-agent)。
- 选择 追踪(Traces) 选项卡,查看归属到此智能体的跨度。
追踪按 gen_ai.agent.id = <otel_agent_id> 与连接到该项目的 Application Insights 资源匹配。你可以查看每个跨度的输入、输出、工具调用和延迟。
运行基于追踪的评估
追踪流入 Application Insights 之后,你可以直接针对这些追踪运行评估。不需要另行构造数据集。Foundry 在一个回看窗口内按 (project, agent_id) 解析追踪。
注意
基于追踪的评估使用与 OpenAI 兼容的 evals API(project.get_openai_client().evals)。原生的 project.evaluations 接口尚不支持基于追踪的评估。
解析智能体的 otel_agent_id
要取得用于追踪的智能体 ID,使用以下方法:
在 Foundry 门户中打开外部智能体即可查看其追踪。要在代码中检索已解析的 otel_agent_id,使用下列 SDK 之一。
# Retrieve the registered agent and its resolved otel_agent_id.
agent = project.agents.get(agent_name="travel-planner-agent")
otel_agent_id = agent.versions.latest.definition.otel_agent_id#pragma warning disable AAIP001
// Retrieve the registered agent and its resolved otel_agent_id.
ProjectsAgentRecord agent = agentsClient.GetAgent("travel-planner-agent");
if (agent.Versions.Latest.Definition is not ExternalAgentDefinition definition)
{
throw new InvalidOperationException("Expected an external agent definition.");
}
string otelAgentId = definition.OtelAgentId;// Retrieve the registered agent and its resolved otel_agent_id.
const agent = await project.agents.get("travel-planner-agent");
const definition = agent.versions.latest.definition;
if (definition.kind !== "external") {
throw new Error(
`Expected an external agent definition, got "${definition.kind}".`,
);
}
const otelAgentId = definition.otel_agent_id;创建并运行评估
使用 otel_agent_id 针对该智能体已采集的遥测运行追踪评估。外部智能体支持对单次交互做基于追踪的评估。当智能体在其 invoke_agent 跨度上发出稳定的 gen_ai.conversation.id 和所需的消息属性时,你也可以按会话 ID 评估多轮会话。
有关如何创建评估、配置测试准则并解释结果的演练,见:
管理外部智能体
使用相同的 SDK 方法列出、检索和删除外部智能体。
列出外部智能体
在 Foundry 门户中,选择 生成(Build) > 智能体(Agents) 以查看已登记的外部智能体。
agents = project.agents.list(kind="external")
for a in agents:
print(a.name)#pragma warning disable AAIP001
foreach (ProjectsAgentRecord agent in agentsClient.GetAgents(kind: ProjectsAgentKind.External))
{
Console.WriteLine(agent.Name);
}const agents = project.agents.list({ kind: "external" });
for await (const agent of agents) {
console.log(agent.name);
}删除外部智能体
使用下列 SDK 之一删除外部智能体登记。删除登记不影响外部托管的智能体。
# Delete the registration. This does not affect the running agent.
# force=True removes all internal revisions of the agent atomically.
project.agents.delete(agent_name="travel-planner-agent", force=True)#pragma warning disable AAIP001
// Delete the registration. This action doesn't affect the running agent.
// force: true removes all internal revisions of the agent atomically.
agentsClient.DeleteAgent(agentName: "travel-planner-agent", force: true);// Delete the registration. This does not affect the running agent.
// force: true removes all internal revisions of the agent atomically.
await project.agents.delete("travel-planner-agent", { force: true });删除登记会把该智能体从 Foundry 门户中移除,并停止追踪出现在 Foundry 智能体追踪视图中。跨度仍留在 Application Insights 中,正在运行的智能体不受影响。
故障排除
排除追踪缺失故障
如果看不到追踪,检查以下各项:
- Application Insights 资源已连接到你登记该智能体的 Foundry 项目。
- 登记上的
otel_agent_id与跨度上的gen_ai.agent.id属性一致。 - 智能体进程已把
APPLICATIONINSIGHTS_CONNECTION_STRING设为正确的 Application Insights 资源。 - 跨度符合生成式人工智能的 OpenTelemetry 语义约定。
更多故障排除指导见排除评估与可观测性问题。
排除登记错误故障
如果 create_version()(Python)或 createVersion()(JavaScript/TypeScript)失败,检查以下各项:
- 你用
allow_preview=True构造了AIProjectClient(Python),或在createVersion调用上传入了foundryFeatures: "ExternalAgents=V1Preview"(JavaScript/TypeScript)。没有这一选择加入,外部智能体请求会被拒绝。 - 你的身份在该项目上具有 Foundry 用户(Foundry User) 角色(或更高角色)。
- 智能体名称值只使用字母数字字符、连字符和下划线。
- 不存在同名但种类不同的现有智能体。使用
project.agents.get()检查。
当前限制
以下 Foundry 功能目前不支持外部智能体:
- 人工评估:手动审阅工作流对外部登记的智能体不可用。
- 把智能体追踪转换为评估数据集:外部智能体不支持追踪到数据集的转换。
- 人工智能红队(AI red teaming):红队扫描不能以外部智能体为目标。
PRIMARY_SOURCE: https://learn.microsoft.com/en-us/azure/foundry/agents/how-to/register-external-agent
- #外部智能体
- #OpenTelemetry
- #可观测性
- #评估
- #Foundry


