跳轉到內容

實作課程 07 — 總結

目標: 將你建置的內容整合起來,整理你的機器,選擇一個合理的下一步。

時間: 10分鐘

你覆蓋了什麼

實作課程 能力
01 安裝相依套件,執行FastAPI應用程式,並進行基本驗證SDK範例
02 跟蹤串流聊天回合並發現模型在執行時
03 替換靜態上下文為Python @define_tool 工具
04 觀察工作階段事件生命週期和完成訊號
05 永續保存並恢復SDK工作階段跨程序重啟
06 將MCP伺服器連線到擴充套件代理以外部工具

可選 extra-* 現在,實驗位於主SDK路徑之外。使用它們時 當您需要CLI自訂代理程式、治理掛鉤或FastAPI/SQLModel擴充套件 實踐,但它們不是SDK序列所需的。

值得保留的想法

  1. 嵌入勝過聊天。 SDK將代理變成您的應用程式的一部分,受您的身份驗證、記錄記錄和部署管道的影響 在Python中,這始於 CopilotClient(),通常為 async with CopilotClient() as client:; 如果您手動建置它,呼叫 await client.start() 在建立工作階段之前

  2. 發現能力;不要硬編碼它們。 模型來自 await client.list_models(),因此讀者不需要所有模型的預覽模型。

  3. 工作階段建立是關鍵字驅動的。 您看到的呼叫形狀是 await client.create_session(model=..., streaming=..., system_message=..., tools=..., mcp_servers=..., on_permission_request=...). 這些關鍵字引數是聊天、工具、MCP和權限的設定表面。

  4. 工具勝過上下文填充。 @define_tool 讓模型在需要時才獲取所需的內容,而不是在每次輪次前都預載入猜測,即使這些猜測是無效的。Python自訂工具 需要 on_permission_request ,否則呼叫會被拒絕;.NET 範例不需要此類處理程式。

  5. 事件僅採用推送方式。 session.on(handler) 會註冊回呼並傳回一個用於取消訂閱的可呼叫物件。由於沒有非同步迭代器,因此範例共享 IdleWaitersdk_labs/_common.py 以等待空閒或錯誤狀態。

  6. Python 使用單一的事件資料類別。 .NET 會對事件子類進行模式比對;Python 則提供一個 SessionEvent ,並根據 evt.type, a SessionEventType 列舉進行分支處理。因此,範例會檢查 evt.type is SessionEventType.SESSION_IDLE.

  7. 傳送訊息和等待完成是兩個獨立的選擇。 使用 await session.send(prompt) 以便自行觀察事件。僅需讓 SDK 等待完成時,請使用 await session.send_and_wait(prompt, timeout=...)

  8. 工作階段讓代理程式具備可遷移性。 resume_session 加上 get_session_metadata 可在程序重啟後繼續存在。示範應用基於瀏覽器 localStorage 的歷史記錄雖然方便,卻無法跨裝置遷移。

  9. MCP 擴充套件了代理程式的能力範圍。 Python 使用普通字典設定 MCP 伺服器,例如 mcp_servers={"microsoft.docs.mcp": {"type": "http", ...}} ,無需將每項整合都固化到應用中。與 .NET 不同,Python 不需要 GHCP001 來抑制權限 API。

清理

停止服務(Ctrl+C 在終端中按下),如果服務以分離模式執行,則執行:

lsof -ti:5070        # prints a PID if still listening
kill <PID>

刪除本地產物:

rm -f src/AgentOrchestrator-python/retail.db*   # SQLite DB + WAL files
rm -f logs/*                                    # if you ran the shared CLI extras

retail.db 首次執行時,它會在Python工作目錄中建立,並且會被git忽略。⚠️ 如果在macOS上仍然開啟的檔案,移除命令可能會成功,但服務會重新建立它。首先停止服務,然後移除 artefact。

git status --short

預期:沒有輸出,或者只是你故意編輯的lab檔案。如果你想丟棄本地的lab工作並傳回到一個乾淨的檢查點,請參閱:

git status
git checkout -- .        # discards uncommitted changes — irreversible

檢查你的理解

  1. 為什麼Python的track使用 async with CopilotClient()?
  2. 為什麼樣品需要 IdleWaiter 而不是 async for evt in session?
  3. 如果一個Python自訂工具被註冊了,但沒有使用上下文管理器,那麼應該呼叫`await client.start()`和`await client.stop()`自己。 on_permission_request?
  4. 在Python中,你檢查的事件欄位是什麼?以及什麼SDK呼叫可以證明在重啟後可以恢復工作階段?
答案 1. 它可靠地啟動和停止使用者端。如果你不使用上下文管理器,呼叫`await client.start()`和`await client.stop()`自己。

下一步去哪裡

方向 從這裡開始
重新執行一個聚焦的SDK範例 sdk_labs
深入理解深度程式碼 示範
參考疑難排解和架構 延伸主題
建置自己的代理應用程式 Copilot SDK存放庫
將外部工具擴充套件Copilot Model Context Protocol

進一步的想法

  • 將一個樣品推廣到應用中。 移動一個 sdk_labs 命令新增到一個真實的API 端點,並新增使用者可見的進度。
  • 在伺服器端儲存工作階段。 將瀏覽器的localStorage替換為 SQLite-backed session metadata,以便歷史記錄在裝置之間生存。
  • 新增一個第二個MCP伺服器。 將憑證從源中移除,記錄所需的環境變數,並證明工具在執行時可用。
  • 加強可觀測性。 記錄今天你忽略的事件型別,以便生產除錯有足夠的上下文,而無需儲存完整的提示。

✅ 最終檢查點

  • [x] 七個 SDK 實驗全部完成
  • [x] 服務停止,本地 artefacts 清理完畢
  • [x] git status --short 是否乾淨,或者只有意因除外的實驗編輯殘留
  • [x] 你可以回答上面的四個問題