Implementar um agente alojado a partir do código-fonte

Este artigo mostra-lhe como implementar um agente Hosted no Foundry Agent Service a partir de Python ou .NET código-fonte, sem ter de construir ou enviar uma imagem de contentor. Carrega um .zip do seu código (e, opcionalmente, as suas dependências), e o Agent Service ou executa-o tal como está ou compila as suas dependências na nuvem.

Sugestão

Para a maioria dos cenários, implemente com o Azure Developer CLI (azd) ou o Foundry Toolkit para VS Code. Estas ferramentas fazem o trabalho pesado por si: empacotam o seu código-fonte, fazem o seu carregamento, verificam periodicamente a existência de active e configuram automaticamente o controlo de acesso baseado em funções. Para começar, siga o Quickstart: Implemente o seu primeiro agente alojado e escolha Código (ou Código-Fonte (upload ZIP)) quando solicitado para um método de implementação.

Use os procedimentos SDK e REST deste artigo quando precisar de implementar agentes de código-fonte programáticamente — a partir do SDK Python ou .NET SDK nas suas próprias aplicações, ou diretamente sobre a API REST para ferramentas personalizadas, automação independente da linguagem ou integração com sistemas de entrega contínua existentes. Neste artigo, você conclui as seguintes tarefas:

  • Escolha um modo de resolução de dependências e empacote a sua fonte.
  • Criar o agente, aguardar que atinja active e invocá-lo.
  • Atualize, controle a versão, descarregue e transmita os registos do agente implementado.

Se precisar de controlo total da imagem em tempo de execução ou se já tiver um Dockerfile a funcionar, use o caminho baseado em container: Implante um agente alojado.

Se utilizar um agente de programação como o GitHub Copilot para empacotar e implementar código-fonte, a Microsoft Foundry Skill pode ajudar a preparar o seu projeto e a seguir as etapas necessárias de azd, SDK ou REST.

Pré-requisitos

  • Um projeto Microsoft Foundry numa região suportada.
  • CLI do Azure versão 2.80 ou posterior, com sessão iniciada no locatário proprietário do projeto.
  • pip a partir do Python 3.13 ou posterior, para empacotar o código-fonte localmente.

  • azure-ai-projects versão 2.2.0 ou posterior e os pacotes azure-identity.

    pip install "azure-ai-projects>=2.2.0" azure-identity
    

Tempos de execução suportados

O code_configuration.runtime campo na definição do agente aceita os seguintes valores. Escolhe o runtime que corresponde aos binários do teu zip—Linux x86_64 rodas para Python, ou o TargetFramework da tua saída dotnet publish para .NET.

Linguagem Valores de execução
Python python_3_13, python_3_14
.NET dotnet_10

Política de suporte a versões linguísticas

O ambiente de execução do serviço Agent inclui a imagem de contentor criada pela plataforma para cada valor de code_configuration.runtime. Para manter os seus agentes implementados totalmente suportados, a Foundry alinha o suporte de idiomas dos agentes alojados com o suporte em fim de vida de cada idioma. O suporte termina na data de término do suporte da comunidade para a versão em língua. A Microsoft pode descontinuar um valor code_configuration.runtime mais cedo quando as restrições da plataforma (como a imagem de base subjacente) o exigirem.

Para os calendários de fim de suporte de origem, consulte:

Fase de aposentação

Mesmo após a data de fim de suporte de uma linguagem, pode continuar a criar, atualizar e executar agentes hospedados que utilizam o valor de runtime descontinuado. No entanto, esses agentes não são elegíveis para suporte, novas funcionalidades ou patches de segurança até que os atualize para um runtime suportado, definindo um valor atual code_configuration.runtime e reimplantando.

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.

O seu agente funciona como uma identidade gerida atribuída pela plataforma, separada da identidade do seu utilizador. Esta identidade pode aceder à inferência de modelos através do endpoint do projeto e do armazenamento de sessão, por predefiniçã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.

Ciclo de vida de implementação

Cada implementação de código-fonte segue a mesma sequência: empacotar -> criar ou atualizar -> sondar até active -> invocar. O caminho do código-fonte usa code_configuration na definição do agente. O caminho baseado em imagem usa container_configuration em vez disso. Estas duas opções são mutuamente exclusivas numa única versão.

Escolhe o caminho que se adequa ao teu fluxo de trabalho. Se não tiveres a certeza, começa pelo Azure Developer CLI ou VS Code — é o caminho recomendado para a maioria dos clientes.

