Wdrażanie hostowanego agenta

W tym artykule pokazano, jak wdrożyć agenta działającego w kontenerze w usłudze Foundry Agent Service przy użyciu interfejsu Azure Developer CLI (azd), zestawu SDK dla języka Python, platformy .NET lub języka JavaScript/TypeScript albo interfejsu API REST. Wybierz metodę wdrażania przy użyciu selektora w górnej części artykułu. Użyj metod zestawu SDK lub REST, jeśli chcesz zarządzać wdrożeniami agentów bezpośrednio z własnych aplikacji lub usług.

Aby zarządzać zasobem płaszczyzny danych hostowanego agenta przy użyciu infrastruktury jako kodu, zobacz Wdrażanie hostowanego agenta za pomocą programu Terraform. Informacje na temat infrastruktury Terraform z wdrażaniem agenta zarządzanym przez azd można znaleźć w artykule Konfigurowanie CI/CD przy użyciu azd.

Jeśli wdrażasz po raz pierwszy lub chcesz zapoznać się z przewodnikiem, zobacz Przewodnik Szybki start: tworzenie i wdrażanie hostowanego agenta. Interfejs wiersza polecenia Azure Developer CLI (azd) i rozszerzenie programu VS Code automatycznie obsługują kompilowanie, publikowanie, wersjonowanie i konfigurację mechanizmu RBAC.

Wskazówka

Preferuj pętlę wewnętrzną bez platformy Docker? Możesz również wdrożyć hostowanego agenta bezpośrednio z kodu źródłowego — prześlij .zip swój kod w języku Python lub .NET, a platforma skompiluje go i będzie hostować za Ciebie.

Jeśli używasz agenta kodowania, takiego jak GitHub Copilot, umiejętności Microsoft Foundry mogą pomóc w zaplanowaniu przepływu wdrażania kontenera, przygotowaniu azd poleceń i połączeniu zestawu SDK lub procedury REST z projektem.

Cykl życia wdrożenia

Każde wdrożenie hostowanego agenta jest zgodne z następującą sekwencją:

  1. Kompilowanie i wypychanie — spakuj kod agenta do obrazu kontenera i wypchnij go do Azure Container Registry.
  2. Utwórz wersję agenta — zarejestruj obraz w usłudze Foundry Agent Service. Platforma zapewnia infrastrukturę i tworzy dedykowaną tożsamość dla agenta Entra.
  3. Sprawdzaj stan — poczekaj, aż stan wersji osiągnie active.
  4. Wywołaj — wysyłaj żądania do dedykowanego punktu końcowego agenta.

Wymagania wstępne

Wymagane uprawnienia

Aby wdrożyć agenta hostowanego, musisz mieć rolę Foundry Project Manager na poziomie projektu. Ta rola przyznaje uprawnienia w płaszczyźnie danych do tworzenia i aktualizowania agentów, a także możliwość tworzenia przypisań ról dla tożsamości agenta utworzonego przez platformę, w razie potrzeby. Aby uzyskać szczegółowe zestawienie uprawnień, zobacz informacje referencyjne dotyczące uprawnień hostowanego agenta.

Ważne

Niedawno zmieniono nazwy ról RBAC w usłudze Foundry. Użytkownik Foundry, właściciel Foundry, właściciel konta Foundry i menedżer projektu Foundry były wcześniej nazywane odpowiednio użytkownikiem Azure AI, właścicielem Azure AI, właścicielem konta Azure AI i menedżerem projektu Azure AI. Poprzednie nazwy mogą być nadal widoczne w niektórych miejscach, podczas gdy zmiana nazwy jest wdrażana. Identyfikatory ról i uprawnienia podstawowe są niezmienione przez zmianę nazwy.

Platforma tworzy dedykowaną tożsamość agenta Microsoft Entra dla każdego hostowanego agenta w czasie wdrażania. Ta tożsamość jest podmiotem usługi, którego działający kontener używa do wywoływania modeli i narzędzi. Nie musisz ręcznie konfigurować tożsamości zarządzanych. Tożsamość agenta może domyślnie uzyskiwać dostęp do wnioskowania modelu za pośrednictwem punktu końcowego projektu i magazynu sesji. W przypadku zasobów zewnętrznych (na przykład własnego konta usługi Azure Storage) ręcznie przypisz role RBAC do tożsamości Microsoft Entra ID agenta. Aby uzyskać więcej informacji, zobacz Dostęp agenta poza ustawieniami domyślnymi.

Jeśli używasz azd lub rozszerzenia VS Code, narzędzia automatycznie obsługują większość przypisań RBAC, w tym Container Registry Repository Reader dla tożsamości zarządzanej projektu (pobieranie obrazów).

