Implementar um agente hospedado a partir do código-fonte (pré-visualização)

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.

Importante

A implantação do código-fonte para agentes hospedados está em versão preliminar. Funcionalidades, disponibilidade de regiões e APIs podem mudar antes da disponibilidade geral.

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

É necessário ter Foundry Project Manager ao nível do projeto para implementar um agente alojado. Esta função concede permissões ao plano de dados para criar e atualizar agentes, além da capacidade de atribuir o Foundry User à identidade do agente criado pela plataforma que o seu código em execução usa para chamar modelos e ferramentas.

O seu agente funciona como uma identidade gerida atribuída pela plataforma, separada da identidade do seu utilizador. Essa identidade exige que o Foundry User chame modelos a partir do interior do contentor. Se implementares com azd ou com o Foundry Toolkit for Visual Code, a ferramenta atribui automaticamente esta função. Se implementares com REST, concede-o tu próprio — consulta a referência de permissões do agente alojado.

Para chamadas REST, inclua o cabeçalho da funcionalidade de pré-visualização sobre pedidos de mutação (Crear, Atualizar, Eliminar) enquanto a funcionalidade está em pré-visualização:

Foundry-Features: CodeAgents=V1Preview,HostedAgents=V1Preview

Atualmente, os pedidos GET funcionam sem ele, mas inclua-o em todas as chamadas por precaução — o cabeçalho controla o comportamento de pré-visualização e poderá vir a ser aplicado de forma mais rigorosa antes da GA.

Ciclo de vida de implementação

Cada implantação de código-fonte segue a mesma sequência: empacotar → criar ou atualizar → verificar 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 — os dois são mutuamente exclusivos 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.
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.

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. O Foundry Toolkit para VS Code solicita-te o método de implementação da mesma forma.

Para selecionar a implantação do código-fonte sem interação, 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

Com --no-prompt, o modo de implementação é predefinido para container, portanto passa --deploy-mode code explicitamente para implementações de código-fonte. Após a inicialização, execute azd up para provisionar e implementar.

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.

A implementação a partir do código-fonte utiliza a interface de cliente em pré-visualização beta, por isso, crie o cliente com allow_preview=True.

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,
    CreateAgentVersionFromCodeContent,
    CreateAgentVersionFromCodeMetadata,
    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,
    allow_preview=True,
)

content = CreateAgentVersionFromCodeContent(
    metadata=CreateAgentVersionFromCodeMetadata(
        description="Hello-world code agent",
        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-4.1-mini"},
        ),
    ),
    code=(ZIP_PATH.name, code_zip_bytes, "application/zip"),
)

created = project.beta.agents.create_version_from_code(
    agent_name=AGENT_NAME,
    content=content,
    code_zip_sha256=code_zip_sha256,
)
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 bundled modo, defina dependency_resolution="bundled" e envie dependências pré-construídas no zip — veja Construir dependências Linux localmente.

Inquérito para ativos

Os métodos de implementação de código (create_version_from_code e download_code) estão disponíveis na superfície de pré-visualização project.beta.agents, mas as operações de leitura e de eliminação, como get_version, estão em project.agents.

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.beta.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 User (ou superior) 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.
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