Implementar um agente alojado

Este artigo mostra-lhe como implementar um agente containerizado para o Foundry Agent Service usando a CLI do Azure Developer (azd), o SDK Python ou a API REST. Escolha um método de implementação usando o seletor no topo do artigo. Use as abordagens SDK ou REST quando quiser gerir implementações de agentes diretamente a partir das suas próprias aplicações ou serviços.

Se está a implementar pela primeira vez ou quiser um guia guiado, consulte o Quickstart: Criar e implementar um agente Alojado. O Azure Developer CLI (azd) e a extensão VS Code tratam automaticamente da construção, envio, versionamento e configuração RBAC.

Dica

Prefere um loop interno sem Docker? Também podes implementar um agente alojado diretamente a partir do código-fonte – carrega um .zip dos teus códigos em Python ou .NET e a plataforma constrói e aloja por ti.

Se usares um agente de programação como o GitHub Copilot, o Microsoft Foundry Skill pode ajudar-te a planear o fluxo de implementação do contentor, preparar azd comandos e ligar os passos do SDK ou REST ao teu projeto.

Ciclo de vida de implementação

Cada implementação de agente hospedado segue esta sequência:

  1. Compilar e enviar - Empacote o código do agente numa imagem de contentor e envie-o para o Azure Container Registry.
  2. Crie uma versão de agente - Registe a imagem no Foundry Agent Service. A plataforma fornece infraestrutura e cria uma identidade dedicada ao agente Entra.
  3. Verificar o estado - Aguarde até que o estado da versão chegue a active.
  4. Invocar - Enviar pedidos para o endpoint dedicado do agente.

Pré-requisitos

Permissões necessárias

Precisa da função Foundry Project Manager ao nível do projeto para implementar um agente alojado. Esta função concede ao plano de dados permissões para criar e atualizar agentes, bem como a capacidade de criar atribuições de função para a identidade do agente criada pela plataforma, se necessário. Para uma análise detalhada das permissões envolvidas, consulte Referência de permissões de agente hospedado.

Importante

As funções RBAC do Foundry foram recentemente renomeadas. Foundry User, Foundry Owner, Foundry Account Owner e Foundry Project Manager foram anteriormente nomeados Azure AI User, Azure AI Owner, Azure AI Account Owner e Azure AI Project Manager. Poderá ainda ver os nomes anteriores em alguns locais enquanto esta alteração de nome está a ser implementada. Os IDs das funções e as permissões principais não são alterados por esta mudança de nome.

A plataforma cria uma identidade dedicada de agente Microsoft Entra para cada agente alojado no momento da implementação. Esta identidade é um principal de serviço que o seu contenedor em execução usa para invocar modelos e ferramentas. Não precisas de configurar identidades geridas manualmente. Por defeito, a identidade do agente pode aceder à inferência de modelos através do ponto final do projeto e ao armazenamento de sessão. Para recursos externos (por exemplo, o seu próprio Armazenamento do Azure), atribua manualmente funções RBAC ao Microsoft Entra ID do agente. Para mais informações, consulte Acesso ao Agente para além dos predefinidos.

Se usar azd ou a extensão VS Code, a ferramenta gere automaticamente a maioria das atribuições RBAC, incluindo o Container Registry Repository Reader para a identidade gerida pelo projeto (pull de imagem).

Para mais informações, consulte Autenticação e autorização.

Importante

O suporte para colocar o Azure Container Registry do seu agente alojado atrás de uma rede privada (endpoint privado com acesso à rede pública desativado) depende de quando o projeto Foundry foi criado. Os projetos criados após 25 de junho de 2026 apoiam um registo privado. Projetos criados antes dessa data exigem que o registo seja acessível através do seu endpoint público para que a plataforma possa extrair a imagem. Os projetos existentes não são afetados. Para a lista completa de restrições de rede, veja Limitações.

Requisitos de contentores

A sua imagem de contentor deve cumprir os seguintes requisitos para ser executada na plataforma de agente alojado.

Importante