Aby uzyskać więcej informacji, zobacz Uwierzytelnianie i autoryzacja.

Ważne

Obsługa umieszczania Azure Container Registry hostowanego agenta za siecią prywatną (prywatny punkt końcowy z wyłączonym dostępem do sieci publicznej) zależy od momentu utworzenia projektu Foundry. Projekty utworzone po 25 czerwca 2026 r. obsługują rejestr prywatny. Projekty utworzone przed tą datą wymagają, aby rejestr był osiągalny za pośrednictwem jego publicznego punktu końcowego, aby platforma mogła ściągnąć obraz. Nie ma to wpływu na istniejące projekty. Aby uzyskać pełną listę ograniczeń sieci, zobacz Ograniczenia.

Wymagania dotyczące kontenera

Obraz kontenera musi spełniać następujące wymagania, aby działał na platformie hostowanego agenta.

Ważne

Platforma hostingu wymaga obrazów kontenerów x86_64 (linux/amd64). Jeśli tworzysz na Apple Silicon lub inne maszyny oparte na ARM, użyj docker build --platform linux/amd64 . , aby uniknąć tworzenia niezgodnego obrazu ARM.

Biblioteki protokołów

Hostowani agenci komunikują się z bramą usługi Foundry za pośrednictwem bibliotek protokołów. Wybierz protokół zgodny ze wzorcem interakcji agenta:

Protokół biblioteka Python biblioteka .NET Punkt końcowy Najlepsze dla
Odpowiedzi azure-ai-agentserver-responses Azure.AI.AgentServer.Responses /responses Konwersacyjne czatboty, przesyłanie strumieniowe, wielomianowy z historią zarządzaną przez platformę
Wywołania azure-ai-agentserver-invocations Azure.AI.AgentServer.Invocations /invocations Odbiorniki webhook, przetwarzanie poza dialogiem, asynchroniczne niestandardowe przepływy pracy
Wywołania (WebSocket) azure-ai-agentserver-invocations Azure.AI.AgentServer.Invocations /invocations_ws Dwukierunkowe przesyłanie strumieniowe: agenci głosowi w czasie rzeczywistym, multimedia interaktywne

Protokół WebSocket używa identyfikatora invocations_ws i jest dostarczany w tym samym azure-ai-agentserver-invocations pakiecie co trasa HTTP /invocations , więc jeden kontener może obsługiwać oba te elementy. Użyj go, gdy potrzebujesz trwałego, pełnodupleksowego przesyłania strumieniowego — na przykład wysyłania mikrofonu PCM do agenta i odbierania syntetyzowanego dźwięku z powrotem. W przypadku scenariuszy głosowych zobacz Tworzenie agenta głosowego z hostowanymi agentami.

Pojedynczy kontener może udostępniać wiele protokołów jednocześnie, deklarując je podczas tworzenia agenta — w polu protocols usługi azure.ai.agent w azure.yaml, w wywołaniu SDK lub w żądaniu REST API — oraz importując wymagane biblioteki. Użyj bibliotek protokołów w swoim istniejącym frameworku, niezależnie od tego, czy jest to Microsoft Agent Framework, LangChain, czy kod niestandardowy.

Biblioteka protokołów odpowiedzi

Biblioteki Python i .NET dla protokołu Responses implementują Azure AI Responses API. Zaimportuj pakiet i zaimplementuj procedurę obsługi odpowiedzi. Biblioteka obsługuje routing, przesyłanie strumieniowe za pomocą zdarzeń wysyłanych przez serwer (SSE), wykonywanie w tle, anulowanie, buforowanie i zarządzanie cyklem życia reakcji.

Zaimplementuj moduł obsługi

Moduł obsługi jest główną abstrakcją, którą implementujesz. Biblioteka wywołuje je dla każdego przychodzącego żądania i przekazuje zwrócone zdarzenia klientom za pośrednictwem SSE. W Python udekorujesz funkcję asynchronikową za pomocą polecenia @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}")

Automatyczne zarządzanie zdarzeniami i cyklem życia

Biblioteka automatycznie zarządza sekwencją zdarzeń — numerami sekwencji, indeksami danych wyjściowych i treści oraz identyfikatorami elementów — a także pełnym cyklem życia odpowiedzi, dzięki czemu nie musisz samodzielnie śledzić tego stanu. Każde zdarzenie generowane przez funkcję obsługującą odpowiada dokładnie jednemu zdarzeniu SSE, którym zarządza framework hosta.

Tryby przesyłania strumieniowego i w tle

  • Tryb przesyłania strumieniowego (ustawienie domyślne): zdarzenia SSE są dostarczane w czasie rzeczywistym do połączonego klienta.
  • Tryb tła: obsługujący działa do zakończenia bez połączonego klienta SSE. Zdarzenia są buforowane i dostępne do odtwarzania za pośrednictwem metody GET /responses/{id}.

