基于A2A和ADK的內容規劃代理

項目概述

Content Planner Agent 是一個基于 Google Agent Development Kit (ADK) 和 Python A2A SDK 構建的智能內容規劃代理。該代理能夠根據高層次的內容描述,創建詳細的內容大綱。

什么是A2A Protocol

A2A Protocol(Agent2Agent 協議)是一種專為 AI 智能體設計的開放標準協議。它的核心目標是實現不同平臺、不同技術棧下的智能體之間的互操作性,讓它們能夠像“同事”一樣協作完成任務,無論背后用的是什么技術。

技術棧

  • Python: 3.10+
  • UV: Python 包管理器
  • Google ADK: Google Agent Development Kit
  • A2A SDK: Agent-to-Agent 通信協議
  • Gemini 2.5 Flash: 大語言模型
  • Google Search: 搜索工具
  • Uvicorn: ASGI 服務器

前置要求

1. 環境準備

確保您的系統已安裝以下軟件:

# 檢查 Python 版本 (需要 3.10+)
python --version# 安裝 UV 包管理器 (如果尚未安裝)
curl -LsSf https://astral.sh/uv/install.sh | sh
# 或使用 pip
pip install uv

2. API 密鑰

您需要獲取 Google API 密鑰以使用 Gemini 模型和 Google Search 功能:

  1. 訪問 Google AI Studio
  2. 創建新的 API 密鑰
  3. 保存密鑰以備后用

項目結構

samples/python/agents/content_planner/
├── __init__.py                 # 包初始化文件
├── __main__.py                # 主入口文件
├── agent_executor.py          # 代理執行器
├── content_planner_agent.py   # 內容規劃代理定義
├── pyproject.toml            # 項目配置文件
├── requirements.txt          # 依賴列表
├── .env.example             # 環境變量示例
└── README.md               # 項目說明

快速開始

步驟 1: 克隆項目并導航到目錄

# 假設您已經有 a2a-samples 項目
git clone https://github.com/a2aproject/a2a-samples.git
cd a2a-samples/samples/python/agents/content_planner

步驟 2: 配置環境變量

# 復制環境變量示例文件
cp .env.example .env# 編輯 .env 文件,添加您的 Google API 密鑰
echo "GOOGLE_API_KEY=your_actual_api_key_here" > .env

步驟 3: 安裝依賴并運行代理

# 使用 UV 安裝依賴并運行項目
uv run .# 注意:
"gradio>=5.30.0" 在當前 agent 中,是不需要的。

默認情況下,代理將在 http://localhost:10001 啟動。

步驟 4: 測試代理 (新終端窗口)

# 導航到 CLI 客戶端目錄
cd samples/python/hosts/cli# 連接到代理并發送消息
uv run . --agent http://localhost:10001

步驟 5: 與代理交互

在 CLI 客戶端中,您可以發送如下消息:

Create an outline for a short, upbeat, and encouraging X post about learning Java

代碼詳解

1. 主入口文件 (__main__.py)

@click.command()
@click.option("--host", default="localhost")
@click.option("--port", default=10001)
def main(host, port):# Agent card (metadata)agent_card = AgentCard(name='Content Planner Agent',description=content_planner_agent.description,url=f'http://{host}:{port}',version="1.0.0",defaultInputModes=["text", "text/plain"],defaultOutputModes=["text", "text/plain"],capabilities=AgentCapabilities(streaming=True),skills=[AgentSkill(id="content_planner",name="Creates outlines for content",description="Creates outlines for content given a high-level description of the content",tags=["plan", "outline"],examples=["Create an outline for a short, upbeat, and encouraging X post about learning Java",],)],)

關鍵組件說明:

  • AgentCard: 代理的元數據卡片,包含名稱、描述、URL、版本等信息
  • AgentSkill: 定義代理的技能,包括 ID、名稱、描述、標簽和示例
  • AgentCapabilities: 代理的能力配置,如是否支持流式輸出

2. 代理定義 (content_planner_agent.py)

from google.adk.agents import Agent
from google.adk.tools import google_searchroot_agent = Agent(name="content_planner_agent",model="gemini-2.5-flash",description=("Planning agent that creates a detailed and logical outline for a piece of content,""given a high-level description."),instruction=("You are an expert content planner. Your task is to create a detailed and logical outline for a piece""of content, given a high-level description."),tools=[google_search],
)