A plataforma de alojamento requer imagens de contentores x86_64 (linux/amd64). Se construir com Apple Silicon ou outras máquinas com base em ARM, use docker build --platform linux/amd64 . para evitar produzir uma imagem ARM incompatível.

Bibliotecas de protocolos

Os agentes alojados comunicam com o gateway Foundry através de bibliotecas de protocolos. Escolha o protocolo que corresponda ao padrão de interação do seu agente:

Protocolo Biblioteca Python Biblioteca .NET Ponto final Melhor para
Respostas azure-ai-agentserver-responses Azure.AI.AgentServer.Responses /responses Chatbots conversacionais, streaming, multi-turno com histórico gerido por plataformas
Invocações azure-ai-agentserver-invocations Azure.AI.AgentServer.Invocations /invocations Recetores Webhook, processamento não conversacional, fluxos de trabalho personalizados assíncronos
Invocações (WebSocket) azure-ai-agentserver-invocations Azure.AI.AgentServer.Invocations /invocations_ws Streaming bidirecional: agentes de voz em tempo real, media interativo

O protocolo WebSocket usa o identificador invocations_ws e é enviado no mesmo azure-ai-agentserver-invocations pacote da rota HTTP /invocations , pelo que um contentor pode servir ambos. Use-o quando precisar de streaming persistente e full-duplex – por exemplo, enviando PCM de microfone para o agente e recebendo áudio sintetizado de volta. Para cenários de voz, consulte Criar um agente de voz com agentes hospedados.

Um único contentor pode expor múltiplos protocolos simultaneamente declarando-os quando cria o agente – no protocols campo do azure.ai.agent serviço em azure.yaml, uma chamada SDK, ou um pedido de API REST – e importando as bibliotecas necessárias. Use as bibliotecas de protocolos dentro do seu framework existente, seja o Microsoft Agent Framework, LangChain ou código personalizado.

Biblioteca de protocolos de respostas

As bibliotecas Python e .NET para o protocolo Responses implementam a API Azure AI Responses. Importa o pacote e implementa um gestor de respostas. A biblioteca gere o encaminhamento de rotas, o streaming com SSE (eventos enviados pelo servidor), a execução em segundo plano, o cancelamento, o cache e a gestão do ciclo de vida das respostas.

Implementar um handler

O handler é a abstração central que implementas. A biblioteca chama-o para cada pedido recebido e entrega os eventos devolvidos aos clientes através do SSE. Em Python, decora uma função assíncrona com @app.response_handler:

from azure.ai.agentserver.responses import (
    CreateResponse,
    ResponseContext,
    ResponsesAgentServerHost,
    TextResponse,
)

app = ResponsesAgentServerHost()


@app.response_handler
async def handler(
    request: CreateResponse,
    context: ResponseContext,
    _cancellation_signal,
):
    user_input = await context.get_input_text() or ""
    return TextResponse(context, request, text=f"Echo: {user_input}")

Gestão automática de eventos e ciclos de vida

A biblioteca gere automaticamente a sequência de eventos — números de sequência, índices de saída e de conteúdo e IDs dos itens — e o ciclo de vida completo da resposta, pelo que não precisa de controlar este estado por si próprio. Cada evento produzido pelo seu processador corresponde diretamente a um evento SSE, que a framework anfitriã gere por si.

Modos de streaming e em segundo plano

  • Modo de streaming (predefinido): os eventos SSE são entregues em tempo real ao cliente ligado.
  • Modo de fundo: O handler corre até à conclusão sem um cliente SSE ligado. Os eventos estão em buffer e disponíveis para rejogar através de GET /responses/{id}.

Ciclo de vida da resposta

A biblioteca orquestra todo o ciclo de vida da resposta: created ->in_progress ->completed (ou failed ou cancelled). A biblioteca também gere automaticamente garantias de cancelamento, tratamento de erros e eventos do terminal.

Segurança da rosca

As instâncias do manipulador estão limitadas ao âmbito de cada pedido, pelo que o estado de cada pedido não transita entre pedidos. A biblioteca lida com pedidos simultâneos com segurança.

