你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

功能主机

注释

不支持更新功能主机。 若要修改功能主机,必须删除现有功能主机,然后使用新配置重新创建它。

功能主机是在 Azure AI Foundry 帐户和 Foundry 项目范围内定义的子资源。 它们指定 Azure AI Foundry 代理服务应存储和处理代理数据的位置,包括:

  • 对话历史记录(线程)
  • 文件上传
  • 矢量存储

为何使用功能主机?

功能主机允许 你自带 Azure 资源 ,而不是使用默认Microsoft托管的平台资源。 这为你提供了:

  • 数据主权 - 保留 Azure 订阅中的所有代理数据。
  • 安全控制 - 使用自己的存储帐户、数据库和搜索服务。
  • 合规性 - 满足特定的法规或组织要求。

功能主机的工作原理是什么?

不需要创建功能主机。 但是,如果确实希望代理使用自己的资源,则必须在帐户和项目上创建功能主机。

默认行为(Microsoft 托管资源)

如果未创建帐户级和项目级功能主机,Azure AI Foundry 代理服务会自动使用Microsoft托管的 Azure 资源:

  • 线程存储(会话历史记录、代理定义)
  • 文件存储(上传的文档)
  • 矢量搜索(嵌入和检索)

自带资源

在帐户级别和项目级别创建功能主机时,将使用订阅中自己的 Azure 资源存储和处理所有代理数据。 此配置称为 标准代理设置

所有 Foundry 工作区资源应与 VNet 位于同一区域,包括 CosmosDB、存储帐户、AI 搜索、Foundry 帐户、项目和托管标识。

配置层次结构

功能主机遵循层次结构,其中具体配置优先于广泛配置。

  1. 服务默认值 (Microsoft托管的搜索和存储)- 在未配置功能主机时使用。
  2. 帐户级功能主机 - 为帐户下的所有项目提供共享默认值。
  3. 项目级能力托管 - 用于替代该特定项目的帐户级别和服务默认设置。

了解功能主机约束

创建功能主机时,请注意以下重要约束以避免冲突:

  • 每个范围一个功能主机:每个帐户和每个项目只能有一个活动功能主机。 尝试在同一范围创建具有不同名称的第二个功能主机将导致 409 冲突。

  • 不支持配置更新:如果需要更改配置,则必须删除现有功能主机并重新创建它。

必需的属性

在帐户或项目级别,功能主机必须配置以下三个属性:

资产 目的 所需的 Azure 资源 连接名称示例
threadStorageConnections 存储代理定义、聊天历史记录和聊天线程 Azure Cosmos DB "my-cosmosdb-connection"
vectorStoreConnections 处理用于检索和搜索的矢量存储 Azure AI 搜索 "my-ai-search-connection"
storageConnections 管理文件上传和 Blob 存储 Azure 存储帐户 "my-storage-connection"

可选属性

资产 目的 所需的 Azure 资源 何时使用
aiServicesConnections 使用自己的模型部署 Azure OpenAI 如果希望使用现有 Azure OpenAI 资源中的模型,而非内置的帐户级模型。

帐户功能主机

PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.CognitiveServices/accounts/{accountName}/capabilityHosts/{name}?api-version=2025-06-01

{
  "properties": {
    "capabilityHostKind": "Agents"
  }
}

项目功能主机

此配置将替代服务默认值和任何帐户级设置。 此项目中的所有代理都将使用指定的资源:

PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.CognitiveServices/accounts/{accountName}/projects/{projectName}/capabilityHosts/{name}?api-version=2025-06-01

{
  "properties": {
    "capabilityHostKind": "Agents",
    "threadStorageConnections": ["my-cosmos-db-connection"],
    "vectorStoreConnections": ["my-ai-search-connection"],
    "storageConnections": ["my-storage-account-connection"],
    "aiServicesConnections": ["my-azure-openai-connection"]  // Optional
  }
}

可选:账户级默认设置与项目级覆盖配置

在应用于所有项目的帐户级别设置共享默认值:

PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.CognitiveServices/accounts/{accountName}/capabilityHosts/{name}?api-version=2025-06-01

{
  "properties": {
    "capabilityHostKind": "Agents",

    // Optional: define shared BYO resources for every project. All foundry projects under this account will uses these Azure resources  
    "threadStorageConnections": ["shared-cosmosdb-connection"],
    "vectorStoreConnections": ["shared-ai-search-connection"],
    "storageConnections": ["shared-storage-connection"]
  }
}