關鍵特性:

  • 模型: 使用 Gemini 2.5 Flash 作為底層 LLM
  • 工具: 集成 Google Search 工具,可以搜索相關信息
  • 指令: 明確定義代理的角色和任務

3. 代理執行器 (agent_executor.py)

class ADKAgentExecutor(AgentExecutor):def __init__(self, agent, status_message="Processing request...", artifact_name="response"):self.agent = agentself.status_message = status_messageself.artifact_name = artifact_nameself.runner = Runner(app_name=agent.name,agent=agent,artifact_service=InMemoryArtifactService(),session_service=InMemorySessionService(),memory_service=InMemoryMemoryService(),)

核心功能:

  • Runner: ADK 運行器,管理代理的執行
  • 服務組件:
    • ArtifactService: 管理生成的工件
    • SessionService: 管理會話狀態
    • MemoryService: 管理對話記憶

系統架構流程圖

ADK 組件
InMemoryArtifactService
InMemorySessionService
InMemoryMemoryService
用戶請求
A2A CLI 客戶端
HTTP 請求
A2A Starlette 應用
DefaultRequestHandler
ADKAgentExecutor
ADK Runner
Content Planner Agent
Gemini 2.5 Flash 模型
Google Search 工具
生成內容大綱
響應工件
任務完成
返回結果給用戶

詳細執行流程

1. 初始化階段

__main__.pycontent_planner_agentADKAgentExecutorA2AStarletteApplication加載代理配置創建執行器實例創建 A2A 服務器啟動 Uvicorn 服務器__main__.pycontent_planner_agentADKAgentExecutorA2AStarletteApplication

2. 請求處理階段

CLI 客戶端A2A 服務器DefaultRequestHandlerADKAgentExecutorADK RunnerGemini 2.5 FlashGoogle Search發送內容規劃請求路由請求執行代理任務啟動 ADK 運行器調用 Gemini 模型執行 Google 搜索返回生成內容返回搜索結果合并結果返回工件完成任務返回內容大綱CLI 客戶端A2A 服務器DefaultRequestHandlerADKAgentExecutorADK RunnerGemini 2.5 FlashGoogle Search

高級配置

自定義端口

# 在指定端口啟動代理
uv run . --port=8080

自定義主機

# 在指定主機和端口啟動
uv run . --host=0.0.0.0 --port=8080

環境變量配置

.env 文件中可以配置更多選項:

GOOGLE_API_KEY=your_api_key_here
# 可以添加其他配置項
LOG_LEVEL=INFO

故障排除

常見問題

  1. API 密鑰錯誤

    錯誤: Invalid API key
    解決: 檢查 .env 文件中的 GOOGLE_API_KEY 是否正確
    
  2. 端口占用

    錯誤: Port 10001 is already in use
    解決: 使用 --port 參數指定其他端口
    
  3. 依賴安裝失敗

    錯誤: Failed to install dependencies
    解決: 確保 UV 已正確安裝,嘗試 uv sync
    

擴展和定制

添加新工具

content_planner_agent.py 中添加新工具:

from google.adk.tools import google_search, web_searchroot_agent = Agent(# ... 其他配置tools=[google_search, web_search],  # 添加更多工具
)

修改模型

root_agent = Agent(name="content_planner_agent",model="gemini-1.5-pro",  # 使用不同的模型# ... 其他配置
)

自定義指令

root_agent = Agent(# ... 其他配置instruction=("You are a specialized content planner for technical documentation. ""Create detailed outlines that include code examples and best practices."),
)

最佳實踐

  1. 安全性:

    • 始終將 API 密鑰存儲在環境變量中
    • 不要將 .env 文件提交到版本控制
  2. 性能優化:

    • 使用適當的模型大小
    • 合理配置內存和會話服務
  3. 錯誤處理:

    • 實現適當的錯誤處理和日志記錄
    • 提供有意義的錯誤消息
  4. 測試:

    • 編寫單元測試和集成測試
    • 使用不同的輸入測試代理響應

總結

Content Planner Agent 展示了如何使用 Google ADK 和 A2A 協議構建智能代理。通過本指南,您應該能夠:

  • 理解項目的整體架構
  • 成功運行和測試代理
  • 根據需要進行定制和擴展
  • 解決常見問題