Para ver exemplos executáveis, consulte os exemplos Python do tipo «traga o seu próprio».

Parâmetros de saúde

As bibliotecas de protocolos expõem automaticamente um /readiness endpoint para verificações do estado de saúde da plataforma. Não precisas de implementar isto tu próprio.

Porto

Contentores servem tráfego localmente no porto 8088. Em produção, o gateway Foundry trata do encaminhamento – o teu contentor não precisa de expor uma porta pública.

Variáveis ambientais injetadas pela plataforma

A plataforma de agente hospedado injeta automaticamente variáveis de ambiente no seu contentor em tempo de execução. O teu código pode ler estas variáveis sem as declarar no env mapa do azure.ai.agent serviço em azure.yaml ou nas definições de variáveis do ambiente SDK e REST. O FOUNDRY_* prefixo é reservado para uso em plataformas.

Variável Finalidade
FOUNDRY_PROJECT_ENDPOINT URL do endpoint do projeto Foundry
FOUNDRY_PROJECT_ARM_ID ID de recurso ARM do projeto Foundry
FOUNDRY_AGENT_NAME Nome do agente em execução
FOUNDRY_AGENT_VERSION Versão do agente de execução
FOUNDRY_AGENT_SESSION_ID ID de sessão para o pedido atual (apenas contentores alojados)
APPLICATIONINSIGHTS_CONNECTION_STRING A cadeia de conexão do Application Insights para a telemetria

Não redeclares variáveis injetadas pela plataforma em azure.yaml - elas são definidas automaticamente.

As variáveis que declares, como MODEL_DEPLOYMENT_NAME ou os endpoints MCP da toolbox, devem ser colocadas no mapa env do serviço azure.ai.agent em azure.yaml ou na chamada create_version do SDK.

Importante

Ao implementar o seu agente alojado no Foundry Agent Service, a plataforma injeta automaticamente uma cadeia de ligação do Application Insights no contentor do agente como variável de ambiente, ativando o rastreio OpenTelemetry por predefinição. Para ver rastreios distribuídos, solicitações e dependências, abra o recurso do Application Insights aprovisionado durante a configuração no portal do Azure e navegue até Investigar > Pesquisa de transações ou Desempenho. Utilize azd ai agent monitor para registos ao vivo na consola. Quando o AppInsights está ativado, este projeto regista traços para ajudar a monitorizar e avaliar as interações ao nível do utilizador com os agentes. Os membros do projeto a quem foi atribuída a função Leitor do Log Analytics no AppInsights podem ver dados de rastreio, que podem conter dados pessoais e/ou Conteúdo do Cliente. Se as tabelas subjacentes do Log Analytics estiverem protegidas, os membros necessitam, em vez disso, da função Leitor de Dados de Monitorização Privilegiada para visualizar esses dados de rastreio. Revise que dados de rastreio são recolhidos e quem pode visualizar e utilizar esses dados. Poderão aplicar-se preços adicionais do App Insights do Azure Monitor. Saiba mais.

Ligações de projetos de referência em variáveis ambientais

Em vez de incorporar segredos diretamente no código (chaves API, tokens, endpoints) em azure.yaml ou na sua imagem, obtenha-os a partir de uma conexão a um projeto Foundry no arranque da sandbox. Qualquer valor que declare como variável de ambiente pode ser uma expressão temporária que a plataforma resolve antes do início do seu contentor.

Sintaxe de marcador de posição

Um marcador de posição tem o formato ${{connections.<name>.<path>}}, em que <name> é o nome do recurso da conexão (visível no portal em Gerir>Detalhes do projeto>Recursos ligados) e <path> é um dos seguintes:

Path Resolve para
credentials.<field> Um campo secreto na ligação
target A propriedade da target ligação (por exemplo, uma URL de endpoint)
metadata.<field> Um campo na metadata da ligação

O nome do campo a usar depende da categoria de ligação:

Categoria de ligação Nome do campo em lugar provisório
ApiKey, AppInsights Sempre key— por exemplo, credentials.key
CustomKeys O nome-chave que forneceu ao criar a ligação — por exemplo, credentials.github_token