Cykl życia odpowiedzi

Biblioteka koordynuje pełny cykl życia odpowiedzi: created ->in_progress ->completed (lub failed lub cancelled). Biblioteka zarządza również automatycznymi gwarancjami anulowania, obsługi błędów i zdarzeń terminalowych.

Bezpieczeństwo wątków

Instancje procedury obsługi mają zakres pojedynczego żądania, więc stan związany z danym żądaniem nie przenika między żądaniami. Biblioteka bezpiecznie obsługuje żądania współbieżne.

Aby zapoznać się z przykładami z możliwością uruchamiania, zobacz Python bring-your-own samples (Przykłady z możliwością uruchamiania).

Punkty końcowe zdrowotne

Biblioteki protokołów automatycznie uwidaczniają /readiness punkt końcowy na potrzeby kontroli kondycji platformy. Nie musisz implementować tego samodzielnie.

Portu

Kontenery obsługują ruch na porcie 8088 lokalnie. W środowisku produkcyjnym brama Foundry odpowiada za trasowanie — kontener nie musi wystawiać publicznego portu.

Zmienne środowiskowe wstrzykiwane przez platformę

Platforma hostowanego agenta automatycznie wprowadza zmienne środowiskowe do kontenera w czasie wykonywania. Kod może odczytywać te zmienne bez deklarowania ich w mapie env usługi azure.ai.agent w azure.yaml ani w ustawieniach zmiennych środowiskowych SDK i REST. Prefiks FOUNDRY_* jest zarezerwowany do użytku platformy.

Zmienna Cel
FOUNDRY_PROJECT_ENDPOINT Adres URL punktu końcowego projektu Foundry
FOUNDRY_PROJECT_ARM_ID Identyfikator zasobu ARM Projektu Foundry
FOUNDRY_AGENT_NAME Nazwa uruchomionego agenta
FOUNDRY_AGENT_VERSION Wersja uruchomionego agenta
FOUNDRY_AGENT_SESSION_ID Identyfikator sesji dla bieżącego żądania (tylko hostowane kontenery)
APPLICATIONINSIGHTS_CONNECTION_STRING Łańcuch połączenia usługi Application Insights na potrzeby telemetrii

Nie deklaruj ponownie w azure.yaml zmiennych wstrzykiwanych przez platformę — są ustawiane automatycznie.

Zmienne zadeklarowane przez Ciebie, takie jak MODEL_DEPLOYMENT_NAME lub punkty końcowe MCP przybornika, należy umieścić w mapie env usługi azure.ai.agent w azure.yaml lub w wywołaniu SDK create_version.

Ważne

Gdy wdrażasz hostowanego agenta do usługi Foundry Agent Service, platforma automatycznie wstrzykuje parametry połączenia usługi Application Insights do kontenera agenta jako zmienną środowiskową, co domyślnie włącza śledzenie OpenTelemetry. Aby wyświetlić rozproszone ślady, żądania i zależności, otwórz zasób usługi Application Insights aprowizowane podczas instalacji w portalu Azure i przejdź do obszaru Badanie > wyszukiwania transakcji lub wydajności. Użyj azd ai agent monitor do dzienników konsoli na żywo. Gdy usługa AppInsights jest włączona, ten projekt rejestruje ślady, aby ułatwić monitorowanie i ocenę interakcji na poziomie użytkownika z agentami. Członkowie projektu, którym przypisano rolę Czytelnik usługi Log Analytics w usłudze AppInsights, mogą wyświetlać dane śledzenia, które mogą zawierać dane osobowe i/lub zawartość klienta. Jeśli bazowe tabele usługi Log Analytics są chronione, członkowie muszą zamiast tego mieć rolę Privileged Monitoring Data Reader, aby wyświetlać te dane śledzenia. Sprawdź, jakie dane śledzenia są zbierane i kto może wyświetlać i używać tych danych. Mogą obowiązywać dodatkowe opłaty za usługę Azure Monitor App Insights. Dowiedz się więcej.

Odwołuj się do połączeń projektu w zmiennych środowiskowych

Zamiast umieszczać na stałe dane uwierzytelniające (klucze API, tokeny, punkty końcowe) w kodzie azure.yaml lub w obrazie, pobieraj je z połączenia z projektem Foundry przy uruchamianiu piaskownicy. Każda wartość zadeklarowana jako zmienna środowiskowa może być wyrażeniem z symbolem zastępczym, które platforma rozwiązuje, zanim kontener zostanie uruchomiony.

Składnia symbolu zastępczego