這個代理可以作為構建更復雜多代理系統的基礎,例如完整的內容創作工作流。

更多A2A Protocol 示例

  • A2A Protocol
  • A2A Multi-Agent Example: Number Guessing Game
  • A2A MCP AG2 Intelligent Agent Example
  • A2A + CrewAI + OpenRouter Chart Generation Agent Tutorial
  • A2A JS Sample: Movie Agent
  • A2A Python Sample: Github Agent
  • A2A Sample: Travel Planner OpenRouter
  • A2A Java Sample
  • A2A Samples: Hello World Agent
  • A2A Sample Methods and JSON Responses
  • LlamaIndex File Chat Workflow with A2A Protocol

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/bicheng/96213.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96213.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96213.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux-條件變量

文章目錄條件變量概述條件變量的優缺點條件變量相關函數pthread_cond_init函數pthread_cond_destroy函數pthread_cond_wait函數pthread_cond_signal函數測試生產者和消費者模型條件變量 概述 與互斥鎖不同,條件變量是用來等待而不是用來上鎖的,條件變量…

[硬件電路-166]:Multisim - SPICE與Verilog語言的區別

SPICE與Verilog語言在電子設計領域中扮演不同角色,SPICE是電路仿真語言,用于精確模擬電路行為;Verilog是硬件描述語言,用于描述數字電路的結構和行為。以下是兩者的詳細區別:一、核心定位與用途SPICE:電路仿…

玩轉Docker | 使用Docker部署Umbrel操作系統

玩轉Docker | 使用Docker部署Umbrel操作系統 前言 一、 Umbrel 介紹 Umbrel簡介 Umbrel主要特點 二、系統要求 環境要求 環境檢查 Docker版本檢查 檢查操作系統版本 三、部署Umbrel服務 下載Umbrel鏡像 編輯部署文件 創建容器 檢查容器狀態 檢查服務端口 安全設置 四、訪問Umbr…

Flink Task線程處理模型:Mailbox

Task的線程 和 MailboxProcessor 的綁定executingThread 是 Task 類(StreamTask 的父類)在構造時創建的物理線程。MailboxProcessor 是 StreamTask 用來處理異步事件和驅動其主要處理邏輯(processInput)的核心組件。它們之間的綁定…

OpenCV 銀行卡號識別

目錄 一、項目原理與核心技術 二、環境準備與工具包導入 1. 環境依賴 2. 工具包導入 三、自定義工具類 myutils.py 實現 四、主程序核心流程(銀行卡識別.py) 1. 命令行參數設置 2. 銀行卡類型映射 3. 輔助函數:圖像展示 五、步驟 1…

計算機二級Python

一.靜態語言和腳本語言高級語言根據計算機執行機制的不同分為兩類:靜態語言和腳本語言靜態語言的核心特征:變量的類型在編譯時(寫代碼時)就必須確定并固定下來,即在使用一個變量前必須顯式地聲明它地類型一旦聲明&…

Mybatis Log Plugin打印日志,會導致CPU升高卡死

原因 大量日志輸出:MyBatis Log Plugin 會打印大量的 SQL 日志,包括 SQL 語句及其參數。如果項目中 SQL 查詢頻繁且復雜,日志量會非常大,導致 CPU 使用率升高,甚至卡死。 日志級別設置不當:如果將日志級別設置為 DEBUG 或 TRACE,MyBatis 會輸出非常詳細的日志信息,這會…

鴻蒙:深色模式適配和淺色模式的切換

前言: 有些時候我們需要對應用進行深色模式的適配處理,并且在不需要的時候切換到淺色狀態,下面和大家一起照著官方文檔來學習。 下面是官方文檔的鏈接: https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-dark-…

Coze源碼分析-資源庫-刪除插件-后端源碼-數據訪問和基礎設施層