Exemplo

Primeiro, crie uma CustomKeys ligação no projeto que contém o segredo. Veja Adicionar uma nova ligação em Microsoft Foundry. Em seguida, referencie-o a partir do mapa env no serviço azure.ai.agent em azure.yaml:

services:
  my-agent:
    host: azure.ai.agent
    env:
      MODEL_DEPLOYMENT_NAME: gpt-5-mini
      GITHUB_TOKEN: ${{connections.agent-secrets.credentials.github_token}}

No início do sandbox, o Foundry resolve o marcador e injeta o valor resolvido como uma variável de ambiente simples. O teu código lê-o como qualquer outra variável do ambiente:

import os
token = os.environ["GITHUB_TOKEN"]

Um GET na versão do agente devolve o texto literal ${{...}} — o segredo resolvido nunca é transmitido de volta através da API de gestão.

Considerations

  • Cria a ligação antes de implementares a versão. Se a conexão ou o campo referenciado estiverem em falta ao iniciar a sandbox, o marcador de posição não é resolvido e a variável fica vazia.
  • Os segredos são apenas para escrita. O GET numa conexão devolve credentials: null. Verifique a resolução lendo a variável de ambiente a partir do interior do contentor em execução, e não inspecionando a ligação.
  • Regista CustomKeys manualmente os nomes dos campos. A API de gestão nunca os repete após a criação. Mantenha-os junto à origem do seu agente (por exemplo, em modelos IaC ou juntamente com azure.yaml) para que possa criar marcadores de posição mais tarde sem ter de adivinhar.
  • Foundry gere o nome secreto de apoio. Quando crias a ligação, o Foundry armazena o valor no Key Vault sob um nome que escolhe — não podes referenciar um segredo pré-existente do Key Vault pelo nome. Para associar o seu próprio Key Vault como armazenamento subjacente, consulte Configurar uma ligação ao Key Vault.

Empacota e testa o teu agente localmente

Antes de implementar no Foundry, valide que o seu agente funciona localmente usando a biblioteca de protocolos. O contentor serve os mesmos endpoints localmente que em produção.

Teste o protocolo Respostas

POST http://localhost:8088/responses
Content-Type: application/json

{
    "input": "Where is Seattle?",
    "stream": false
}

Teste o protocolo de Invocações

POST http://localhost:8088/invocations
Content-Type: application/json

{
    "message": "Hello!"
}

Implementar usando o Azure Developer CLI ou VS Code

O Azure Developer CLI (azd) e o Microsoft Foundry Toolkit for Visual Studio Code automatizam todo o ciclo de vida da implementação: construir o contenteur, enviá-lo para o Azure Container Registry, criar a versão do agente e atribuir papéis RBAC. Para um guia de iniciação, consulte o Início rápido: Criar e implementar um agente alojado.

Implemente com um único comando

A partir do diretório de projetos do seu agente, provisione a infraestrutura e implemente num único passo:

azd up

azd up combina azd provision, que cria o projeto Foundry, a implementação do modelo, o registo de contentores, o Application Insights e a identidade gerida, com azd deploy. Usa-o para implementações iniciais ou sempre que mudares tanto o código da infraestrutura como o do agente.

Implemente apenas alterações ao código

Se já provisionaste os teus recursos do Azure e só precisas de lançar uma nova versão do agente:

azd deploy

Durante azd deploy, a CLI:

  1. Constrói a imagem do teu contentor remotamente no Azure Container Registry, por isso não precisas do Docker local.
  2. Envia a imagem para o registo.
  3. Cria uma versão de agente alojada no Foundry Agent Service.
  4. Cria uma identidade dedicada ao agente Microsoft Entra e atribui os papéis RBAC que o agente precisa para aceder a modelos e ferramentas.

Gerir as versões

Cada um azd deploy cria uma nova versão do agente. A CLI preserva versões anteriores, e a versão mais recente está ativa por defeito.

Verificar a implantação

azd ai agent show

A saída inclui o nome do agente, versão, protocolos, recursos do contentor, variáveis de ambiente e carimbo temporal de criação. Use --output table para uma vista resumida.

