議遠程智能體接入:從零到一的智能體互通實戰(zhàn)指南)
ADK A2A 協(xié)議遠程智能體接入從零到一的智能體互通實戰(zhàn)指南【免費下載鏈接】adk-docsAn open-source, code-first toolkit for building, evaluating, and deploying sophisticated AI agents with flexibility and control.項目地址: https://gitcode.com/GitHub_Trending/ad/adk-docs如果你有多個 ADK 智能體分布在不同的進程里需要互相調(diào)用A2A 協(xié)議就是標準的打通方式。本文用三步從暴露到消費跑通鏈路并解決端口沖突、agent 卡片缺失這類高頻坑。先跑起來Quick Start倉庫里有一個現(xiàn)成的 Go 示例 examples/go/a2a_basic直接啟動一個遠端 A2A 服務export GOOGLE_API_KEY你的模型Key cd examples/go/a2a_basic/remote_a2a/check_prime_agent go run main.go # 啟動 A2A 服務端口 8001 curl http://localhost:8001/.well-known/agent-card.json跑完你會看到go run打出Starting A2A prime checker server on port 8001而最后那條curl會返回一份 JSON 智能體卡片里面帶name、skills、url三個字段??ㄆ苋〉骄驼f明這個智能體已經(jīng)開門營業(yè)可以被其他智能體調(diào)用了。Python 版本則是pip install google-adk[a2a]后用to_a2a()加uvicorn起服務下文實操部分會展開。它到底在干什么A2A 原理拆解問題你的客服智能體跑在自己的服務里庫存智能體是另一個團隊維護、跑在另一個進程里。直接 import 對方的代碼對方的任何接口改動都會讓你跟著崩而且根本拿不到人家的源碼。方案給庫存智能體加一層 A2A Server把它我是誰、會干什么寫成一份固定地址可訪問的智能體卡片agent card調(diào)用方只需要知道這張卡片的 URL。機制ADK 把這件事拆成兩個組件。服務提供方用to_a2a()把現(xiàn)成的 Agent 包成一個 Starlette 應用自動生成智能體卡片——從你的 Agent 配置里提取 description、工具和技能掛在.well-known/agent-card.json這個約定地址下消費方用RemoteA2aAgent指向卡片 URLADK 會自動拉取卡片、完成網(wǎng)絡請求、事件序列化和格式轉(zhuǎn)換。對你的 root agent 來說它只是sub_agents列表里多了一個成員。智能體卡片就像門店的招牌加營業(yè)時間顧客不需要知道倉庫內(nèi)部怎么運轉(zhuǎn)照著招牌上的地址下單就行。順帶一提ADK 的 A2A 集成還內(nèi)置了三個能力透傳模型的推理軌跡Reasoning、追蹤超長耗時工具調(diào)用避免超時、在智能體之間傳遞文件產(chǎn)物Artifacts。選型對比——什么時候用 A2A什么時候別用維度本地子智能體sub_agentsRemoteA2aAgentA2A自寫 REST API tool 函數(shù)部署復雜度最低同一進程中遠端需單獨跑 A2A 服務中高接口需自己定義和維護延遲內(nèi)存內(nèi)調(diào)用最低多一跳網(wǎng)絡毫秒到秒級與 A2A 相當?shù)b權(quán)錯誤處理全靠自己適用團隊規(guī)模單人或同一團隊多團隊、跨組織協(xié)作小規(guī)模、固定對接兩三個服務語言要求與宿主同語言跨語言Python/Go/Java/Kotlin 均支持任意語言但接口是私有約定幾個判斷句如果你的協(xié)作只是把一個應用內(nèi)的任務拆成模塊直接寫本地子智能體如果遠端智能體由別的團隊維護或用不同語言編寫比如 Python 主智能體接 Java 庫存服務選 A2A如果只是臨時對接一個現(xiàn)成 HTTP 服務、對方又不打算改造成 A2A先用 tool 函數(shù)包一層 REST等對接面變大再遷移。明確不適合的情況高頻低延遲的內(nèi)部調(diào)用、子智能體需要直接讀寫主智能體內(nèi)存狀態(tài)的場景——序列化和網(wǎng)絡開銷會讓 A2A 變成負資產(chǎn)。動手實踐從 A2A 暴露到消費Step 1用 to_a2a() 暴露智能體from google.adk.agents import Agent from google.adk.a2a.utils.agent_to_a2a import to_a2a inventory_agent Agent( modelgemini-flash-latest, nameinventory_agent, instruction你是庫存查詢智能體查詢庫存時必須調(diào)用 query_stock 工具。, tools[query_stock], ) a2a_app to_a2a(inventory_agent, port8001) # port 只是寫進卡片URL真正監(jiān)聽端口由 uvicorn 決定這一步做了什么把普通 Agent 變成可被網(wǎng)絡訪問的 A2A 應用智能體卡片由 ADK 自動生成不用手寫。Step 2起服務并驗證卡片uvicorn my_app:inventory_agent_module --host localhost --port 8001 # 注意 --port 要和 to_a2a 的 port 一致 curl http://localhost:8001/.well-known/agent-card.json預期輸出節(jié)選{name: inventory_agent, url: http://localhost:8001, description: 你是庫存查詢智能體……, version: 0.0.1, ...}卡片能取到、url字段指向正確地址服務端才算就緒。Step 3用 RemoteA2aAgent 消費from google.adk.agents import Agent from google.adk.agents.remote_a2a_agent import RemoteA2aAgent remote_inventory RemoteA2aAgent( nameinventory_agent, description遠程庫存查詢智能體, agent_cardhttp://localhost:8001/.well-known/agent-card.json, # 填 Step 2 驗證過的卡片地址 ) root_agent Agent( modelgemini-flash-latest, nameservice_root, sub_agents[remote_inventory], # 和本地子智能體寫法完全一樣 )遠程智能體和本地智能體在代碼里長得一模一樣root agent 用自然語言決定何時把任務委托給它剩下的網(wǎng)絡細節(jié) ADK 全包了。除了to_a2a()還有一種暴露方式是adk api_server --a2a它可以直接和adk web搭配調(diào)試且能指向一個含多個智能體的父目錄但要求每個智能體文件夾里手動寫好agent.json卡片細節(jié)見 docs/a2a/quickstart-consuming.md。一個完整的業(yè)務場景場景電商客服智能體要回答這個 SKU 還有貨嗎而庫存能力在另一個團隊維護的庫存服務里。Before沒有 A2A客服團隊沒有標準接口可用只能求庫存團隊導一個內(nèi)部 REST API自己寫鑒權(quán)、自己解析私有 JSON庫存服務接口字段一改客服側(cè)必須跟著發(fā)版兩邊靠口頭約定的契約耦合出問題時各說各話After接入 A2A庫存智能體用to_a2a()暴露會干什么、收什么格式全寫在卡片里這就是正式契約客服側(cè)只加一個RemoteA2aAgent對話里自然語言即可觸發(fā)庫存查詢庫存服務升級只改服務端和卡片客服側(cè)代碼不動調(diào)試時把adk web指向消費方智能體左側(cè) Trace/Events 面板能看到遠程調(diào)用事件的完整鏈路和調(diào)本地工具的體驗一致。踩坑與注意事項現(xiàn)象RemoteA2aAgent拉卡片失敗或調(diào)用永遠 404。原因to_a2a(port8001)只是把 8001 寫進卡片 URL它本身不監(jiān)聽端口uvicorn --port起在別的端口時卡片就指向了不存在的地址。解法port參數(shù)必須和uvicorn --port保持一致起完服務先curl卡片確認再連消費端?,F(xiàn)象adk api_server --a2a服務正常啟動但對方找不到你的智能體。原因這條命令只暴露包含agent.json文件的智能體文件夾沒有卡片等于不存在。解法在智能體目錄補上agent.json至少含name、url、skills并核對卡片里url與服務的實際路徑前綴一致。現(xiàn)象起調(diào)試界面時端口被占用服務起不來。原因adk web默認占 8000 端口示例里的 A2A 服務在 8001如果你把 A2A 也改成 8000 就會撞車。解法保持約定8000 留給調(diào)試 UIA2A 服務從 8001 起排多智能體時逐個遞增。一個to_a2a()讓你的智能體上線一個RemoteA2aAgent讓對方把它當本地子智能體用這就是 A2A 的核心鏈路。Python 暴露與消費的完整流程見 docs/a2a/quickstart-exposing.md 和 docs/a2a/quickstart-consuming.mdGo、Java、Kotlin 版本指南匯總在 docs/a2a/index.md??蛇\行的雙端示例在 examples/go/a2a_basic/流式模式下遇到消息重復可以再看 docs/a2a/a2a-extension.md?!久赓M下載鏈接】adk-docsAn open-source, code-first toolkit for building, evaluating, and deploying sophisticated AI agents with flexibility and control.項目地址: https://gitcode.com/GitHub_Trending/ad/adk-docs創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考