從原始碼部署託管代理

本文將說明如何在 Foundry Agent Service 中,從Python或.NET原始碼部署 Hosted agent,而無需建置或推送容器映像。 你上傳你的程式碼 .zip(以及可選擇一併上傳相依項目),Agent Service 會直接執行它,或是在雲端為你建置相依項目。

Tip

大多數情境下,部署時可使用 Azure Developer CLI (azd) 或 Foundry Toolkit for VS Code。 這些工具會替你完成繁瑣工作:打包原始碼、上傳原始碼、輪詢 active,並自動設定角色型存取控制。 要開始,請依照 快速入門操作:部署你的第一個託管代理 ,並在提示部署方法時選擇 程式碼 (或原始 碼(ZIP 上傳))。

當你需要以程式方式部署原始碼代理程式時,請使用本文中的 SDK 與 REST 程序——無論是在您自己的應用程式中使用 Python SDK 或 .NET SDK 的,或直接透過 REST API 進行自訂工具、語言無關的自動化,或與現有的持續交付系統整合。 在本文中,您會完成下列工作:

  • 選擇相依性解析模式,並將原始碼打包。
  • 建立代理,等待它到達 active,然後呼叫它。
  • 更新、查看版本、下載及串流已部署代理程式的記錄。

如果您需要完全控制執行階段映像,或已經有可正常運作的 Dockerfile,請使用以容器為基礎的途徑:部署託管代理程式。

如果你使用像 GitHub Copilot 這樣的程式代理程式來打包和部署原始碼,Microsoft Foundry 技能可以幫助你準備專案並遵循所需的 azdSDK 或 REST 步驟。

先決條件

  • pip 使用 Python 3.13 或更新版本,在本機將原始碼打包。

  • azure-ai-projects 2.2.0 版或更新版本及 azure-identity 套件。

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

支援的執行環境

code_configuration.runtime代理人定義中的欄位接受以下值。 選擇與 zip 檔中二進位檔案相符的執行階段:若是 Python,請選擇 Linux x86_64 wheel;若是 .NET,請選擇您的TargetFramework輸出的dotnet publish。

語言 執行時間值
Python python_3_13、python_3_14
.NET dotnet_10

語言版本支援政策

代理服務執行階段包含針對 code_configuration.runtime 的每個值所建置的平台容器映像。 為了讓您的部署代理程式獲得完整支援,Foundry 會將託管代理語言支援與每種語言的終止支援對齊。 語言版本的支援將於社群終止支援日期結束。 Microsoft 可能會在平台限制(例如基底映像)有此要求時,提前淘汰 code_configuration.runtime 值。

有關上游支援結束時程,請參見:

退休階段

在語言生命週期終止日期後,您仍可建立、更新及執行使用已淘汰之執行階段值的託管 Agent。 然而,這些 Agent 在您設定目前的code_configuration.runtime值並重新部署,把它們升級至受支援的執行階段之前,將不符合獲得支援、新功能或安全性修補程式的條件。

所需的權限

你需要在專案範圍內具備 Foundry Project Manager 角色,才能部署代管代理程式。 此角色授與在資料平面建立及更新代理程式的權限,並可在必要時為平台所建立的代理程式身分識別建立角色指派。 有關權限的詳細說明,請參閱 Hosted agent permissions reference。

Important

Foundry RBAC 角色最近已重新命名。 Foundry 用戶、Foundry 擁有者、Foundry Account Owner 以及 Foundry Project Manager 先前分別被稱為 Azure AI 使用者、Azure AI 擁有者、Azure AI 帳戶擁有者及 Azure AI Project 管理者。 在更名期間,你可能還會在某些地方看到之前的名字。角色 ID 與核心權限不會因命名而改變。

你的代理是以平台指派的管理身份運作,與使用者身份分開。 此身份預設可透過專案端點及會話儲存存取模型推論。 如果是外部資源 (例如,自有的 Azure 儲存體),手動將 RBAC 角色指派到 Agent 的 Microsoft Entra ID。 欲了解更多資訊,請參閱「 預設值之外的代理存取」。

部署生命週期

每次原始碼部署都遵循相同的順序: 套件 -> 建立或更新 -> 輪詢直到 active -> 調用。 原始碼路徑在代理程式定義中使用 code_configuration。 基於影像的路徑則改用 container_configuration。 這兩個選項在單一版本中是互斥的。

選擇最適合你工作流程的路徑。 如果你不確定,可以先從 Azure Developer CLI 或 VS Code 開始——這是大多數客戶推薦的路徑。

路徑 最適合用於 封裝
Azure 開發者 CLI 或 VS Code 大多數部署,包括首次部署及最快速的內部迴圈。 Tooling 會幫你建置並上傳壓縮檔。
Python SDK 從 Python 應用程式或自動化進行程式化部署。 你建立 ZIP 檔;SDK 會將其上傳。
.NET SDK 從 .NET 應用程式或自動化進行程式化部署。 SDK 會幫你壓縮一個資料夾。
JavaScript/TypeScript SDK 從 Node.js 應用程式進行程式化部署或自動化。 部署Python或.NET原始碼;沒有 Node.js 託管的執行環境。 你建立 ZIP 檔;SDK 會將其上傳。
REST API 客製化工具、語言無關自動化與光碟系統。 你建立 ZIP 檔並傳送 multipart 請求。