Caminho Melhor para Embalagem
Azure Developer CLI ou VS Code A maioria das implementações, incluindo as implementações iniciais e o ciclo interno mais rápido. A Tooling constrói e carrega o código zip por ti.
Python SDK Implementação programática a partir de aplicações Python ou automação. Cria o ficheiro ZIP; o SDK carrega-o.
.NET SDK Implementação programática a partir de aplicações .NET ou automação. O SDK comprime uma pasta para ti.
JavaScript/TypeScript SDK Implementação programática a partir de aplicações Node.js ou automação. Implementa código-fonte Python ou .NET; não há runtime alojado do Node.js. Cria o ficheiro ZIP; o SDK carrega-o.
API REST Ferramentas personalizadas, automação independente da linguagem e sistemas de CD. Constróis o ficheiro ZIP e envias o pedido multipart.

Escolha como as dependências são resolvidas

Antes de começar, escolha um valor para code_configuration.dependency_resolution. Esta escolha afeta o que coloca no ficheiro ZIP.

Value Comportamento Utilizar quando
remote_build O Serviço de Agente instala dependências a partir de requirements.txt (Python) ou restaura o ficheiro do projeto (.NET) durante o provisionamento. Queres um upload pequeno e o loop interno mais simples. Recomendado para utilizadores de primeira viagem.
bundled O ficheiro ZIP é executado tal como está. Envias dependências Linux pré-construídas em saída packages/ (Python) ou dotnet publish (.NET). Precisas de compilações reproduzíveis, as tuas dependências são privadas ou apenas em formato wheel, ou o teu projeto não é restaurado corretamente no servidor.

Para o modo empacotado, consulte Empacotar o ficheiro zip manualmente para os comandos da compilação local.

Requisitos de firewall para redes virtuais privadas

Se proteger o seu projeto com uma rede virtual privada, atualize a sua política de rede para permitir ligações de saída aos seguintes endpoints antes de implementar.

Todas as implementações de código-fonte requerem acesso de saída a:

  • mcr.microsoft.com
  • *.login.microsoft.com

Para configuração de rede, veja Implantar um agente alojado numa rede virtual.

Deploye usando o Azure Developer CLI ou VS Code

O Azure Developer CLI (azd) e o Foundry Toolkit for VS Code automatizam todo o ciclo de vida de implementação do código-fonte — empacotam o seu código-fonte num zip, calculam o SHA-256, carregam-no, fazem sondagem para active e configuram o controlo de acesso baseado em funções para si. Estas ferramentas são o caminho recomendado pela maioria dos clientes e o circuito interno mais rápido.

Para um guia passo a passo, consulte o Quickstart: Implemente o seu primeiro agente alojado. Escolha Código (ou Código-Fonte (upload ZIP)) quando o quickstart pedir um método de implementação.

Selecionar a implementação do código-fonte

Quando executa azd ai agent init de forma interativa, a ferramenta pede-lhe para escolher um modo de implementação. Escolha código para implementar a partir do código-fonte através do carregamento de um ficheiro ZIP, em vez de criar uma imagem de contentor. A implementação de código é o modo padrão para agentes hospedados em Python e .NET. O Foundry Toolkit para VS Code solicita-te o método de implementação da mesma forma.

Para selecionar a implementação do código-fonte de forma não interativa, por exemplo, num pipeline CI/CD, passe --deploy-mode code. Este modo requer --runtime e --entry-point, e aceita um valor opcional --dep-resolution de remote_build (por defeito) ou bundled:

azd ai agent init --no-prompt --project-id "<project-resource-id>" \
  --deploy-mode code --runtime python_3_13 --entry-point main.py

Após a inicialização, azd escreve as definições de implementação do código-fonte no campo codeConfiguration do serviço azure.ai.agent em azure.yaml:

services:
  my-agent:
    host: azure.ai.agent
    project: src/my-agent
    kind: hosted
    codeConfiguration:
      runtime: python_3_13
      entryPoint:
        - python
        - main.py
      dependencyResolution: remote_build

Executar azd up para provisionar e implementar. Use --deploy-mode container apenas quando quiser construir ou referenciar uma imagem de contentor.

Use o SDK ou os caminhos REST nas secções seguintes quando precisar de implementar programaticamente a partir da sua própria aplicação ou integrar com ferramentas existentes.

Implantar a partir do código-fonte

Selecione a sua língua ou interface. Cada separador percorre o mesmo ciclo de vida: cria o agente, consulta até chegar active, invoca-o e descarrega o código implementado.