Symbol zastępczy ma postać ${{connections.<name>.<path>}}, gdzie <name> to nazwa zasobu połączenia (widoczna w portalu w sekcji Zarządzanie>Szczegóły projektu>Połączone zasoby) i <path> to jedna z następujących wartości:

Path Rozwiązuje problem
credentials.<field> Pole sekretu w połączeniu
target Właściwość połączenia target (na przykład adres URL punktu końcowego)
metadata.<field> Pole w obszarze połączenia metadata

Nazwa pola do użycia zależy od kategorii połączenia:

Kategoria połączenia Nazwa pola w placeholderze
ApiKey, AppInsights Zawsze key— na przykład credentials.key
CustomKeys Nazwa klucza podana podczas tworzenia połączenia — na przykład credentials.github_token

Przykład

Najpierw utwórz połączenie CustomKeys w projekcie zawierającym sekret. Zobacz Dodaj nowe połączenie w Microsoft Foundry. Następnie odwołaj się do niego z mapy env w usłudze azure.ai.agent w azure.yaml:

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

Podczas uruchamiania sandboxa Foundry rozwiązuje symbol zastępczy i wstrzykuje uzyskaną wartość jako zwykłą zmienną środowiskową. Kod odczytuje go jak każda inna zmienna środowiskowa:

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

Funkcja GET w wersji agenta zwraca tekst literału ${{...}} — rozpoznany wpis tajny nigdy nie jest powtarzany za pośrednictwem interfejsu API zarządzania.

Considerations

  • Utwórz połączenie przed wdrożeniem wersji. Jeśli w momencie uruchomienia środowiska sandbox brakuje połączenia lub pola, do którego się odwołano, symbol zastępczy nie zostaje rozpoznany, a zmienna pozostaje pusta.
  • Sekrety są tylko do zapisu. Funkcja GET w połączeniu zwraca wartość credentials: null. Sprawdź, czy problem został rozwiązany, odczytując zmienną środowiskową wewnątrz uruchomionego kontenera, a nie przez sprawdzanie połączenia.
  • Rejestruj CustomKeys nazwy pól samodzielnie. Interfejs API zarządzania nigdy nie powtarza ich z powrotem po utworzeniu. Trzymaj je obok źródła agenta (na przykład w szablonach IaC lub obok azure.yaml), aby później móc tworzyć symbole zastępcze bez zgadywania.
  • Foundry zarządza nazwą pomocniczego klucza tajnego. Podczas tworzenia połączenia usługa Foundry przechowuje wartość w usłudze Key Vault pod nazwą wybraną przez siebie — nie można odwołać się do istniejącego wpisu tajnego w usłudze Key Vault po nazwie. Aby dołączyć własne Key Vault jako magazyn kopii zapasowych, zobacz Konfigurowanie połączenia Key Vault.

Przygotuj i przetestuj agenta lokalnie

Przed wdrożeniem w narzędziu Foundry sprawdź, czy agent działa lokalnie przy użyciu biblioteki protokołów. Kontener obsługuje te same punkty końcowe lokalnie, co w środowisku produkcyjnym.

Testowanie protokołu Odpowiedzi

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

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

Testowanie protokołu wywołań

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

{
    "message": "Hello!"
}

Wdrażanie przy użyciu interfejsu wiersza polecenia dewelopera Azure lub programu VS Code

Interfejs wiersza polecenia Azure Developer CLI (azd) oraz zestaw Microsoft Foundry Toolkit for Visual Studio Code automatyzują cały cykl życia wdrażania: kompilowanie kontenera, wypychanie go do usługi Azure Container Registry, tworzenie wersji agenta i przypisywanie ról RBAC. Aby zapoznać się z przewodnikiem po raz pierwszy, zobacz Przewodnik Szybki start: tworzenie i wdrażanie hostowanego agenta.

Wdrażanie za pomocą jednego polecenia

Z katalogu projektu agenta aprowizuj infrastrukturę i wdróż w jednym kroku:

azd up

azd up łączy azd provision, które tworzy projekt Foundry, wdrożenie modelu, rejestr kontenerów, usługę Application Insights i tożsamość zarządzaną, z azd deploy. Używaj go w przypadku wdrożeń po raz pierwszy lub za każdym razem, gdy zmieniasz zarówno infrastrukturę, jak i kod agenta.

Wdrażanie tylko zmian kodu

Jeśli zasoby platformy Azure zostały już aprowizowane i trzeba tylko wdrożyć nową wersję agenta:

azd deploy

