项目概述

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;为现代应用提供了一种全新的存储解决…