選擇如何解決相依關係

開始之前,請為 code_configuration.dependency_resolution 選擇一個值。 這個選項會影響你要放入 ZIP 檔中的內容。

價值觀 行為 何時使用
remote_build 代理服務會在配置過程中安裝 requirements.txt(Python)的相依性,或在配置期間還原專案檔案(.NET)。 你想要的是小規模的上傳和最簡單的內迴圈。 建議首次使用者使用。
bundled ZIP 檔會直接照原樣執行。 您會在 packages/ (Python) 或dotnet publish輸出 (.NET) 中運送預先建置的 Linux 相依性。 您需要可重現的建置、您的相依性是私人的或僅提供 wheels,或者您的專案無法在伺服器端乾淨還原。

關於捆綁模式,請參考「 手動打包壓縮包 」以取得本地建置指令。

私有虛擬網路的防火牆需求

如果你用私有虛擬網路保護專案,請在部署前更新網路政策,允許對以下端點進行外出連線。

所有原始碼部署都需要對外存取權限:

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

使用 Foundry 主機函式庫的代理程式碼(例如 azure-ai-agentserver-core 或 agent-framework-foundry-hosting)也會從代理傳送遙測資料。 允許這些端點,以免追蹤資料遭到捨棄:

  • agent365.svc.cloud.microsoft (TCP 443):Agent 365 可觀測性匯出,當已為你的 Foundry 資源啟用 Agent 365 資料收集時。 如果你封鎖它,代理程式會繼續執行,但其追蹤資料不會匯出至 Agent 365。 要停止此流量,請停用 Agent 365 的資料收集。 欲了解更多資訊,請參閱「配置 Microsoft Foundry 的 Agent 365 資料收集」。
  • 當您的專案具有 Application Insights 連線時,需要使用列於防火牆允許清單中的 Application Insights 端點。

關於網路設定,請參見 「在虛擬網路中部署託管代理」。

使用 Azure Developer CLI 或 VS Code 部署

Azure Developer CLI(azd)和 Foundry Toolkit for VS Code 自動化完整的原始碼部署生命週期——它們會將原始碼打包成壓縮檔,計算 SHA-256,上傳,輪詢 active,並為你設定基於角色的存取控制。 這些工具是大多數客戶推薦的路徑,也是最快的內迴路。

欲了解逐步流程,請參閱 快速入門:部署你的第一個託管代理。 當快速入門要求部署方法時,選擇 程式碼 (或原始 碼(ZIP 上傳))。

選擇原始碼部署

當你進行互動式執行 azd ai agent init 時,工具會提示你選擇部署模式。 選擇程式碼,以 ZIP 檔案上傳的方式從原始碼部署,而不是建構容器映像檔。 程式碼部署是 Python 和 .NET 託管代理的預設模式。 VS Code 的 Foundry 工具包也會以同樣方式提示你部署方法。

若要非互動式選擇原始碼部署,例如在 CI/CD 管線中,請傳遞 --deploy-mode code。 此模式需要 --runtime 和 --entry-point,並接受選用的 --dep-resolution 值:remote_build(預設值)或 bundled:

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

初始化後,azd將原始碼部署設定寫入codeConfigurationazure.ai.agent服務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

執行 azd up 配置並部署。 只有當你想建置或參考容器映像時才使用 --deploy-mode container 。

當你需要從自己的應用程式以程式化方式部署或整合現有工具時,請使用以下章節的 SDK 或 REST 路徑。

從原始程式碼部署

選擇你的語言或介面。 每個分頁都經歷相同的生命週期:建立代理程式、輪詢直到它到達 active、呼叫代理,然後下載已部署的程式碼。

使用 Python SDK 從您自己的應用程式或自動化中部署原始碼代理程式。 你自己編譯 zip,然後把它的位元組和 SHA-256 傳給 SDK,SDK 會上傳,並提供和 REST API 相同的建立、輪詢、呼叫和下載操作。 程式碼部署需要 azure-ai-projects 版本 2.2.0 或更新版本。

建立 ZIP 檔

Python SDK 會上傳一個你自己建立的 zip。 請使用如 手動封裝 zip 檔 中所述的相同配置與相依性解析規則。 最小的 remote_build 有效載荷是一個扁平的 ZIP 壓縮檔,其根目錄下包含 main.py 和 requirements.txt。

建立代理人

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

在 Invocations 協定中,將 protocol_versions 項目設為 ProtocolVersionRecord(protocol="invocations", version="2.0.0")。 對於 Invocations(WebSocket)協定,請使用 ProtocolVersionRecord(protocol="invocations_ws", version="2.0.0")。 對於 bundled 模式,請設定 dependency_resolution="bundled",並在 ZIP 檔中包含預先建構的相依項目。 欲了解更多資訊,請參閱 在本機建構 Linux 相依性。