Podczas azd deploy, CLI:

  1. Tworzy obraz kontenera zdalnie w Azure Container Registry, więc nie potrzebujesz lokalnej platformy Docker.
  2. Wysyła obraz do rejestru.
  3. Tworzy hostowaną wersję agenta w usłudze Foundry Agent Service.
  4. Tworzy dedykowaną tożsamość agenta Microsoft Entra i przypisuje role RBAC, których agent potrzebuje do uzyskiwania dostępu do modeli i narzędzi.

Zarządzanie wersjami

Każdy azd deploy tworzy nową wersję agenta. CLI zachowuje wcześniejsze wersje. Domyślnie punkt końcowy jest zgodny z najnowszą wersją; przypięty punkt końcowy nadal obsługuje wybraną wersję, chyba że zaktualizujesz konfigurację routingu.

Aby zweryfikować wersję kandydującą, zanim zacznie obsługiwać ruch produkcyjny, przypnij produkcję przed wdrożeniem i jawnie promuj. Przejrzyj ustawienia punktu końcowego w konfiguracji azd, aby wdrożenie nie zastępowało tego numeru PIN.

Weryfikowanie wdrożenia

azd ai agent show

Dane wyjściowe obejmują nazwę agenta, wersję, protokoły, zasoby kontenera, zmienne środowiskowe i znacznik czasu tworzenia. Użyj --output table, aby wyświetlić widok podsumowania.

Lokalne tworzenie obrazów

Domyślnie azd kompiluje obrazy kontenerów zdalnie w usłudze Azure Container Registry. Aby budować obrazy lokalnie, ustaw remoteBuild: false w azure.yaml. Kompilacje lokalne wymagają programu Docker Desktop.

Aby sprawdzać prompty i odpowiedzi pod kątem zasad bezpieczeństwa treści, dodaj do agenta zabezpieczenie bezpieczeństwa treści.

Wdrażanie przy użyciu zestawu SDK Python

Użyj zestawu SDK, jeśli chcesz zarządzać wdrożeniami agentów bezpośrednio z Python kodu.

Dodatkowe wymagania wstępne

  • Python 3.10 lub nowszy

  • Obraz kontenera w Azure Container Registry

  • Rola zapisywania repozytorium usługi Container Registry lub AcrPush w rejestrze kontenerów (w celu wypychania obrazów)

  • zestaw SDK projektów sztucznej inteligencji Azure w wersji 2.3.0 lub nowszej

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

Tworzenie i przesyłanie obrazu kontenera

  1. Skompiluj obraz platformy Docker:

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

    Zobacz przykładowe pliki Dockerfile dla Python i C#.

  2. Prześlij do Azure Container Registry:

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

Wskazówka

Używaj unikatowych tagów obrazów zamiast :latest dla powtarzalnych wdrożeń.

Konfigurowanie uprawnień rejestru kontenerów

Udziel tożsamości zarządzanej projektu dostępu do pobierania obrazów.

  1. W portalu Azure przejdź do zasobu projektu Foundry.

  2. Wybierz Tożsamość i skopiuj identyfikator obiektu (podmiot) w obszarze Przypisane przez system.

  3. Przypisz rolę Czytelnik repozytorium rejestru kontenerów do tej tożsamości w twoim rejestrze kontenerów. Zobacz Azure Container Registry role i uprawnienia.

Tworzenie wersji hostowanego agenta

Podczas tworzenia wersji platforma automatycznie udostępnia agenta. Nie ma oddzielnego kroku początkowego. Platforma tworzy migawkę kontenera i przygotowuje agenta do obsługi żądań.

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="2.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}")

Aby uwidocznić oba protokoły, przekaż oba w pliku protocol_versions:

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

Kluczowe parametry:

Parametr Opis
agent_name Unikatowa nazwa (alfanumeryczne z łącznikami, maksymalnie 63 znaki)
container_configuration.image Pełny URL obrazu w Azure Container Registry z tagiem
cpu Alokacja procesora CPU (na przykład "1")
memory Alokacja pamięci (na przykład "2Gi")
protocol_versions Protokoły, które kontener udostępnia (responses, invocations, lub oba)

Aby ustawić czas bezczynności obliczeń sesji, zobacz Zarządzanie bezczynnością sesji.

Sonduj stan wersji

Po utworzeniu wersji monitoruj, aż stan zmieni się na active przed wywołaniem agenta. Konfigurowanie zwykle trwa mniej niż minutę w zależności od rozmiaru obrazu.

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)

Wartości stanu wersji:

Stan Opis
creating Aprowizacja infrastruktury w toku
active Agent jest gotowy do obsługi żądań
failed Aprowizacja nie powiodła się — sprawdź pole error, aby uzyskać szczegółowe informacje
deleting Wersja jest czyszczona
deleted Wersja została w pełni usunięta

Wywoływanie agenta

Po osiągnięciu active stanu wersji użyj polecenia get_openai_client , aby utworzyć klienta OpenAI powiązanego z punktem końcowym agenta.

