easya2a


Nameeasya2a JSON
Version 0.2 PyPI version JSON
download
home_pageNone
Summary🚀 快速将任何Agent包装为A2A协议服务 - 三步式API设计,一行代码启动
upload_time2025-08-14 16:55:17
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseMIT
keywords a2a agent langchain ai wrapper chatbot assistant api microservice openai llm nlp automation
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 0.90136s