Criar imagens localmente

Por defeito, azd constrói imagens de contentores remotamente no Azure Container Registry. Para construir imagens localmente, defina remoteBuild: false em azure.yaml. Compilações locais requerem o Docker Desktop.

Para filtrar os prompts e respostas de acordo com uma política de segurança de conteúdos, adicione uma barreira de segurança de conteúdos ao seu agente.

Implementar usando o SDK Python

Usa o SDK quando quiseres gerir implementações de agentes diretamente a partir de código Python.

Pré-requisitos adicionais

  • Python 3.10 ou posterior

  • Uma imagem de contentor em Azure Container Registry

  • Papel de Escritor de Repositório do Registo de Contentores ou AcrPush no registo de contentores (para enviar imagens)

  • Azure AI Projects SDK versão 2.3.0 ou posterior

    pip install "azure-ai-projects>=2.3.0"
    

Construa e carregue a sua imagem de container

  1. Constrói a tua imagem no Docker:

    docker build --platform linux/amd64 -t myagent:v1 .
    

    Veja Dockerfiles de exemplo para Python e C#.

  2. Enviar para o Azure Container Registry:

    az acr login --name myregistry
    docker tag myagent:v1 myregistry.azurecr.io/myagent:v1
    docker push myregistry.azurecr.io/myagent:v1
    

Dica

Use etiquetas de imagem únicas em vez de :latest para implementações reproduzíveis.

Configurar permissões de registo de contentores

Conceda à identidade gerida do seu projeto acesso para extrair imagens:

  1. No portal Azure, aceda ao recurso do seu projeto Foundry.

  2. Selecione Identidade e copie o ID do Objeto (principal) em Sistema atribuído.

  3. Atribui o papel de Leitor de Repositório do Registo de Contentores a esta identidade no teu registo de contentores. Veja Azure Container Registry funções e permissões.

Criar uma versão de agente hospedada

Quando crias uma versão, a plataforma provisiona automaticamente o agente. Não há uma etapa inicial separada. A plataforma constrói um snapshot do contentor e torna o agente pronto para atender pedidos.

from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import (
    AgentEndpointProtocol,
    ContainerConfiguration,
    HostedAgentDefinition,
    ProtocolVersionRecord,
)
from azure.identity import DefaultAzureCredential

# Format: "https://resource_name.services.ai.azure.com/api/projects/project_name"
PROJECT_ENDPOINT = "your_project_endpoint"

# Create project client
credential = DefaultAzureCredential()
project = AIProjectClient(
    endpoint=PROJECT_ENDPOINT,
    credential=credential,
)

# Create a hosted agent version
agent = project.agents.create_version(
    agent_name="my-agent",
    definition=HostedAgentDefinition(
        protocol_versions=[
            ProtocolVersionRecord(protocol=AgentEndpointProtocol.RESPONSES, version="1.0.0")
        ],
        cpu="1",
        memory="2Gi",
        container_configuration=ContainerConfiguration(
            image="your-registry.azurecr.io/your-image:tag"
        ),
        environment_variables={
            "MODEL_DEPLOYMENT_NAME": "gpt-5-mini"
        },
    )
)

print(f"Agent created: {agent.name}, version: {agent.version}")

Para expor ambos os protocolos, passe ambos em protocol_versions:

protocol_versions=[
    ProtocolVersionRecord(protocol=AgentEndpointProtocol.RESPONSES, version="1.0.0"),
    ProtocolVersionRecord(protocol=AgentEndpointProtocol.INVOCATIONS, version="1.0.0"),
    ProtocolVersionRecord(protocol=AgentEndpointProtocol.INVOCATIONS_WS, version="1.0.0"),
],

Parâmetros-chave:

Parâmetro Descrição
agent_name Nome único (alfanumérico com hífens, máximo 63 caracteres)
container_configuration.image URL completa da imagem do Azure Container Registry com etiqueta
cpu Alocação de CPU (por exemplo, "1")
memory Alocação de memória (por exemplo, "2Gi")
protocol_versions Protocolos que o contentor expõe (responses, invocations, ou ambos)

