Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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
activee 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.
pipa partir do Python 3.13 ou posterior, para empacotar o código-fonte localmente.azure-ai-projectsversão 2.2.0 ou posterior e os pacotesazure-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:
- Python: Estado das versões Python (python.org).
- .NET: Política de suporte do .NET e do .NET Core.
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.pyem vez demain.pyna raiz). - Incluir ficheiros em bruto
.whlempackages/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.