# Gateway 设计决策

## 文档说明

本文档记录 Gateway 模块的架构决策、设计权衡和实现选择。

---

## 决策记录

### 1. Gateway 与 Agent Core 并列而非嵌套

**日期**：2026-03-04

**背景**：
- Gateway 负责 Agent 注册、消息路由、在线状态管理
- Agent Core 负责 Agent 执行引擎、工具系统、记忆管理
- 两者功能独立，可以分别部署

**决策**：
- Gateway 和 Agent Core 作为并列的顶层模块（gateway/ 和 agent/）
- 单向依赖：Gateway 可以依赖 Agent Core，但 Agent Core 不依赖 Gateway
- Agent Core 可以独立运行（本地 Agent），Gateway 可选

**理由**：
1. **解耦**：两个模块职责清晰，可以独立开发和部署
2. **灵活性**：支持多种部署模式（单机、分离、分布式）
3. **可维护性**：模块边界清晰，便于理解和维护

**替代方案**：
- 方案 A：Gateway 作为 agent/gateway/（嵌套）
  - 缺点：暗示 Gateway 是 Agent 的子模块，但实际上 Gateway 是独立的服务
- 方案 B：Gateway 作为 integrations/gateway/
  - 缺点：Gateway 不是第三方集成，而是核心基础设施

---

### 2. 消息接收采用 Webhook 而非 WebSocket

**日期**：2026-03-05

**背景**：
- 需要将 Gateway 收到的消息推送给目标 Agent
- PC 端 Agent 通常没有公网 IP，需要反向连接机制
- 场景是任务协作，而非实时聊天

**决策**：
- 采用 **Webhook 推送**（而非 WebSocket 长连接）
- Agent 注册时提供 `webhook_url`
- Gateway 收到消息后，HTTP POST 到 `webhook_url`
- Agent 发送心跳维持在线状态（HTTP POST，30s 间隔）

**理由**：
1. **维护成本低**：无需管理长连接、断线重连
2. **场景匹配**：任务导向协作不需要毫秒级实时性
3. **调试简单**：标准 HTTP，易于监控和排查
4. **已有基础**：Agent 已运行 FastAPI 服务，添加 webhook 端点极简单

**被放弃的方案**：
- WebSocket 长连接：实时性好，但维护成本高（需处理重连、心跳保活、连接池），对我们的场景是过度设计
- HTTP 轮询：无需长连接，但浪费资源，延迟不可控

**影响**：
- `gateway/core/client.py`（旧 WebSocket 客户端）待清理
- `gateway/core/router.py` WebSocket 端点可移除
- Registry 简化为只存储 `webhook_url`，不存储连接对象

---

### 4. Enterprise 作为 Gateway 扩展层

**日期**：2026-03-04

**背景**：
- Enterprise 层提供认证、审计、多租户等功能
- 个人部署不需要 Enterprise 功能

**决策**：
- Enterprise 作为 Gateway 的可选扩展层
- 通过中间件模式集成（auth.py, audit.py, rate_limit.py）
- 文档放在 gateway/docs/enterprise/

**理由**：
1. **可选部署**：个人用户可以只部署 Gateway，不部署 Enterprise
2. **清晰分层**：Enterprise 扩展 Gateway 功能，关系明确
3. **易于扩展**：中间件模式便于添加新功能

**替代方案**：
- 方案 A：Enterprise 作为独立顶层模块
  - 缺点：增加部署复杂度，Enterprise 主要扩展 Gateway
- 方案 B：Enterprise 功能内置到 Gateway
  - 缺点：个人用户也要承担 Enterprise 的复杂度

---

### 5. 消息格式采用 MAMP 协议

**日期**：2026-03-04

**背景**：
- 需要与外部 Agent 系统通信
- 需要支持多模态内容

**决策**：
- 采用 MAMP（Minimal Agent Message Protocol）
- 消息格式参考 Anthropic SDK
- 支持 conversation_id 管理对话

**理由**：
1. **简洁**：最小化协议，易于实现
2. **兼容**：与 Anthropic SDK 格式对齐
3. **扩展性**：支持多模态和元数据

**详细设计**：见 [MAMP 协议](../../../docs/research/a2a-mamp-protocol.md)

---

## 相关文档

- [Agent Core 设计决策](../../agent/docs/decisions.md)
- [架构设计](./architecture.md)
- [A2A IM 系统](../../../docs/a2a-im.md)