Para definir quando a computação da sessão fica inativa, veja Gerir a inatividade da sessão.

Inquérito para o estado da versão

Depois de criar uma versão, verifique até que o estado esteja active antes de invocar o agente. O provisionamento normalmente demora menos de um minuto, dependendo do tamanho da imagem.

import time

# Poll until the agent version is active
while True:
    version_info = project.agents.get_version(
        agent_name="my-agent",
        agent_version=agent.version
    )
    status = version_info["status"]
    print(f"Status: {status}")

    if status == "active":
        print("Agent is ready!")
        break
    elif status == "failed":
        print(f"Provisioning failed: {version_info['error']}")
        break

    time.sleep(5)

Valores de estado da versão:

Estado Descrição
creating Provisão de infraestruturas em curso
active O agente está pronto para atender pedidos
failed Falha no provisionamento - verifique o error campo para detalhes
deleting A versão está a ser limpa
deleted A versão foi totalmente removida

Invocar o agente

Depois de a versão atingir active o estado, use get_openai_client para criar um cliente OpenAI ligado ao endpoint do agente.

Para o protocolo Respostas :

# Create an OpenAI client bound to the agent endpoint
openai_client = project.get_openai_client(agent_name="my-agent")

response = openai_client.responses.create(
    input="Hello! What can you do?",
)

print(response.output_text)

Para o protocolo Invocations , chame diretamente o endpoint das invocações:

import requests

token = credential.get_token("https://ai.azure.com/.default").token
url = f"{PROJECT_ENDPOINT}/agents/my-agent/endpoint/protocols/invocations"

response = requests.post(url, headers={
    "Authorization": f"Bearer {token}",
    "Content-Type": "application/json",
}, params={"api-version": "v1"}, json={
    "message": "Process this task"
})

print(response.json())

Para exemplos mais completos, consulte os exemplos de agentes hospedados.

Implementar usando o SDK JavaScript/TypeScript

Usa o SDK quando quiseres gerir implementações de agentes diretamente a partir de Node.js código. O chamador do SDK é executado em Node.js, mas a própria imagem do contentor continua a executar o seu código de agente em Python ou .NET, criado com as bibliotecas de protocolo Responses ou Invocations — não existe um runtime alojado de agente em Node.js.

Pré-requisitos adicionais

  • Node.js 22 ou depois

  • Uma imagem de contentor em Azure Container Registry

  • Papel de Escritor de Repositório do Registo de Contentores ou AcrPush no registo de contentores (para enviar imagens)

  • Os pacotes @azure/ai-projects e @azure/identity

    npm install @azure/ai-projects @azure/identity
    

Antes de começar, compile e envie a imagem de contentor para o Azure Container Registry (consulte o separador Python para ver comandos Docker de exemplo) e conceda à identidade gerida do projeto a função Container Registry Repository Reader no registo de contentores.

Criar uma versão de agente hospedada

Quando crias uma versão, a plataforma provisiona automaticamente o agente. Não há uma etapa inicial separada. A plataforma constrói um snapshot do contentor e torna o agente pronto para atender pedidos.

import { AIProjectClient } from "@azure/ai-projects";
import { DefaultAzureCredential } from "@azure/identity";

// Format: "https://resource_name.services.ai.azure.com/api/projects/project_name"
const projectEndpoint =
  process.env["FOUNDRY_PROJECT_ENDPOINT"] || "your_project_endpoint";
const agentName = "my-agent";

const project = new AIProjectClient(
  projectEndpoint,
  new DefaultAzureCredential(),
);

// Create a hosted agent version
const agent = await project.agents.createVersion(agentName, {
  kind: "hosted",
  cpu: "1",
  memory: "2Gi",
  container_configuration: {
    image: "your-registry.azurecr.io/your-image:tag",
  },
  protocol_versions: [{ protocol: "responses", version: "1.0.0" }],
  environment_variables: { MODEL_DEPLOYMENT_NAME: "gpt-5-mini" },
});

