Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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ą:
- Kompilowanie i wypychanie — spakuj kod agenta do obrazu kontenera i wypchnij go do Azure Container Registry.
- Utwórz wersję agenta — zarejestruj obraz w usłudze Foundry Agent Service. Platforma zapewnia infrastrukturę i tworzy dedykowaną tożsamość dla agenta Entra.
-
Sprawdzaj stan — poczekaj, aż stan wersji osiągnie
active. - Wywołaj — wysyłaj żądania do dedykowanego punktu końcowego agenta.
Wymagania wstępne
- Projekt Microsoft Foundry.
- Kod agenta przy użyciu obsługiwanej platformy.
- Program Docker Desktop zainstalowany na potrzeby tworzenia kontenerów lokalnych.
- Azure CLI w wersji 2.80 lub nowszej.
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
CustomKeysnazwy 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 obokazure.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:
- Tworzy obraz kontenera zdalnie w Azure Container Registry, więc nie potrzebujesz lokalnej platformy Docker.
- Wysyła obraz do rejestru.
- Tworzy hostowaną wersję agenta w usłudze Foundry Agent Service.
- 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
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
Skompiluj obraz platformy Docker:
docker build --platform linux/amd64 -t myagent:v1 .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.
W portalu Azure przejdź do zasobu projektu Foundry.
Wybierz Tożsamość i skopiuj identyfikator obiektu (podmiot) w obszarze Przypisane przez system.
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
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
Skompiluj obraz platformy Docker:
docker build --platform linux/amd64 -t myagent:v1 .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.
W portalu Azure przejdź do zasobu projektu Foundry.
Wybierz Tożsamość i skopiuj identyfikator obiektu (podmiot) w obszarze Przypisane przez system.
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
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-projectsi@azure/identitynpm 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
Powiązana zawartość
- Co to są hostowani agenci?
- Dodawanie bariery bezpieczeństwa zawartości do hostowanego agenta
- Pojęcia dotyczące tożsamości agenta
- Aplikacje agentów
- dokumentacja Azure Container Registry