注释

所有 Azure AI Foundry 项目都将继承这些设置。 然后根据需要替代项目级别的特定设置。

删除功能主机

警告

删除一个能力主机将影响所有依赖它的代理。 在继续作之前,请确保了解影响。 例如,如果删除项目和帐户功能主机,项目中的代理将不再有权访问以前存储的文件、线程和向量。

删除帐户级功能主机

DELETE https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.CognitiveServices/accounts/{accountName}/capabilityHosts/{name}?api-version=2025-06-01

删除项目级功能主机

DELETE https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.CognitiveServices/accounts/{accountName}/projects/{projectName}/capabilityHosts/{name}?api-version=2025-06-01

故障排除

如果在创建功能主机时遇到问题,本部分提供了最常见的问题和错误的解决方案。

HTTP 409 冲突错误

问题:每个范围有多个功能主机

症状: 尝试创建功能主机时收到 409 冲突错误,即使你认为范围为空。

错误消息:

{
  "error": {
    "code": "Conflict",
    "message": "There is an existing Capability Host with name: existing-host, provisioning state: Succeeded for workspace: /subscriptions/.../workspaces/my-workspace, cannot create a new Capability Host with name: new-host for the same ClientId."
  }
}

根源: 每个帐户和每个项目只能有一个活动功能主机。 尝试在同一范围内创建具有不同名称的功能主机。

解决方案:

  1. 检查现有功能主机 - 查询范围以查看已存在的内容
  2. 使用一致的命名 - 确保对同一范围的所有请求使用相同的名称
  3. 查看要求 - 确定现有功能主机是否满足需求

验证步骤:

# For account-level capability hosts
GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.CognitiveServices/accounts/{accountName}/capabilityHosts?api-version=2025-06-01

# For project-level capability hosts  
GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.CognitiveServices/accounts/{accountName}/projects/{projectName}/capabilityHosts?api-version=2025-06-01

问题:正在进行的并发作

症状: 收到 409 冲突错误,指示另一个作当前正在运行。

错误消息:

{
  "error": {
    "code": "Conflict", 
    "message": "Create: Capability Host my-host is currently in non creating, retry after its complete: /subscriptions/.../workspaces/my-workspace"
  }
}

根源: 尝试创建功能主机,而另一个作(更新、删除、修改)正在进行在同一范围内。

解决方案:

  1. 等待当前作完成 - 检查正在进行的作的状态
  2. 监视作进度 - 使用作 API 跟踪完成
  3. 实现重试逻辑 - 为临时冲突添加指数退避

作监视:

GET https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.CognitiveServices/locations/{location}/operationResults/{operationId}?api-version=2025-06-01

冲突预防的最佳做法

1.预请求验证

在进行更改之前,请始终验证当前状态:

  • 查询目标范围内的现有功能主机
  • 检查是否有正在进行的作
  • 了解当前配置

2. 使用指数退避实现重试逻辑

try 
{
    var response = await CreateCapabilityHostAsync(request);
    return response;
}
catch (HttpRequestException ex) when (ex.Message.Contains("409"))
{
    if (ex.Message.Contains("existing Capability Host with name"))
    {
        // Handle name conflict - check if existing resource is acceptable
        var existing = await GetExistingCapabilityHostAsync();
        if (IsAcceptable(existing))
        {
            return existing; // Use existing resource
        }
        else
        {
            throw new InvalidOperationException("Scope already has a capability host with different name");
        }
    }
    else if (ex.Message.Contains("currently in non creating"))
    {
        // Handle concurrent operation - implement retry with backoff
        await Task.Delay(TimeSpan.FromSeconds(30));
        return await CreateCapabilityHostAsync(request); // Retry once
    }
}

3. 了解幂等行为

系统支持幂等创建请求:

  • 同名 + 相同的配置 →返回现有资源 (200 正常)
  • 同名 + 不同的配置 →返回 400 错误的请求
  • 不同名称 →返回 409 冲突

4.配置更改工作流

由于不支持更新,因此请遵循以下顺序进行配置更改:

  1. 删除现有功能主机
  2. 等待删除完成
  3. 使用所需配置创建新功能主机

后续步骤