console.log(`Agent created: ${agent.name}, version: ${agent.version}`);

Para expor ambos os protocolos, passe ambos em protocol_versions:

protocol_versions: [
  { protocol: "responses", version: "1.0.0" },
  { protocol: "invocations", version: "1.0.0" },
  { protocol: "invocations_ws", version: "1.0.0" },
],

Inquérito para o estado da versão

Depois de criar uma versão, verifique até que o estado esteja active antes de invocar o agente. O provisionamento normalmente demora menos de um minuto, dependendo do tamanho da imagem.

function sleep(ms: number) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// Poll until the agent version is active
for (;;) {
  const versionInfo = await project.agents.getVersion(
    agentName,
    agent.version,
  );
  console.log(`Status: ${versionInfo.status}`);
  if (versionInfo.status === "active") {
    break;
  }
  if (versionInfo.status === "failed") {
    console.log(`Provisioning failed: ${versionInfo.error}`);
    break;
  }
  await sleep(5_000);
}

Encaminhe o endpoint do agente e invoque-o

Encaminhe o endpoint do agente para a versão que criou e depois associe um cliente OpenAI ao endpoint.

Para o protocolo Respostas :

await project.agents.patchAgentObject(agentName, {
  agentEndpoint: {
    version_selector: {
      version_selection_rules: [
        {
          type: "FixedRatio",
          agent_version: agent.version,
          traffic_percentage: 100,
        },
      ],
    },
    protocol_configuration: { responses: {} },
  },
});

// Create an OpenAI client bound to the agent endpoint
const openAIClient = project.getOpenAIClient({
  azureConfig: { allowPreview: true, agentName },
});

const response = await openAIClient.responses.create({
  input: "Hello! What can you do?",
});
console.log(response.output_text);

Para o protocolo Invocations , chame diretamente o endpoint das invocações:

const credential = new DefaultAzureCredential();
const token = await credential.getToken("https://ai.azure.com/.default");
if (!token) {
  throw new Error("Failed to acquire an access token.");
}
const url = `${projectEndpoint}/agents/my-agent/endpoint/protocols/invocations`;

const response = await fetch(`${url}?api-version=v1`, {
  method: "POST",
  headers: {
    Authorization: "Bearer " + token.token,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ message: "Process this task" }),
});
console.log(await response.json());

Referência: AIProjectClient

Implementar usando a API REST

Use a API REST para implementações diretas baseadas em HTTP ou ao integrar com ferramentas personalizadas.

Antes de começar, construa e envie a sua imagem de contentor para o Azure Container Registry, e conceda à identidade gerida do projeto o papel de Leitor de Repositório do Registo de Contentores no registo.

Configurar variáveis

BASE_URL="https://{account}.services.ai.azure.com/api/projects/{project}"
API_VERSION="v1"
TOKEN=$(az account get-access-token --resource https://ai.azure.com --query accessToken -o tsv)

Criar um agente

curl -X POST "$BASE_URL/agents?api-version=$API_VERSION" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "my-agent",
    "definition": {
      "kind": "hosted",
      "container_configuration": {
        "image": "myacr.azurecr.io/my-agent:v1"
      },
      "cpu": "1",
      "memory": "2Gi",
      "protocol_versions": [
        {"protocol": "responses", "version": "1.0.0"}
      ],
      "environment_variables": {
        "MODEL_DEPLOYMENT_NAME": "gpt-5-mini"
      }
    }
  }'

Criar um agente também cria versões 1 e desencadeia o provisionamento.

Para definir quando a computação da sessão fica inativa, veja Gerir a inatividade da sessão.

Para analisar pedidos e respostas de acordo com uma política de segurança de conteúdo, inclua um objeto rai_config no definition. Veja Adicionar uma proteção de segurança de conteúdo a um agente hospedado.

Inquérito para o estado da versão

Verifica continuamente o endpoint de versão até que status seja active:

while true; do
  STATUS=$(curl -s -X GET "$BASE_URL/agents/my-agent/versions/1?api-version=$API_VERSION" \
    -H "Authorization: Bearer $TOKEN" | jq -r '.status')
  echo "Status: $STATUS"
  [ "$STATUS" = "active" ] && echo "Ready!" && break
  [ "$STATUS" = "failed" ] && echo "Provisioning failed." && exit 1
  sleep 5
done

Invocar o agente

Utilize o endpoint dedicado do agente para enviar requisições. Definir "stream": true para receber eventos enviados pelo servidor.

Protocolo de respostas:

curl -X POST "$BASE_URL/agents/my-agent/endpoint/protocols/openai/responses?api-version=$API_VERSION" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "input": "Hello! What can you do?",
    "store": true
  }'

Protocolo de invocações:

curl -X POST "$BASE_URL/agents/my-agent/endpoint/protocols/invocations?api-version=$API_VERSION" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "message": "Process this task"
  }'

Criar uma nova versão

Implemente código ou configuração atualizada criando uma nova versão:

curl -X POST "$BASE_URL/agents/my-agent/versions?api-version=$API_VERSION" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "definition": {
      "kind": "hosted",
      "container_configuration": {
        "image": "myacr.azurecr.io/my-agent:v2"
      },
      "cpu": "1",
      "memory": "2Gi",
      "protocol_versions": [
        {"protocol": "responses", "version": "1.0.0"}
      ],
      "environment_variables": {
        "MODEL_DEPLOYMENT_NAME": "gpt-5-mini"
      }
    }
  }'

Recursos de limpeza

Para evitar cobranças, limpe os recursos quando terminar. A plataforma desprovisiona os recursos de computação do agente após o tempo limite de inatividade configurado, que é de 15 minutos por predefinição, pelo que não há qualquer custo quando um agente não está a servir pedidos.

Limpeza do Azure Developer CLI

azd down

Limpeza do SDK

Apague uma única versão:

project.agents.delete_version(agent_name="my-agent", agent_version=agent.version)

Ou eliminar o agente na totalidade e todas as respetivas versões. Use force=True para apagar em cascata quaisquer sessões ativas, como logo após invocar o agente; sem ele, a chamada falha com um erro de conflito enquanto as sessões estão ativas:

project.agents.delete(agent_name="my-agent", force=True)

Limpeza do SDK

Apague uma única versão:

await project.agents.deleteVersion("my-agent", agent.version);

Ou apagar o agente inteiro e todas as suas versões:

await project.agents.delete("my-agent", { force: true });

Referência: AIProjectClient

Limpeza da API REST

Apague uma única versão:

curl -X DELETE "$BASE_URL/agents/my-agent/versions/1?api-version=$API_VERSION" \
  -H "Authorization: Bearer $TOKEN"

Ou apagar o agente inteiro:

curl -X DELETE "$BASE_URL/agents/my-agent?api-version=$API_VERSION" \
  -H "Authorization: Bearer $TOKEN"

Aviso

Eliminar um agente remove todas as suas versões e termina sessões ativas. Esta ação não pode ser desfeita.

Resolução de problemas

Erros de provisionamento surgem nos campos error.code e error.message do objeto de versão. Verifique o estado da versão após a criação para identificar problemas.

Código de erro Código HTTP Solução
image_pull_failed 400 Verifica o URI da imagem. Confirme que a identidade gerida pelo projeto tem o Leitor de Repositório do Registo de Contentores no ACR e que o estado da política do azureADAuthenticationAsArmPolicy registo é enabled
SubscriptionIsNotRegistered 400 Registe-se no fornecedor de subscrição
InvalidAcrPullCredentials 401 Corrigir identidade gerida ou o RBAC do registro
UnauthorizedAcrPull 403 Fornecer credenciais ou identidade corretas
AcrImageNotFound 404 Corrigir nome/etiqueta da imagem ou publicar imagem
RegistryNotFound 400/404 Corrigir o DNS do registo ou a acessibilidade da rede

Para erros 5xx, contacte o suporte da Microsoft.

Para requisitos detalhados de RBAC e resolução de problemas de permissões, consulte Referência de permissões de agente hospedado.

Próximos passos