Use o SDK Python para implementar agentes de código-fonte a partir das suas próprias aplicações ou automação. Cria tu mesmo o ficheiro ZIP e passa os respetivos bytes e o SHA-256 ao SDK, que o carrega e expõe as mesmas operações de criação, consulta do estado, invocação e transferência que a API REST. A implementação do código requer a versão 2.2.0 ou superior do azure-ai-projects.

Compilar o ficheiro ZIP

O SDK Python carrega um código zip que tu constróis. Utilize a mesma disposição e as regras de resolução de dependências descritas em Criar o ficheiro zip manualmente. O pacote mínimo remote_build é um ficheiro ZIP simples com main.py e requirements.txt na raiz.

Criar o agente

import hashlib
from pathlib import Path

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

# Format: "https://<account>.services.ai.azure.com/api/projects/<project>"
PROJECT_ENDPOINT = "your_project_endpoint"
AGENT_NAME = "my-code-agent"
ZIP_PATH = Path("agent-code.zip")

code_zip_bytes = ZIP_PATH.read_bytes()
code_zip_sha256 = hashlib.sha256(code_zip_bytes).hexdigest()

credential = DefaultAzureCredential()
project = AIProjectClient(
    endpoint=PROJECT_ENDPOINT,
    credential=credential,
)

created = project.agents.create_version_from_code(
    agent_name=AGENT_NAME,
    definition=HostedAgentDefinition(
        cpu="1",
        memory="2Gi",
        code_configuration=CodeConfiguration(
            runtime="python_3_13",
            entry_point=["python", "main.py"],
            dependency_resolution="remote_build",
        ),
        protocol_versions=[
            ProtocolVersionRecord(protocol="responses", version="1.0.0")
        ],
        environment_variables={"AZURE_AI_MODEL_DEPLOYMENT_NAME": "gpt-5.4-mini"},
    ),
    code=(ZIP_PATH.name, code_zip_bytes, "application/zip"),
    code_zip_sha256=code_zip_sha256,
    description="Hello-world code agent",
)
print(f"Created version: {created.version}")

Para o protocolo Invocations, defina a entrada protocol_versions como ProtocolVersionRecord(protocol="invocations", version="1.0.0"). Para o protocolo Invocations (WebSocket), utilize ProtocolVersionRecord(protocol="invocations_ws", version="1.0.0"). Para o modo bundled, defina dependency_resolution="bundled" e inclua dependências pré-construídas no ficheiro ZIP. Para mais informações, consulte Construir dependências Linux localmente.

Inquérito para ativos

import time

while True:
    version = project.agents.get_version(
        agent_name=AGENT_NAME, agent_version=created.version
    )
    status = version["status"]
    print(f"Status: {status}")
    if status == "active":
        break
    if status == "failed":
        raise RuntimeError(f"Provisioning failed: {version.get('error')}")
    time.sleep(5)

Consulte Poll for active para a lista completa de valores de estado e como ler o error objeto em caso de falha.

Invocar o agente

Depois de a versão atingir active, vincula um cliente OpenAI ao endpoint do agente e chama-o. Este exemplo utiliza o protocolo Responses:

openai_client = project.get_openai_client(agent_name=AGENT_NAME)

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

Para o protocolo Invocations, chama diretamente o endpoint de invocação com um token de portador, como mostrado em Invocar o agente.

Descarregue o ficheiro ZIP implantado

Verifique exatamente o que está implementado descarregando o zip e comparando o SHA-256 com o valor que carregou:

import hashlib
from pathlib import Path

out_path = Path(f"{AGENT_NAME}-{created.version}.zip")
sha = hashlib.sha256()
with open(out_path, "wb") as f:
    for chunk in project.agents.download_code(
        agent_name=AGENT_NAME, agent_version=created.version
    ):
        f.write(chunk)
        sha.update(chunk)

print(f"Downloaded {out_path} (matches upload: {sha.hexdigest() == code_zip_sha256})")

Para um exemplo completo executável, veja as amostras Python hosted-agent.

Empacote manualmente o ficheiro ZIP

Se usares azd, salta esta secção —azd constrói o zip por ti. Lê isto se usares a API REST, se mudares para a resolução de dependências em pacote ou se precisares de controlo total sobre o conteúdo do carregamento.

O ficheiro ZIP tem de estar diretamente na raiz — sem pasta envolvente de nível superior.

Selecione o separador correspondente ao idioma do seu agente.

Layout Python (modo de construção remota)

O serviço instala dependências na cloud a partir de requirements.txt.

agent-code.zip
+-- main.py
+-- requirements.txt

Layout Python (modo agrupado)

Envias dependências Linux pré-construídas em packages/.