Dla protokołu Odpowiedzi :

# 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)

W przypadku protokołu Invocations bezpośrednio wywołaj punkt końcowy wywołań.

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())

Aby zobaczyć bardziej kompletne przykłady, zobacz Przykłady hostowanych agentów.

Wdrażanie przy użyciu zestawu SDK .NET

Użyj zestawu SDK, aby zarządzać wdrożeniami agentów bezpośrednio z .NET kodu.

Dodatkowe wymagania wstępne

  • zestaw SDK platformy .NET 10 lub nowszy

  • Obraz kontenera w Azure Container Registry

  • Rola zapisywania repozytorium usługi Container Registry lub AcrPush w rejestrze kontenerów (w celu wypychania obrazów)

  • Zestaw SDK projektów sztucznej inteligencji Azure. Zainstaluj pakiet wstępnego wydania dla interfejsów API hostowanych agentów:

    dotnet add package Azure.AI.Projects --prerelease
    dotnet add package Azure.AI.Extensions.OpenAI
    dotnet add package Azure.Identity
    

Tworzenie i przesyłanie obrazu kontenera

  1. Skompiluj obraz platformy Docker:

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

    Zobacz przykładowe pliki Dockerfile dla Python i C#.

  2. Prześlij do Azure Container Registry:

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

Wskazówka

Używaj unikatowych tagów obrazów zamiast :latest dla powtarzalnych wdrożeń.

Konfigurowanie uprawnień rejestru kontenerów

Udziel tożsamości zarządzanej projektu dostępu do pobierania obrazów.

  1. W portalu Azure przejdź do zasobu projektu Foundry.

  2. Wybierz Tożsamość i skopiuj identyfikator obiektu (podmiot) w obszarze Przypisane przez system.

  3. Przypisz rolę Czytelnik repozytorium rejestru kontenerów do tej tożsamości w twoim rejestrze kontenerów. Zobacz Azure Container Registry role i uprawnienia.

Tworzenie wersji hostowanego agenta

Podczas tworzenia wersji platforma automatycznie udostępnia agenta. Nie ma oddzielnego kroku początkowego. Platforma tworzy migawkę kontenera i przygotowuje agenta do obsługi żądań.

using Azure.AI.Projects;
using Azure.AI.Projects.Agents;
using Azure.Identity;

#pragma warning disable AAIP001

// Format: "https://resource_name.services.ai.azure.com/api/projects/project_name"
var projectEndpoint = "your_project_endpoint";

AIProjectClient projectClient = new(new Uri(projectEndpoint), new DefaultAzureCredential());
var agentsClient = projectClient.AgentAdministrationClient;

HostedAgentDefinition definition = new(cpu: "1", memory: "2Gi")
{
    Versions =
    {
        new ProtocolVersionRecord(ProjectsAgentProtocol.Responses, "2.0.0"),
    },
    ContainerConfiguration = new ContainerConfiguration("your-registry.azurecr.io/your-image:tag"),
};
definition.EnvironmentVariables.Add("MODEL_DEPLOYMENT_NAME", "gpt-4o");

ProjectsAgentVersion agent = agentsClient.CreateAgentVersion(
    "my-agent", new ProjectsAgentVersionCreationOptions(definition));
Console.WriteLine($"Agent created: {agent.Name}, version: {agent.Version}");

Aby uwidocznić więcej niż jeden protokół, dodaj więcej ProtocolVersionRecord wpisów:

Versions =
{
    new ProtocolVersionRecord(ProjectsAgentProtocol.Responses, "2.0.0"),
    new ProtocolVersionRecord(ProjectsAgentProtocol.Invocations, "2.0.0"),
    new ProtocolVersionRecord(ProjectsAgentProtocol.InvocationsWs, "2.0.0"),
},

Kluczowe parametry:

Parametr Opis
agentName Unikatowa nazwa (alfanumeryczne z łącznikami, maksymalnie 63 znaki)
ContainerConfiguration Pełny URL obrazu w Azure Container Registry z tagiem
cpu Alokacja procesora CPU (na przykład "1")
memory Alokacja pamięci (na przykład "2Gi")
Versions Protokoły, które kontener udostępnia (Responses, Invocations, lub oba)

Aby ustawić czas bezczynności obliczeń sesji, zobacz Zarządzanie bezczynnością sesji.

Sonduj stan wersji

Po utworzeniu wersji monitoruj, aż stan zmieni się na Active przed wywołaniem agenta. Konfigurowanie zwykle trwa mniej niż minutę w zależności od rozmiaru obrazu.

