跳轉到內容

實作課程 01 — 環境設定

目標: 使用 Agent HQ 的示範 app 作為 SDK 工作階段、串流和範例的可執行載體,設定 Copilot SDK 的 Python 學習路線

時間: ~15 分鐘

必要條件

你只需要為實驗使用一個實作的學習路線。此頁面使用的是 .NET 學習路線下的 Python 同層目錄 src/AgentOrchestrator-python/; .NET 學習路線仍保持在 src/AgentOrchestrator/.

安裝這些在開始之前:

  • Python 3.11 或更高版本
  • uv 用於相依套件管理和命令執行
  • GitHub Copilot CLI,並已登入
  • git, curl,以及 jq

⚠️ 你 需要為此學習路線安裝 .NET SDK。Python SDK 包為 github-copilot-sdk 版本 1.0.9,匯入名稱為 copilot,專案在其中固定了其版本: pyproject.toml.

第1步 — 複製並檢查

git clone https://github.com/vicperdana/aigenius-copilotsdk-s5ep2.git
cd aigenius-copilotsdk-s5ep2

Python 實作與 .NET 實作位於同一目錄中:

src/AgentOrchestrator-python/

當您想獲取完整的地圖時,請閱讀Python學習路線概述。

src/AgentOrchestrator-python/README.md

它與.NET應用功能相匹配:相同的API合同、相同的種子資料、相同的故意程式碼氣味和相同的Copilot SDK學習路徑。

⚠️ 請選擇一個學習路線。 您可以不安裝兩者,同時執行它們,因為埠不重疊:.NET使用5050和5051,而Python使用 5070 API和UI。

第2步 — 恢復相依套件

從存放庫根目錄:

cd src/AgentOrchestrator-python
uv sync

uv sync 建立虛擬環境並安裝應用相依套件、開發相依套件、FastAPI、SQLModel、pytest、ruff以及Copilot SDK。

⚠️ 請稍後執行Python命令。 src/AgentOrchestrator-python 除非命令明確改變您所在的目錄,否則沒有解決方案檔案和沒有根級別的Python包執行。

第3步 — 執行測試

uv run pytest

進行緊湊的CI風格檢查:

uv run pytest -q

預期:30個測試透過。一個驗證執行產生了:

..............................                                           [100%]
30 passed in 0.61s

這是14個領域測試和12個MCP伺服器測試——兩者匹配.NET套件——再加上4個僅保護瀏覽器/API請求形狀的Python測試。

記得那個數字。稍後實驗30個測試會要求你不破壞這些。

第4步 — 執行程式碼檢查器

uv run ruff check .

預期結果:

All checks passed!

linter 設定檔案位於 pyproject.toml.

第5步 — 啟動API和UI

在你的第一個終端:

uv run uvicorn app.main:app --port 5070

開啟 http://localhost:5070. 你應該看到空的聊天 UI:

Retail Analytics Assistant 空狀態的聊天 UI:一個黑暗的頭部,模型下拉選單設定為 Claude Haiku 4.5,歡迎標題,五個建議的零售問題,以及底部的輸入訊息。

⚠️ 與.NET 學習路線不同,這裡沒有 單獨的 UI 伺服器. FastAPI 從同一個程序的埠 5070 服務

💡 為什麼不是 5060 而是 5070? Chrome、Edge、Firefox拒絕開啟埠5060 —這是SIP埠,位於瀏覽器的封鎖埠清單中,因此頁面失敗 ERR_UNSAFE_PORT 儘管 curl 但工作正常。如果更改埠,請避免5060、5061和6000。

在編輯-重新整理開發中,新增 --reload:

uv run uvicorn app.main:app --port 5070 --reload

⚠️ 埠已佔用? 一個來自之前執行的伺服器可能仍然在監聽5070上並提供過時的程式碼。在重新啟動之前停止監聽5070的程序。

第6步 — 驗證健康端點

在第二個終端,仍然來自 src/AgentOrchestrator-python:

curl http://localhost:5070/api/chat/health

預期結果:

{"status":"healthy","service":"CopilotChat","availableModels":["claude-haiku-4.5","gpt-4.1","gpt-5","claude-sonnet-4.5","claude-opus-4.5","gemini-2.5-pro"]}

這個端點不呼叫模型。它證明應用程式是執行的,並顯示如果即時模型探索失敗時使用的靜態備用目錄。

第7步 — 驗證REST API

Python API保持與.NET相同的駝峰式JSON合同,這意味著 customerId, productCategory,以及 topFeatures,而不是Python內部的 customer_id, product_category,以及 top_features.

執行:

curl -s http://localhost:5070/api/transactions | jq 'length'
curl -s http://localhost:5070/api/segments | jq 'length'
curl http://localhost:5070/api/segments/predict/C003

預期事實:

  • GET /api/transactions 傳回10行
  • GET /api/segments 傳回4行
  • 預測呼叫傳回:
{"customerId":"C003","predictedSegment":"High Value","confidence":0.89,"topFeatures":["high_total_spend","multi_category","total_1700"]}

camelCase合同在 app/models.py 所以 curl 範例在兩個學習路線上都有效。

第8步 — 驗證串流

這證明了Copilot SDK已連線,CLI已登入,API可以串流模型輸出到瀏覽器或終端。

curl -sN -X POST http://localhost:5070/api/chat/stream \
  -H 'Content-Type: application/json' \
  -d '{"prompt":"Reply with exactly: streaming works","model":"claude-haiku-4.5"}'

預期流的形狀:

data: {"content": "streaming works"}

data: [DONE]

三件事很重要:每個事件都以 data:, 每個事件後面跟著一個空行,流的結束以 data: [DONE].

⚠️ 欄位是 prompt,而不是 message一個未識別的鍵被無聲地忽略,因此一個拼寫錯誤會傳送一個空的提示詞並傳回一個通用的問候,而不是一個錯誤。

⚠️ 如果你看到 data: {"error": "..."} 相反,伺服器已到達SDK但SDK無法完成請求。常見原因可能是未在Copilot CLI中籤入或選擇您帳戶無法使用的模型。

第9步 — 驗證SDK實驗範例

每個後續的Python SDK實驗都使用 sdk_labs 模組。現在執行一個真實的範例:

uv run python -m sdk_labs tools

預期結果:

== Lab 03: tools ==

Model: claude-haiku-4.5
Prompt: How much has customer C003 spent in total?

  [tool] get_customer_total(C003) -> $1,700.00

Assistant: Customer C003 has spent a total of **$1,700.00** across 2 transactions.

命令排程器位於 sdk_labs/__main__.py. 後來的實驗使用 uv run python -m sdk_labs events, uv run python -m sdk_labs sessions,以及 uv run python -m sdk_labs mcp.

第10步 — 試用UI

回到瀏覽器中,在 http://localhost:5070, 開啟 模型 下拉選單併傳送一條訊息以檢視串流渲染路徑。

💡 請求體使用 prompt匹配 ChatRequest一個早期修訂 已釋出 message 在這裡;因為Pydantic會丟棄未知鍵,UI串流了一個回覆到一個空的提示詞,沒有任何錯誤聲張。 tests/test_chat_contract.py 現在斷言欄位 app.js 傳送的是欄位,API讀取。

✅ 檢查點

你應該現在有:

  • [x] Python相依套件恢復 uv sync
  • [x] 30/30測試透過
  • [x] Ruff透過
  • [x] API和UI在埠5070上執行
  • [x] REST端點傳回種子駝峰資料
  • [x] 從真實模型串流的即時回應
  • 可執行載體上的SDK樣品 uv run python -m sdk_labs ...

💡 延伸挑戰

查詢模型端點並計數您的帳戶提供:

curl -s http://localhost:5070/api/chat/models | jq 'length'

然後檢查在 app/routers/chat.py的備用目錄中。