輪詢以啟用

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)

如需完整的狀態值清單,以及在失敗時如何讀取 物件,請參閱 error。

召喚代理人

當版本達到 active後,將 OpenAI 客戶端綁定到代理端點並呼叫它。 此範例使用回應協定:

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)

對於 Invocations 協定,直接用承載標記呼叫 invoke 端點,如 Invoke the agent 所示。

下載已部署的壓縮檔

請下載壓縮檔,並比較其 SHA-256 與你上傳的數值,確認實際部署的內容:

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

完整可執行範例請參見 Python hosted-agent 樣本。

手動打包 ZIP 檔案

如果你使用 azd,請跳過此部分——azd 它會幫你建立 zip。 如果你使用 REST API、切換為 bundled 相依性解析,或需要完全控制上傳內容,請閱讀本文。

Zip 必須在根部保持扁平—不能有頂層封裝程式資料夾。

選取您代理人語言對應的分頁。

Python 佈局(遠端建置模式)

該服務會在雲端從 requirements.txt 安裝相依性。

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

Python 版面配置(套裝模式)

您會在packages/中運送預先建置的 Linux 相依性。

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

於本機建置 Linux 相依性 (綁定、 Python)

使用 manylinux2014_x86_64 平台標籤,這樣 pip 就能下載 Linux 輪子,即使是從 Windows 或 macOS 也一樣。

巴什

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:強制執行 wheels (沒有原始碼建置)。 --python-version 必須與代理程式定義中的 runtime 值相符。

警告

會導致 session_creation_failed 或 ModuleNotFoundError 的常見包裝錯誤:

  • 把原始碼封裝在資料夾裡(my-agent/main.py 而不是 main.py 根目錄)。
  • 在 .whl 中包含原始 packages/ 檔案,而不是已擷取的模組。
  • 將Windows二進位檔(.pyd、.dll)捆綁成 Linux 執行環境。

限制

極限 價值觀
最大壓縮壓縮包大小(多段上傳) 250 MB

如需了解受支援的 cpu 與 memory 組合,請參閱 沙盒大小。

Troubleshooting

癥狀 可能的原因 修復
401 Unauthorized 缺少或錯誤的範圍權杖 使用--resource https://ai.azure.com取得權杖。
403 Forbidden 來電者在專案中缺乏基於角色的存取控制(Role Based 存取控制) 在專案範圍授與 Foundry Agent Consumer (僅限叫用),或授與 Foundry User (也可進行開發)。
建立上的409 conflict (Agent '<name>' already exists) 代理人名稱已經存在 使用更新(POST /agents/{name}),或選擇一個新名字。
建立或更新時出現 400 bad_request (CPU and Memory must be specified as a valid resource tier) cpu / memory 不是支援的等級之一 將 cpu 和 memory 設定為 沙箱大小中的有效配對。
叫用上的400 bad_request (Agent version is still being provisioned) 新版本正在部署中,正在替換現行版本 先輪詢版本 status 直到 active,然後再試一次。
叫用上的424 session_not_ready 容器已啟動,但 /readiness 未在逾時期限內傳回 HTTP 200 使用 :logstream 串流日誌,修正就緒探測或啟動錯誤,然後重新部署。
DELETE Agent 上的409 conflict (Agent has active sessions) 開放工作階段區塊刪除 等到工作階段進入閒置時,或附加&force=true以串聯刪除工作階段。
版本卡在creating中 (> 10分鐘,遠端建置) 伺服器建置失敗或無法解決 requirements.txt 切換到 dependency_resolution: bundled,並在本機預先建置。
私有虛擬網路部署失敗 防火牆會阻擋必要的出站端點 允許私人虛擬網路的防火牆需求中列出的端點,然後重新部署。
版本轉換至 failed 錯誤的壓縮檔排版、語法錯誤,或是(remote_build) 還原/編譯失敗 先讀取版本的 error 物件——error.code 分類故障,error.message 包含底層的還原或編譯錯誤行(Python 的 pip 與 .NET 的 NuGet)及故障排除連結。 確認 資料夾結構。 僅在容器啟動後使用 :logstream。
ModuleNotFoundError 於執行時 packages/ 缺少,包含原始的 .whl 檔案,或有 Windows 二進位檔 使用 pip install --target packages/ --platform manylinux2014_x86_64 --only-binary=:all: 重建。
409 AgentNotCodeBased 下載中 Agent 是映像型 使用 基於容器的部署文件。

清理資源

如果您從快速入門使用 azd 建立了專案 Scaffold,請從專案根目錄執行 azd down 以移除整個已佈建的環境。

要刪除你用 SDK 或 REST API 部署的代理程式,請使用下方匹配路徑。

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

警告

刪除 Agent 會移除其所有版本並終止作用中的工作階段。 這個行動無法撤銷。

下一步