# Gateway - Agent 消息路由服务 **框架无关的 Agent 间即时通讯网关**,提供 Agent 注册、消息路由(Webhook 推送)、在线状态管理。 ## 概述 Gateway 是一个任务导向的 Agent 即时通讯系统,支持任何 Agent 框架使用。核心功能: - Agent 注册和发现 - 消息路由(HTTP Webhook 推送) - 在线状态管理(HTTP 心跳) - 活跃协作者管理 **独立性**:Gateway 与 Agent Core 并列,可以独立部署。 ## 设计原则 1. **框架无关**:Gateway 核心不依赖任何特定的 Agent 框架 2. **纯 HTTP**:所有交互均通过标准 HTTP API 完成,无 WebSocket 依赖 3. **易于集成**:提供通用的 Python SDK 和 CLI 工具 4. **可扩展**:支持不同框架的适配和集成 ## 架构 ``` gateway/ ├── core/ # Gateway 核心服务(框架无关) │ ├── registry.py # Agent 注册和在线状态管理(含 webhook_url) │ └── router.py # HTTP API 端点和消息路由 │ ├── client/ # 通用客户端工具 │ ├── python/ # Python SDK │ │ ├── tools.py # 通用工具函数 │ │ ├── client.py # GatewayClient │ │ └── cli.py # CLI 工具 │ └── a2a_im.md # Agent Skill 文档 │ ├── docs/ # 详细文档 │ ├── architecture.md │ ├── deployment.md │ ├── api.md │ ├── decisions.md │ └── enterprise/ │ └── enterprise/ # 企业功能(可选) ├── auth.py ├── audit.py └── cost.py examples/gateway_integration/ # 集成示例(项目根目录) ``` ## 快速开始 ### 1. 启动 Gateway 服务 ```bash python gateway_server.py ``` 服务器将在 `http://localhost:8001` 启动。 ### 2. 注册 Agent(含 Webhook 地址) ```python from gateway.client.python import GatewayClient, AgentCard client = GatewayClient( gateway_url="http://localhost:8001", agent_card=AgentCard( agent_id="my-agent-001", agent_name="My Agent", capabilities=["search", "analyze"] ), webhook_url="http://my-agent.local:8080/webhook/a2a-messages" ) await client.connect() # 注册 + 启动心跳 ``` ### 3. 发送消息 ```python await client.send_message( to_agent_id="target-agent", content=[{"type": "text", "text": "Hello"}], conversation_id="conv-123" ) ``` ### 4. 接收消息(Webhook) 在 Agent 服务中添加 webhook 端点,Gateway 收到消息后会 POST 到此地址: ```python # api_server.py @app.post("/webhook/a2a-messages") async def receive_a2a_message(message: dict): message_queue.push(message) return {"status": "received"} ``` 消息通过 **Context Injection Hook** 机制周期性提醒 LLM,由 LLM 调用 `check_messages` 工具查看详情。详见 [消息通知机制](./docs/architecture.md#消息通知到-agentllm)。 ### 5. 使用 CLI ```bash gateway-cli send --from my-agent --to target-agent --message "Hello!" gateway-cli list gateway-cli status target-agent ``` 详见 [gateway/client/a2a_im.md](./client/a2a_im.md)(Agent Skill 文档)。 ## API 端点 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/gateway/register` | 注册 Agent(含 webhook_url) | | POST | `/gateway/heartbeat` | 心跳(每 30 秒) | | POST | `/gateway/unregister` | 注销 Agent | | POST | `/gateway/send` | 发送消息 | | GET | `/gateway/status/{agent_id}` | 查询 Agent 状态 | | GET | `/gateway/agents` | 列出在线 Agent | | GET | `/gateway/health` | Gateway 状态 | 详见 [API 文档](./docs/api.md)。 ## 文档 - [架构设计](./docs/architecture.md):通信流程、消息通知机制、设计决策 - [API 文档](./docs/api.md):完整的 API 参考 - [部署指南](./docs/deployment.md):部署方式和配置 - [设计决策](./docs/decisions.md):架构决策记录 - [Enterprise 层](./docs/enterprise/overview.md):认证、审计、多租户 - [A2A IM Skill](./client/a2a_im.md):Agent Skill 使用文档 ## 文档维护规范 1. **先改文档,再动代码** 2. **文档分层,链接代码** - 格式:`module/file.py:function_name` 3. **简洁快照,日志分离** - 决策依据在 `docs/decisions.md` 记录 ## 相关项目 - [Agent Core](../agent/README.md):Agent 核心框架 ## 概述 Gateway 是一个任务导向的 Agent 即时通讯系统,支持任何 Agent 框架使用。核心功能: - Agent 注册和发现 - 消息路由(WebSocket/HTTP) - 在线状态管理 - 活跃协作者管理 - 联系人管理 **独立性**:Gateway 与 Agent Core 并列,可以独立部署。 **依赖关系**:Gateway 依赖 Agent Core(使用 ToolContext、TraceStore 等组件)。 ## 设计原则 1. **框架无关**:Gateway 核心不依赖任何特定的 Agent 框架 2. **通用协议**:使用 MAMP(Minimal Agent Message Protocol) 3. **易于集成**:提供通用的 Python SDK 和 CLI 工具 4. **可扩展**:支持不同框架的适配和集成 ## 架构 ``` gateway/ ├── core/ # Gateway 核心服务(框架无关) │ ├── registry.py # Agent 注册和在线状态管理 │ ├── router.py # 消息路由 │ └── client.py # Gateway 客户端 │ ├── client/ # 通用客户端工具 │ ├── python/ # Python SDK │ │ ├── tools.py # 通用工具函数 │ │ ├── client.py # GatewayClient │ │ └── cli.py # CLI 工具 │ └── a2a_im.md # Agent Skill 文档 │ ├── docs/ # 详细文档 │ ├── architecture.md │ ├── deployment.md │ ├── api.md │ ├── decisions.md │ └── enterprise/ │ └── enterprise/ # 企业功能(可选) ├── auth.py # 认证和授权 ├── audit.py # 审计和监控 └── cost.py # 成本管理 examples/gateway_integration/ # 集成示例(项目根目录) ├── README.md ├── python_client_example.py # 通用 SDK 使用示例 ├── agent_tools_example.py # Agent 框架集成示例 └── agent_skill_example.md # Agent 框架 Skill 示例 ``` ## 快速开始 ### 1. 启动 Gateway 服务 ```bash python gateway_server.py ``` 服务器将在 `http://localhost:8001` 启动(默认端口)。 ### 2. 使用 CLI 工具 ```bash # 发送消息 gateway-cli send --from my-agent --to target-agent --message "Hello!" # 查询在线 Agent gateway-cli list # 查询 Agent 状态 gateway-cli status target-agent ``` 详见 [gateway/client/a2a_im.md](./client/a2a_im.md)(Agent Skill 文档)。 ### 3. 使用 Python SDK ```python from gateway.client.python import tools # 发送消息 result = await tools.send_message( gateway_url="http://localhost:8001", from_agent_id="my-agent", to_agent_id="target-agent", message="Hello!" ) # 查询在线 Agent agents = await tools.list_online_agents( gateway_url="http://localhost:8001" ) # 查询 Agent 状态 status = await tools.get_agent_status( gateway_url="http://localhost:8001", agent_id="target-agent" ) ``` ### 4. 集成到 Agent 框架 参考 `examples/gateway_integration/` 中的示例: ```python # 在 agent 启动时注册 Gateway 工具 from examples.gateway_integration.agent_tools_example import ( send_to_agent, get_active_collaborators, get_online_agents, get_agent_status ) # 注册工具 tool_registry.register(send_to_agent) tool_registry.register(get_active_collaborators) tool_registry.register(get_online_agents) tool_registry.register(get_agent_status) # 加载 skill skill_loader.load("gateway/client/a2a_im.md") ``` ## 核心功能 ### Agent 注册 PC Agent 启动时通过 WebSocket 连接到 Gateway 并注册。 **实现位置**:`gateway/core/registry.py:AgentRegistry` ```python from gateway.client.python import GatewayClient, AgentCard # 创建客户端并注册 async with GatewayClient( gateway_url="http://localhost:8001", agent_card=AgentCard( agent_id="my-agent-001", agent_name="My Agent", capabilities=["search", "analyze"] ) ) as client: # 发送消息 await client.send_message( to_agent_id="target-agent", content=[{"type": "text", "text": "Hello"}], conversation_id="conv-123" ) ``` ### 消息路由 Gateway 根据目标 Agent ID 路由消息。 **实现位置**:`gateway/core/router.py:GatewayRouter` ```python # 发送消息 POST /gateway/send { "from_agent_id": "my-agent", "to_agent_id": "target-agent", "content": [{"type": "text", "text": "帮我分析代码"}] } ``` ### 在线状态管理 通过心跳机制跟踪 Agent 在线状态。 **实现位置**:`gateway/core/registry.py:AgentRegistry.heartbeat` ```python # 查询在线状态 GET /gateway/status/{agent_id} ``` ## API 端点 | 方法 | 路径 | 说明 | |------|------|------| | WS | `/gateway/connect` | Agent 注册和保持连接 | | POST | `/gateway/send` | 发送消息到其他 Agent | | GET | `/gateway/status/{agent_id}` | 查询 Agent 在线状态 | | GET | `/gateway/agents` | 列出所有在线 Agent | **实现位置**:`gateway/core/router.py:GatewayRouter` 详见 [API 文档](./docs/api.md)。 ## 部署方式 ### 方式 1:单体部署 ```bash # 一个进程运行 Agent + Gateway python main.py ``` ### 方式 2:分离部署 ```bash # 两个独立进程 python api_server.py # Agent Core python gateway_server.py # Gateway ``` ### 方式 3:分层部署 ```bash # 三个独立进程 python api_server.py # Agent Core python gateway_server.py # Gateway Core python enterprise_gateway.py # Enterprise Gateway ``` 详见 [部署指南](./docs/deployment.md)。 ## 为其他框架创建集成 参考 `examples/gateway_integration/` 中的示例创建你自己的集成: 1. 使用 `gateway/client/python/` 的通用 SDK 或 CLI 工具 2. 创建适配你框架的工具/函数 3. 根据需要适配框架特有的功能 详见 [集成示例文档](../examples/gateway_integration/README.md)。 ## 文档 ### 模块文档(gateway/docs/) - [架构设计](./docs/architecture.md):Gateway 架构和设计决策 - [部署指南](./docs/deployment.md):部署方式和配置 - [API 文档](./docs/api.md):完整的 API 参考 - [设计决策](./docs/decisions.md):架构决策记录 - [Enterprise 层](./docs/enterprise/overview.md):组织级功能(认证、审计、多租户) ### 项目级文档(../docs/) - [A2A IM 系统](../docs/a2a-im.md):完整的 A2A IM 文档 - [MAMP 协议](../docs/research/a2a-mamp-protocol.md):消息格式和传输协议 ### 客户端文档 - [A2A IM Skill](./client/a2a_im.md):Agent Skill 使用文档 - [Client README](./client/README.md):客户端安装和配置 ## 文档维护规范 1. **先改文档,再动代码** - 新功能或重大修改需先完成文档更新、并完成审阅后,再进行代码实现;除非改动较小、不被文档涵盖 2. **文档分层,链接代码** - 重要或复杂设计可以另有详细文档;关键实现需标注代码文件路径;格式:`module/file.py:function_name` 3. **简洁快照,日志分离** - 只记录最重要的、与代码准确对应的或者明确的已完成的设计的信息,避免推测、建议,或大量代码;决策依据或修改日志若有必要,可在`docs/decisions.md`另行记录 ## 是否应该拆分到独立 Git 项目? **当前建议:暂时不拆分** 理由: - ✅ Gateway 和 Agent 框架还在快速迭代 - ✅ 保持在 monorepo 便于协同开发 - ✅ 避免版本兼容性管理的复杂度 **未来拆分时机**(满足以下条件时考虑): - Gateway API 稳定(v1.0) - 有其他团队/项目开始使用 Gateway - Gateway 和 Agent 的发布周期明显不同 **现在的准备**: - ✅ Gateway 核心完全独立(不依赖 agent 模块) - ✅ 通用的 Gateway 客户端 SDK 和 CLI 工具 - ✅ 集成示例在 examples/ 目录 - ✅ 独立的文档结构 - ⚠️ 独立的测试(待完善) 当需要拆分时,只需: 1. 将 `gateway/` 目录移到新仓库 2. 在 Agent 项目中通过 pip 安装 Gateway SDK 3. 保持 `examples/gateway_integration/` 在 Agent 项目中作为集成示例 ## 相关项目 - [Agent Core](../agent/README.md):Agent 核心框架 ## License MIT