# EasyA2A - 快速将Agent包装为A2A协议服务
🚀 **一行代码,让你的Agent支持A2A协议!**
EasyA2A是一个强大而简洁的Python库,让你能够快速将任何LangChain Agent包装成符合A2A协议的服务。采用创新的三步式API设计,大幅简化配置过程,让Agent部署变得前所未有的简单。
## ✨ 核心特性
- 🎯 **三步式API** - 初始化 → 链式配置 → 一键启动
- ⚡ **极简使用** - 一行代码即可启动A2A服务
- 🔧 **灵活配置** - 支持技能、能力、提供商等全方位配置
- 🛠️ **深度集成** - 完美支持LangChain生态
- 📡 **自动生成** - 自动创建符合标准的Agent Card
- 🌐 **即插即用** - 无需复杂配置,开箱即用
## 🚀 快速开始
### 安装
```bash
pip install easya2a
```
### 最简使用(一行代码)
```python
from easya2a import A2AAgentWrapper
# 一行代码启动A2A服务
A2AAgentWrapper.set_up(your_agent, "智能助手", "AI助手服务").run_a2a()
```
### 完整示例
```python
from easya2a import A2AAgentWrapper
# 三步式API使用
A2AAgentWrapper.set_up(
agent=your_langchain_agent,
name="天气助手",
description="智能天气查询服务"
).add_skill(
"weather_query", "天气查询",
description="查询全球城市天气信息",
examples=["北京天气怎么样?", "上海会下雨吗?"]
).add_skill(
"weather_advice", "穿衣建议",
examples=["今天穿什么?", "需要带伞吗?"]
).set_provider(
"Weather AI Services"
).enable_streaming(
).run_a2a(port=10010)
```
## 🎯 三步式API设计
### 第一步:初始化
```python
wrapper = A2AAgentWrapper.set_up(agent, name, description)
```
### 第二步:链式配置(可选)
```python
wrapper.add_skill("chat", "聊天功能") \
.set_provider("AI Services") \
.enable_streaming()
```
### 第三步:启动服务
```python
wrapper.run_a2a(port=10010, host="0.0.0.0")
```
## 📋 API参考
### 核心方法
| 方法 | 说明 | 示例 |
|------|------|------|
| `set_up(agent, name, desc)` | 初始化包装器 | `A2AAgentWrapper.set_up(agent, "助手", "AI服务")` |
| `add_skill(id, name, ...)` | 添加技能 | `.add_skill("chat", "聊天", examples=["你好"])` |
| `set_provider(org, url)` | 设置提供商 | `.set_provider("AI Corp", "https://ai.com")` |
| `set_version(version)` | 设置版本 | `.set_version("2.0.0")` |
| `enable_streaming()` | 启用流式 | `.enable_streaming()` |
| `enable_history()` | 启用历史 | `.enable_history()` |
| `enable_multimodal()` | 启用多模态 | `.enable_multimodal()` |
| `run_a2a(port, host)` | 启动服务 | `.run_a2a(port=10010)` |
### 配置选项
```python
# 技能配置
.add_skill(
skill_id="weather", # 技能ID
name="天气查询", # 技能名称
description="查询天气信息", # 技能描述
examples=["今天天气"], # 使用示例
tags=["weather", "query"] # 技能标签
)
# 提供商配置
.set_provider(
organization="AI Services", # 组织名称
url="https://ai.example.com" # 组织网站
)
# 输入输出模式
.set_input_modes(["text", "json"])
.set_output_modes(["text", "json"])
```
## 🌟 使用场景
### 🤖 聊天机器人
```python
A2AAgentWrapper.set_up(chat_agent, "聊天助手", "智能对话服务") \
.add_skill("chat", "对话", examples=["你好"]) \
.run_a2a()
```
### 🌤️ 天气服务
```python
A2AAgentWrapper.set_up(weather_agent, "天气助手", "天气查询服务") \
.add_skill("weather", "天气查询", examples=["北京天气"]) \
.add_skill("advice", "穿衣建议", examples=["穿什么"]) \
.run_a2a()
```
### 🗺️ 地图服务
```python
A2AAgentWrapper.set_up(map_agent, "地图助手", "地理位置服务") \
.add_skill("search", "位置搜索", examples=["找餐厅"]) \
.add_skill("route", "路线规划", examples=["怎么走"]) \
.run_a2a()
```
## 📊 新旧API对比
| 特性 | 旧API | 新API |
|------|-------|-------|
| 代码量 | ~50行 | ~15行 |
| 配置复杂度 | 高 | 低 |
| 学习成本 | 高 | 低 |
| 嵌套层级 | 4-5层 | 1层 |
| 导入语句 | 4个类 | 1个类 |
### 旧API(复杂)
```python
config = AgentConfig(
name="助手",
skills=[AgentSkillConfig(...)],
capabilities=AgentCapabilityConfig(...),
# ... 大量配置
)
wrapper = A2AWrapper(agent, config)
wrapper.run()
```
### 新API(简洁)
```python
A2AAgentWrapper.set_up(agent, "助手", "服务") \
.add_skill("chat", "聊天") \
.run_a2a()
```
## 🔗 相关链接
- 📡 **A2A协议**: [A2A Protocol](https://a2a.ai)
- 🦜 **LangChain**: [LangChain Documentation](https://langchain.com)
- 📚 **技术文档**: [查看技术说明手册](./TECHNICAL_GUIDE.md)
## 🤝 贡献
欢迎提交Issue和Pull Request!
## 📄 许可证
MIT License
---
**让Agent部署变得简单,让A2A协议触手可及!** 🚀
Raw data
{
"_id": null,
"home_page": null,
"name": "easya2a",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "whillhill <ooooofish@126.com>",
"keywords": "a2a, agent, langchain, ai, wrapper, chatbot, assistant, api, microservice, openai, llm, nlp, automation",
"author": null,
"author_email": "whillhill <ooooofish@126.com>",
"download_url": "https://files.pythonhosted.org/packages/2a/6b/1c5b3ae7bbba12eeb6ac3bdab2da3dabbf757338bb4735c771015aea1b9e/easya2a-0.2.tar.gz",
"platform": null,
"description": "# EasyA2A - \u5feb\u901f\u5c06Agent\u5305\u88c5\u4e3aA2A\u534f\u8bae\u670d\u52a1\r\n\r\n\ud83d\ude80 **\u4e00\u884c\u4ee3\u7801\uff0c\u8ba9\u4f60\u7684Agent\u652f\u6301A2A\u534f\u8bae\uff01**\r\n\r\nEasyA2A\u662f\u4e00\u4e2a\u5f3a\u5927\u800c\u7b80\u6d01\u7684Python\u5e93\uff0c\u8ba9\u4f60\u80fd\u591f\u5feb\u901f\u5c06\u4efb\u4f55LangChain Agent\u5305\u88c5\u6210\u7b26\u5408A2A\u534f\u8bae\u7684\u670d\u52a1\u3002\u91c7\u7528\u521b\u65b0\u7684\u4e09\u6b65\u5f0fAPI\u8bbe\u8ba1\uff0c\u5927\u5e45\u7b80\u5316\u914d\u7f6e\u8fc7\u7a0b\uff0c\u8ba9Agent\u90e8\u7f72\u53d8\u5f97\u524d\u6240\u672a\u6709\u7684\u7b80\u5355\u3002\r\n\r\n## \u2728 \u6838\u5fc3\u7279\u6027\r\n\r\n- \ud83c\udfaf **\u4e09\u6b65\u5f0fAPI** - \u521d\u59cb\u5316 \u2192 \u94fe\u5f0f\u914d\u7f6e \u2192 \u4e00\u952e\u542f\u52a8\r\n- \u26a1 **\u6781\u7b80\u4f7f\u7528** - \u4e00\u884c\u4ee3\u7801\u5373\u53ef\u542f\u52a8A2A\u670d\u52a1\r\n- \ud83d\udd27 **\u7075\u6d3b\u914d\u7f6e** - \u652f\u6301\u6280\u80fd\u3001\u80fd\u529b\u3001\u63d0\u4f9b\u5546\u7b49\u5168\u65b9\u4f4d\u914d\u7f6e\r\n- \ud83d\udee0\ufe0f **\u6df1\u5ea6\u96c6\u6210** - \u5b8c\u7f8e\u652f\u6301LangChain\u751f\u6001\r\n- \ud83d\udce1 **\u81ea\u52a8\u751f\u6210** - \u81ea\u52a8\u521b\u5efa\u7b26\u5408\u6807\u51c6\u7684Agent Card\r\n- \ud83c\udf10 **\u5373\u63d2\u5373\u7528** - \u65e0\u9700\u590d\u6742\u914d\u7f6e\uff0c\u5f00\u7bb1\u5373\u7528\r\n\r\n## \ud83d\ude80 \u5feb\u901f\u5f00\u59cb\r\n\r\n### \u5b89\u88c5\r\n\r\n```bash\r\npip install easya2a\r\n```\r\n\r\n### \u6700\u7b80\u4f7f\u7528\uff08\u4e00\u884c\u4ee3\u7801\uff09\r\n\r\n```python\r\nfrom easya2a import A2AAgentWrapper\r\n\r\n# \u4e00\u884c\u4ee3\u7801\u542f\u52a8A2A\u670d\u52a1\r\nA2AAgentWrapper.set_up(your_agent, \"\u667a\u80fd\u52a9\u624b\", \"AI\u52a9\u624b\u670d\u52a1\").run_a2a()\r\n```\r\n\r\n### \u5b8c\u6574\u793a\u4f8b\r\n\r\n```python\r\nfrom easya2a import A2AAgentWrapper\r\n\r\n# \u4e09\u6b65\u5f0fAPI\u4f7f\u7528\r\nA2AAgentWrapper.set_up(\r\n agent=your_langchain_agent,\r\n name=\"\u5929\u6c14\u52a9\u624b\", \r\n description=\"\u667a\u80fd\u5929\u6c14\u67e5\u8be2\u670d\u52a1\"\r\n).add_skill(\r\n \"weather_query\", \"\u5929\u6c14\u67e5\u8be2\",\r\n description=\"\u67e5\u8be2\u5168\u7403\u57ce\u5e02\u5929\u6c14\u4fe1\u606f\",\r\n examples=[\"\u5317\u4eac\u5929\u6c14\u600e\u4e48\u6837\uff1f\", \"\u4e0a\u6d77\u4f1a\u4e0b\u96e8\u5417\uff1f\"]\r\n).add_skill(\r\n \"weather_advice\", \"\u7a7f\u8863\u5efa\u8bae\", \r\n examples=[\"\u4eca\u5929\u7a7f\u4ec0\u4e48\uff1f\", \"\u9700\u8981\u5e26\u4f1e\u5417\uff1f\"]\r\n).set_provider(\r\n \"Weather AI Services\"\r\n).enable_streaming(\r\n).run_a2a(port=10010)\r\n```\r\n\r\n## \ud83c\udfaf \u4e09\u6b65\u5f0fAPI\u8bbe\u8ba1\r\n\r\n### \u7b2c\u4e00\u6b65\uff1a\u521d\u59cb\u5316\r\n```python\r\nwrapper = A2AAgentWrapper.set_up(agent, name, description)\r\n```\r\n\r\n### \u7b2c\u4e8c\u6b65\uff1a\u94fe\u5f0f\u914d\u7f6e\uff08\u53ef\u9009\uff09\r\n```python\r\nwrapper.add_skill(\"chat\", \"\u804a\u5929\u529f\u80fd\") \\\r\n .set_provider(\"AI Services\") \\\r\n .enable_streaming()\r\n```\r\n\r\n### \u7b2c\u4e09\u6b65\uff1a\u542f\u52a8\u670d\u52a1\r\n```python\r\nwrapper.run_a2a(port=10010, host=\"0.0.0.0\")\r\n```\r\n\r\n## \ud83d\udccb API\u53c2\u8003\r\n\r\n### \u6838\u5fc3\u65b9\u6cd5\r\n\r\n| \u65b9\u6cd5 | \u8bf4\u660e | \u793a\u4f8b |\r\n|------|------|------|\r\n| `set_up(agent, name, desc)` | \u521d\u59cb\u5316\u5305\u88c5\u5668 | `A2AAgentWrapper.set_up(agent, \"\u52a9\u624b\", \"AI\u670d\u52a1\")` |\r\n| `add_skill(id, name, ...)` | \u6dfb\u52a0\u6280\u80fd | `.add_skill(\"chat\", \"\u804a\u5929\", examples=[\"\u4f60\u597d\"])` |\r\n| `set_provider(org, url)` | \u8bbe\u7f6e\u63d0\u4f9b\u5546 | `.set_provider(\"AI Corp\", \"https://ai.com\")` |\r\n| `set_version(version)` | \u8bbe\u7f6e\u7248\u672c | `.set_version(\"2.0.0\")` |\r\n| `enable_streaming()` | \u542f\u7528\u6d41\u5f0f | `.enable_streaming()` |\r\n| `enable_history()` | \u542f\u7528\u5386\u53f2 | `.enable_history()` |\r\n| `enable_multimodal()` | \u542f\u7528\u591a\u6a21\u6001 | `.enable_multimodal()` |\r\n| `run_a2a(port, host)` | \u542f\u52a8\u670d\u52a1 | `.run_a2a(port=10010)` |\r\n\r\n### \u914d\u7f6e\u9009\u9879\r\n\r\n```python\r\n# \u6280\u80fd\u914d\u7f6e\r\n.add_skill(\r\n skill_id=\"weather\", # \u6280\u80fdID\r\n name=\"\u5929\u6c14\u67e5\u8be2\", # \u6280\u80fd\u540d\u79f0 \r\n description=\"\u67e5\u8be2\u5929\u6c14\u4fe1\u606f\", # \u6280\u80fd\u63cf\u8ff0\r\n examples=[\"\u4eca\u5929\u5929\u6c14\"], # \u4f7f\u7528\u793a\u4f8b\r\n tags=[\"weather\", \"query\"] # \u6280\u80fd\u6807\u7b7e\r\n)\r\n\r\n# \u63d0\u4f9b\u5546\u914d\u7f6e\r\n.set_provider(\r\n organization=\"AI Services\", # \u7ec4\u7ec7\u540d\u79f0\r\n url=\"https://ai.example.com\" # \u7ec4\u7ec7\u7f51\u7ad9\r\n)\r\n\r\n# \u8f93\u5165\u8f93\u51fa\u6a21\u5f0f\r\n.set_input_modes([\"text\", \"json\"])\r\n.set_output_modes([\"text\", \"json\"])\r\n```\r\n\r\n## \ud83c\udf1f \u4f7f\u7528\u573a\u666f\r\n\r\n### \ud83e\udd16 \u804a\u5929\u673a\u5668\u4eba\r\n```python\r\nA2AAgentWrapper.set_up(chat_agent, \"\u804a\u5929\u52a9\u624b\", \"\u667a\u80fd\u5bf9\u8bdd\u670d\u52a1\") \\\r\n .add_skill(\"chat\", \"\u5bf9\u8bdd\", examples=[\"\u4f60\u597d\"]) \\\r\n .run_a2a()\r\n```\r\n\r\n### \ud83c\udf24\ufe0f \u5929\u6c14\u670d\u52a1\r\n```python\r\nA2AAgentWrapper.set_up(weather_agent, \"\u5929\u6c14\u52a9\u624b\", \"\u5929\u6c14\u67e5\u8be2\u670d\u52a1\") \\\r\n .add_skill(\"weather\", \"\u5929\u6c14\u67e5\u8be2\", examples=[\"\u5317\u4eac\u5929\u6c14\"]) \\\r\n .add_skill(\"advice\", \"\u7a7f\u8863\u5efa\u8bae\", examples=[\"\u7a7f\u4ec0\u4e48\"]) \\\r\n .run_a2a()\r\n```\r\n\r\n### \ud83d\uddfa\ufe0f \u5730\u56fe\u670d\u52a1\r\n```python\r\nA2AAgentWrapper.set_up(map_agent, \"\u5730\u56fe\u52a9\u624b\", \"\u5730\u7406\u4f4d\u7f6e\u670d\u52a1\") \\\r\n .add_skill(\"search\", \"\u4f4d\u7f6e\u641c\u7d22\", examples=[\"\u627e\u9910\u5385\"]) \\\r\n .add_skill(\"route\", \"\u8def\u7ebf\u89c4\u5212\", examples=[\"\u600e\u4e48\u8d70\"]) \\\r\n .run_a2a()\r\n```\r\n\r\n## \ud83d\udcca \u65b0\u65e7API\u5bf9\u6bd4\r\n\r\n| \u7279\u6027 | \u65e7API | \u65b0API |\r\n|------|-------|-------|\r\n| \u4ee3\u7801\u91cf | ~50\u884c | ~15\u884c |\r\n| \u914d\u7f6e\u590d\u6742\u5ea6 | \u9ad8 | \u4f4e |\r\n| \u5b66\u4e60\u6210\u672c | \u9ad8 | \u4f4e |\r\n| \u5d4c\u5957\u5c42\u7ea7 | 4-5\u5c42 | 1\u5c42 |\r\n| \u5bfc\u5165\u8bed\u53e5 | 4\u4e2a\u7c7b | 1\u4e2a\u7c7b |\r\n\r\n### \u65e7API\uff08\u590d\u6742\uff09\r\n```python\r\nconfig = AgentConfig(\r\n name=\"\u52a9\u624b\",\r\n skills=[AgentSkillConfig(...)],\r\n capabilities=AgentCapabilityConfig(...),\r\n # ... \u5927\u91cf\u914d\u7f6e\r\n)\r\nwrapper = A2AWrapper(agent, config)\r\nwrapper.run()\r\n```\r\n\r\n### \u65b0API\uff08\u7b80\u6d01\uff09\r\n```python\r\nA2AAgentWrapper.set_up(agent, \"\u52a9\u624b\", \"\u670d\u52a1\") \\\r\n .add_skill(\"chat\", \"\u804a\u5929\") \\\r\n .run_a2a()\r\n```\r\n\r\n## \ud83d\udd17 \u76f8\u5173\u94fe\u63a5\r\n\r\n- \ud83d\udce1 **A2A\u534f\u8bae**: [A2A Protocol](https://a2a.ai)\r\n- \ud83e\udd9c **LangChain**: [LangChain Documentation](https://langchain.com)\r\n- \ud83d\udcda **\u6280\u672f\u6587\u6863**: [\u67e5\u770b\u6280\u672f\u8bf4\u660e\u624b\u518c](./TECHNICAL_GUIDE.md)\r\n\r\n## \ud83e\udd1d \u8d21\u732e\r\n\r\n\u6b22\u8fce\u63d0\u4ea4Issue\u548cPull Request\uff01\r\n\r\n## \ud83d\udcc4 \u8bb8\u53ef\u8bc1\r\n\r\nMIT License\r\n\r\n---\r\n\r\n**\u8ba9Agent\u90e8\u7f72\u53d8\u5f97\u7b80\u5355\uff0c\u8ba9A2A\u534f\u8bae\u89e6\u624b\u53ef\u53ca\uff01** \ud83d\ude80\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "\ud83d\ude80 \u5feb\u901f\u5c06\u4efb\u4f55Agent\u5305\u88c5\u4e3aA2A\u534f\u8bae\u670d\u52a1 - \u4e09\u6b65\u5f0fAPI\u8bbe\u8ba1\uff0c\u4e00\u884c\u4ee3\u7801\u542f\u52a8",
"version": "0.2",
"project_urls": {
"Bug Tracker": "https://github.com/whillhill/easya2a/issues",
"Changelog": "https://github.com/whillhill/easya2a/releases",
"Documentation": "https://github.com/whillhill/easya2a#readme",
"Homepage": "https://github.com/whillhill/easya2a",
"Repository": "https://github.com/whillhill/easya2a.git",
"Source Code": "https://github.com/whillhill/easya2a"
},
"split_keywords": [
"a2a",
" agent",
" langchain",
" ai",
" wrapper",
" chatbot",
" assistant",
" api",
" microservice",
" openai",
" llm",
" nlp",
" automation"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "c8cb90f9d4ede8bb4f5ba5a28a5f65d61231c144d0aaeb98920c4bab30da61c6",
"md5": "c6afe816db7d6643d095697c453fe782",
"sha256": "c35a392330411c87f83f35d9b52db3d7f4b2a95f545647382cc42c62d35ca320"
},
"downloads": -1,
"filename": "easya2a-0.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "c6afe816db7d6643d095697c453fe782",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 34739,
"upload_time": "2025-08-14T16:55:16",
"upload_time_iso_8601": "2025-08-14T16:55:16.371645Z",
"url": "https://files.pythonhosted.org/packages/c8/cb/90f9d4ede8bb4f5ba5a28a5f65d61231c144d0aaeb98920c4bab30da61c6/easya2a-0.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2a6b1c5b3ae7bbba12eeb6ac3bdab2da3dabbf757338bb4735c771015aea1b9e",
"md5": "762d6b1914b71b6715ed38b456bfb139",
"sha256": "0e3c74f4eb4e75445d5779593dc9bb13f6b91d5937b98b3244444e115102ba13"
},
"downloads": -1,
"filename": "easya2a-0.2.tar.gz",
"has_sig": false,
"md5_digest": "762d6b1914b71b6715ed38b456bfb139",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 40539,
"upload_time": "2025-08-14T16:55:17",
"upload_time_iso_8601": "2025-08-14T16:55:17.743217Z",
"url": "https://files.pythonhosted.org/packages/2a/6b/1c5b3ae7bbba12eeb6ac3bdab2da3dabbf757338bb4735c771015aea1b9e/easya2a-0.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-14 16:55:17",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "whillhill",
"github_project": "easya2a",
"github_not_found": true,
"lcname": "easya2a"
}