while (true)
{
    ProjectsAgentVersion versionInfo = agentsClient.GetAgentVersion("my-agent", agent.Version);
    Console.WriteLine($"Status: {versionInfo.Status}");

    if (versionInfo.Status == AgentVersionStatus.Active)
    {
        Console.WriteLine("Agent is ready!");
        break;
    }

    if (versionInfo.Status == AgentVersionStatus.Failed)
    {
        Console.WriteLine("Provisioning failed.");
        break;
    }

    Thread.Sleep(TimeSpan.FromSeconds(5));
}

Wartości stanu wersji:

Stan Opis
Creating Aprowizacja infrastruktury w toku
Active Agent jest gotowy do obsługi żądań
Failed Aprowizacja nie powiodła się — sprawdź pole Error, aby uzyskać szczegółowe informacje
Deleting Wersja jest czyszczona
Deleted Wersja została w pełni usunięta

Wywoływanie agenta

Gdy wersja osiągnie stan Active, użyj GetProjectResponsesClientForAgentEndpoint, aby utworzyć klienta Responses połączonego z punktem końcowym agenta.

Dla protokołu Odpowiedzi :

using Azure.AI.Extensions.OpenAI;
using OpenAI.Responses;

#pragma warning disable OPENAI001

ProjectResponsesClient responsesClient = projectClient.ProjectOpenAIClient
    .GetProjectResponsesClientForAgentEndpoint("my-agent");

ResponseResult response = responsesClient.CreateResponse("Hello! What can you do?");
Console.WriteLine(response.GetOutputText());

W przypadku protokołu Invocations bezpośrednio wywołaj punkt końcowy wywołań.

using System.Net.Http.Json;
using Azure.Core;

var token = new DefaultAzureCredential()
    .GetToken(new TokenRequestContext(["https://ai.azure.com/.default"]))
    .Token;

using HttpClient http = new();
http.DefaultRequestHeaders.Authorization = new("Bearer", token);

var url = $"{projectEndpoint}/agents/my-agent/endpoint/protocols/invocations?api-version=v1";
HttpResponseMessage result = await http.PostAsJsonAsync(url, new { message = "Process this task" });
Console.WriteLine(await result.Content.ReadAsStringAsync());

Aby uzyskać więcej kompletnych przykładów, zobacz przykłady agentów hostowanych w języku C#.

Wdrażanie przy użyciu zestawu SDK języka JavaScript/TypeScript

Użyj zestawu SDK, jeśli chcesz zarządzać wdrożeniami agentów bezpośrednio z Node.js kodu. Kod wywołujący SDK działa w Node.js, ale sam obraz kontenera nadal uruchamia kod agenta w Pythonie lub .NET, zbudowany przy użyciu bibliotek protokołów Responses lub Invocations — nie ma hostowanego środowiska uruchomieniowego agenta dla Node.js.

Dodatkowe wymagania wstępne

  • Node.js 22 lub nowszym

  • Obraz kontenera w Azure Container Registry

  • Rola zapisywania repozytorium usługi Container Registry lub AcrPush w rejestrze kontenerów (w celu wypychania obrazów)

  • Pakiety @azure/ai-projects i @azure/identity

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

Przed rozpoczęciem skompiluj i prześlij obraz kontenera do usługi Azure Container Registry (zobacz przykładowe polecenia platformy Docker na karcie Python) oraz przypisz zarządzanej tożsamości projektu rolę Container Registry Repository Reader w rejestrze.

Tworzenie wersji hostowanego agenta

Podczas tworzenia wersji platforma automatycznie udostępnia agenta. Nie ma oddzielnego kroku początkowego. Platforma tworzy migawkę kontenera i przygotowuje agenta do obsługi żądań.

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: "2.0.0" }],
  environment_variables: { MODEL_DEPLOYMENT_NAME: "gpt-5-mini" },
});

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

Aby uwidocznić oba protokoły, przekaż oba w pliku protocol_versions:

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

Sonduj stan wersji

Po utworzeniu wersji monitoruj, aż stan zmieni się na active przed wywołaniem agenta. Konfigurowanie zwykle trwa mniej niż minutę w zależności od rozmiaru obrazu.

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);
}

Skieruj punkt końcowy agenta i wywołaj go

Skieruj punkt końcowy agenta do utworzonej wersji, a następnie przypisz klienta OpenAI do punktu końcowego.

Dla protokołu Odpowiedzi :

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);

W przypadku protokołu Invocations bezpośrednio wywołaj punkt końcowy wywołań.

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());

Dokumentacja: AIProjectClient

Wdrażanie przy użyciu interfejsu API REST

Użyj interfejsu API REST do bezpośrednich wdrożeń opartych na protokole HTTP lub podczas integracji z niestandardowymi narzędziami.