5. 數據訪問層 5.1 倉儲接口定義 插件倉儲接口 文件位置:backend/domain/plugin/repository/plugin.go type PluginRepository interface {// DeleteDraftPlugin 刪除插件草稿DeleteDraftPlugin(ctx context.Context, pluginID int64) error// DeleteAPPAllPlugins …

案例一: 對基礎選擇器的使用【網頁盒子】

【1】樣例&#xff1a;首先&#xff0c;觀察到&#xff0c;幾個元素豎著排列的&#xff0c;所以使用塊級元素&#xff0c;而不是行內元素。【2】代碼演示<head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,…

爬蟲項目優化:如何用 Redis 實現 “斷點續爬”?避免重復采集電商數據

在電商數據采集場景中&#xff0c;爬蟲常因網絡波動、服務器重啟、IP 封禁等問題中斷。若缺乏斷點續爬機制&#xff0c;重啟后需從頭開始&#xff0c;不僅浪費帶寬與時間&#xff0c;還可能因重復采集導致數據冗余。Redis 憑借其高性能、原子操作、多樣數據結構的特性&#xff…

決策樹概念與原理

決策樹簡介決策樹是一種樹形結構樹中每個內部節點表示一個特征上的判斷&#xff0c;每個分支代表一個判斷結果的輸出&#xff0c;每個葉子節點代表一種分類結果(僅舉例無其他意義或隱喻)就像一個女孩去相親&#xff0c;那么首先詢問是否大于30&#xff0c;大于則不見&#xff0…

SQL面試題及詳細答案150道(116-135) --- 高級查詢與函數篇

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,MySQL,Linux… 。 前后端面試題-專欄總目錄 文章目錄 一、本文面試題目錄 116. 如何使用CASE語句實…

VeRL:強化學習與大模型訓練的高效融合框架

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 1 概述&#xff1a;VeRL的起源與核心價值 VeRL&#xff08;Versatile…

2. 計算機系統基礎知識

1 計算機系統概述 計算機系統 (Computer System) 是指用于數據管理的計算機硬件、軟件及網絡組成的系統。 計算機系統可劃分為硬件(子系統)和軟件(子系統)兩部分。硬件由機械、電子元器件、磁介質和光介質等物理實體構成&#xff0c;例如處理器(含運算單元和控制單元)、存儲器、…

國產EtherCAT從站芯片FCE1353與N32G435 MCU功能板測試流程

上期推薦&#xff0c;我們在前期介紹了FCE1353與國民N32G435 MCU開發板的基本情況&#xff0c;本期主要介紹此開發板的測試流程&#xff0c;以便用戶拿到此板做功能驗證、兼容性測試、可靠性測試時更加便捷地提高開發驗證效率。01概述FCE1353_N32G435RBL7_GPIO_V1 開發板主要通…

向日葵亮點16功能解析:被控端“快速解鎖”

向日葵16重磅上線&#xff0c;本次更新新增了諸多實用功能&#xff0c;提升遠控效率&#xff0c;實現應用融合突破設備邊界&#xff0c;同時全面提升遠控性能&#xff0c;操作更順滑、畫質更清晰&#xff01;無論遠程辦公、設計、IT運維、開發還是游戲娛樂&#xff0c;向日葵16…

深度解析:IService 與 ServiceImpl 的區別

在使用 MyBatis-Plus 開發業務邏輯時&#xff0c;IService 和 ServiceImpl 是經常遇到的兩個核心類。很多初學者會疑惑&#xff1a; 為什么要定義 IService&#xff1f;ServiceImpl 又解決了什么問題&#xff1f;它們之間到底有什么區別與聯系&#xff1f; 本文將結合源碼與應用…

YOLO12 改進、魔改|通道自注意力卷積塊CSA-ConvBlock,通過動態建模特征圖通道間的依賴關系,優化通道權重分配,在強化有效特征、抑制冗余信息

在分割的研究中&#xff0c;傳統卷積神經網絡&#xff08;CNN&#xff09;存在兩大關鍵問題&#xff1a;一是池化操作雖能降低計算復雜度&#xff0c;卻會導致特征圖中有效空間信息丟失&#xff0c;尤其太陽暗條這類不規則、精細結構的特征易被削弱&#xff1b;二是傳統 CNN 對…

JuiceFS分布式文件系統

對象存儲雖然具備極高的擴展性和成本優勢&#xff0c;卻缺乏對POSIX語義的支持&#xff0c;導致許多應用無法直接使用。正是在這樣的背景下&#xff0c;JuiceFS 應運而生——它巧妙地融合了對象存儲的彈性與傳統文件系統的易用性&#xff0c;為現代應用提供了一種全新的存儲解決…