agent-code.zip
+-- main.py                    # entry point
+-- requirements.txt
+-- packages/                  # extracted modules (not raw .whl files)
    +-- azure/identity/__init__.py
    +-- requests/__init__.py

Construir dependências Linux localmente (agrupado, Python)

Use a etiqueta de plataforma manylinux2014_x86_64 para que pip transfira wheels de Linux mesmo a partir do Windows ou do macOS.

Bash

pip install -r requirements.txt \
    --target packages/ \
    --platform manylinux2014_x86_64 \
    --python-version 3.13 \
    --implementation cp \
    --only-binary=:all:

zip -r agent-code.zip main.py requirements.txt packages/

PowerShell / Windows cmd

pip install -r requirements.txt --target packages --platform manylinux2014_x86_64 --python-version 3.13 --implementation cp --only-binary=:all:

tar -a -c -f agent-code.zip main.py requirements.txt packages

--only-binary=:all: força o uso de wheels (sem compilações a partir do código-fonte). O --python-version deve corresponder ao runtime valor na definição do agente.

Warning

Erros comuns de empacotamento que causam session_creation_failed ou ModuleNotFoundError:

  • Envolver a fonte numa pasta (my-agent/main.py em vez de main.py na raiz).
  • Incluir ficheiros em bruto .whl em packages/ em vez de módulos extraídos.
  • Inclusão de binários do Windows (.pyd, .dll) para um ambiente de execução Linux.

Limits

Limit Value
Tamanho máximo de fecho zip (upload em várias partes) 250 MB

Para ver as combinações suportadas de cpu e memory, consulte Tamanhos da sandbox.

Resolução de problemas

Symptom Causa provável Corrigir
401 Unauthorized Token em falta ou com escopo errado Obtenha um token com --resource https://ai.azure.com.
403 Forbidden O utilizador não tem permissões de controlo de acesso baseado em funções no projeto Atribua Foundry Agent Consumer (apenas para invocar) ou Foundry User (para também desenvolver) ao nível do projeto.
409 conflict em Criar (Agent '<name>' already exists) O nome do agente já existe Use Atualização (POST /agents/{name}) ou escolha um novo nome.
400 bad_request (CPU and Memory must be specified as a valid resource tier) em Criar ou Atualizar cpu / memory não são um dos níveis suportados Defina cpu e memory como um par válido de tamanhos da Sandbox.
400 bad_request (Agent version is still being provisioned) na invocação Uma nova versão está a meio da implementação e a versão ativa está a ser trocada Consulta a versão status até active, depois tenta novamente.
424 session_not_ready ao invocar O contentor arrancou mas /readiness não devolveu HTTP 200 dentro do timeout Transmite logs com :logstream, corrige a sonda de prontidão ou erro de arranque, reimplementa.
409 conflict no agente em DELETE (Agent has active sessions) Eliminação de blocos de sessões abertas Espere que as sessões fiquem inativas ou anexe &force=true para eliminar as sessões em cascata.
Versão bloqueada em creating (>10 min, compilação remota) A build do servidor falhou ou não conseguiu resolver requirements.txt Muda para dependency_resolution: bundled e pré-monta localmente.
Falhas de implementação numa rede virtual privada Os endpoints de saída obrigatórios são bloqueados pelo firewall Permita os endpoints em Requisitos de firewall para redes virtuais privadas e, em seguida, volte a implementar.
A versão transita para failed Mau layout do zip, erro de sintaxe, ou (remote_build) falha na restauração/compilação Leia primeiro o objeto error da versão — error.code classifica a falha e error.message contém a linha subjacente de erro de restauro ou compilação (pip para Python, NuGet para .NET) mais um link de resolução de problemas. Verifica a estrutura das pastas. Utilize :logstream apenas depois de o contentor iniciar.
ModuleNotFoundError em tempo de execução packages/ em falta, contém ficheiros em bruto .whl ou tem binários do Windows Reconstruir com pip install --target packages/ --platform manylinux2014_x86_64 --only-binary=:all:.
409 AgentNotCodeBased em download O agente é baseado em imagem Usa o documento de implementação baseado em contentores.

Limpeza de recursos

Se estruturaste o projeto a partir do Quickstart com azd, executa azd down a partir da raiz do projeto para remover todo o ambiente provisionado.

Para eliminar um agente que implementou com o SDK ou a API REST, use o caminho correspondente abaixo.

# Delete one version
project.agents.delete_version(agent_name=AGENT_NAME, agent_version=created.version)

# Delete the agent and all its versions
project.agents.delete(agent_name=AGENT_NAME)

Warning

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

Passos seguintes