Przed rozpoczęciem skompiluj i wypchnij obraz kontenera do usługi Azure Container Registry oraz przyznaj zarządzanej tożsamości projektu rolę Container Registry Repository Reader w rejestrze.

Konfigurowanie zmiennych

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)

Tworzenie agenta

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": "2.0.0"}
      ],
      "environment_variables": {
        "MODEL_DEPLOYMENT_NAME": "gpt-5-mini"
      }
    }
  }'

Utworzenie agenta powoduje również utworzenie wersji 1 i uruchomienie aprowizacji.

Aby ustawić czas bezczynności obliczeń sesji, zobacz Zarządzanie bezczynnością sesji.

Aby sprawdzać prompty i odpowiedzi pod kątem zasad bezpieczeństwa treści, dołącz obiekt rai_config do obiektu definition. Zobacz Dodawanie bariery bezpieczeństwa zawartości do hostowanego agenta.

Sonduj stan wersji

Odpytuj punkt końcowy wersji, aż status ma wartość 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

Wywoływanie agenta

Użyj dedykowanego punktu końcowego agenta do wysyłania żądań. Ustaw "stream": true do odbierania zdarzeń wysyłanych przez serwer.

Protokół odpowiedzi:

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
  }'

Protokół wywołań:

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"
  }'

Tworzenie nowej wersji

Wdróż zaktualizowany kod lub konfigurację, tworząc nową wersję:

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": "2.0.0"}
      ],
      "environment_variables": {
        "MODEL_DEPLOYMENT_NAME": "gpt-5-mini"
      }
    }
  }'

Czyszczenie zasobów

Aby zapobiec naliczaniu opłat, wyczyść zasoby po zakończeniu. Platforma zwalnia zasoby obliczeniowe agenta po upływie skonfigurowanego limitu czasu bezczynności, który domyślnie wynosi 15 minut, dzięki czemu nie ma kosztów, gdy agent nie obsługuje żądań.

czyszczenie Azure Developer CLI

azd down

Oczyszczanie zestawu SDK

Usuń jedną wersję:

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

Możesz też usunąć całego agenta i wszystkie jego wersje. Użyj force=True, aby kaskadowo usunąć aktywne sesje, na przykład zaraz po wywołaniu agenta; bez niego wywołanie kończy się błędem konfliktu, gdy aktywne są sesje:

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

Oczyszczanie zestawu SDK

Usuń jedną wersję:

agentsClient.DeleteAgentVersion("my-agent", agent.Version);

Możesz też usunąć całego agenta i wszystkie jego wersje. Użyj force: true, aby kaskadowo usunąć wszystkie aktywne sesje, na przykład bezpośrednio po wywołaniu agenta. Bez niego wywołanie kończy się niepowodzeniem z powodu błędu powodującego konflikt, gdy sesje są aktywne:

agentsClient.DeleteAgent("my-agent", force: true);

Oczyszczanie zestawu SDK

Usuń jedną wersję:

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

Możesz też usunąć całego agenta i wszystkie jego wersje:

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

Dokumentacja: AIProjectClient

Oczyszczanie interfejsu API REST

Usuń jedną wersję:

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

Możesz też usunąć całego agenta:

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

Ostrzeżenie

Usunięcie agenta powoduje usunięcie wszystkich jego wersji i zakończenie aktywnych sesji. Tej akcji nie można cofnąć.

Rozwiązywanie problemów

Błędy provisioningu pojawiają się na polach error.code i error.message obiektu wersji. Sprawdź stan wersji po utworzeniu, aby zidentyfikować problemy.

Kod błędu Kod HTTP Rozwiązanie
image_pull_failed 400 Sprawdź adres URI obrazu. Upewnij się, że tożsamość zarządzana projektu ma czytnik repozytorium usługi Container Registry w usłudze ACR i czy stan zasad rejestru azureADAuthenticationAsArmPolicy to enabled
SubscriptionIsNotRegistered 400 Rejestrowanie dostawcy subskrypcji
InvalidAcrPullCredentials 401 Naprawa tożsamości zarządzanej lub kontroli dostępu opartej na rolach (RBAC)
UnauthorizedAcrPull 403 Podaj poprawne poświadczenia lub tożsamość
AcrImageNotFound 404 Popraw nazwę obrazu/tag lub opublikuj obraz
RegistryNotFound 400/404 Naprawianie rejestru DNS lub dostępności sieci

W przypadku błędów 5xx skontaktuj się z pomocą techniczną Microsoft.

Aby uzyskać szczegółowe wymagania dotyczące kontroli dostępu opartej na rolach oraz rozwiązywanie problemów z uprawnieniami, zobacz Referencje dotyczące uprawnień hostowanego agenta.

Następne kroki