内容
# 智能RFP/提案代理
> 多智能体系统,利用A2A(智能体间)编排和MCP(模型上下文协议)创建专业的商业和技术提案。









---
DEMO LIVE: https://a2a-mcp-multiagent-smart-rfp.streamlit.app/
## 它解决了什么问题?
编写商业和技术提案是一个 **耗时、重复的过程**,涉及:
- 研究潜在客户(公司概况、关键决策者、行业背景)
- 分析RFP文件以提取需求、预算限制和评估标准
- 搜索内部记录以获取相关过去的项目和案例研究
- 根据团队组成、复杂性和项目范围估算成本
- 编写一个结构化、专业的提案,将所有内容结合起来
该系统通过单个对话界面协调四个专门的AI智能体,**自动化整个流程** — 从客户研究到最终交付成果。传统上需要数天手动工作,现在减少到单个交互式会话。
---
## 架构
该系统遵循 **A2A(智能体间)** 模式,其中由Claude驱动的中央编排器协调四个独立的智能体,每个智能体都作为 **MCP(模型上下文协议)** 服务器运行。
```
┌─────────────────────────────┐
│ 用户(命令行聊天) │
└──────────────┬───────────────┘
│
▼
┌──────────────────────────────┐
│ 编排器(Claude LLM) │
│ A2A协调引擎 │
│ 智能体循环(最多10次迭代) │
└──┬───────┬───────┬───────┬───┘
│ │ │ │
┌─────────▼──┐ ┌──▼─────┐ ┌▼──────┐ ┌▼────────┐
│ 客户 │ │知识│ │提案│ │ 定价 │
│ 研究 │ │库 │ │编写│ │ 代理 │
│ 智能体 │ │智能体│ │智能体│ │ │
│ (MCP服务器) │ │(MCP服务器)│ │(MCP服务器)│ │(MCP服务器)│
└────────────┘ └────────┘ └────────┘ └─────────┘
```
### 它是如何工作的
1. 用户通过 **交互式命令行** 提交请求(例如,_"为Acme Corp的移动应用项目创建提案"_)
2. **编排器** 使用Claude分析请求并确定要调用的智能体和工具
3. 智能体通过 **MCP工具执行** 调用 - 每个智能体作为子进程运行,通过stdio进行通信
4. 编排器循环(最多10次迭代),调用工具并积累上下文,直到Claude生成最终的综合响应
5. 用户接收 **完整、专业的提案**,可直接提交给客户
6. 可选地,提案 **导出到.docx文件**,带有封面页、品牌和专业格式
---
## 智能体卡(A2A发现)
该系统使用 **智能体卡** 来实现A2A发现模式。每个智能体发布一张卡片(通过 [agent_cards.py](orchestrator/agent_cards.py) 中的Pydantic模型定义),声明其身份、功能和启动方式。编排器在运行时读取这些卡片,以发现可用的智能体并路由任务。
```python
class AgentCard(BaseModel):
agent_id: str # 唯一标识符(例如,“client_research”)
name: str # 人类可读的名称
description: str # 智能体执行的操作
version: str # 语义版本号
status: AgentStatus # 可用 | 忙碌 | 离线
skills: list[AgentSkill] # 能力列表,带有MCP工具映射
mcp_server_command: list[str] # 启动MCP服务器子进程的命令
dependencies: list[str] # 智能体依赖的其他智能体ID
```
每个 **AgentSkill** 将高级别的能力映射到特定的MCP工具,并包括示例查询,帮助编排器了解何时调用它:
| 智能体卡 | 技能 | 依赖关系 |
|------------|--------|--------------|
| `client_research` | `company_research`, `rfp_analysis`, `linkedin_research` | — |
| `knowledge_base` | `project_search`, `project_details`, `tech_stack_search`, `case_studies` | — |
| `proposal_writer` | `full_proposal`, `timeline`, `executive_summary`, `export_docx` | `client_research`, `knowledge_base` |
| `pricing` | `project_estimation`, `custom_estimation`, `rate_card` | — |
所有卡片都注册在 `AGENT_REGISTRY` 中,使得添加新智能体变得容易 - 只需定义一个新的 `AgentCard` 并注册它。
---
## 智能体
### 客户研究智能体
使用网络搜索和AI分析研究潜在客户。
| 工具 | 描述 |
|------|-------------|
| `search_company_info` | 通过Tavily搜索网络并使用Claude提取结构化的公司概况 |
| `analyze_rfp_document` | 解析RFP文本以提取需求、预算、时间表和评估标准 |
| `search_linkedin_company` | 通过LinkedIn代理搜索查找关键决策者和公司信息 |
### 知识库智能体
在内部数据库中搜索过去的项目以获取相关经验和案例研究。
| 工具 | 描述 |
|------|-------------|
| `search_past_projects` | 关键字匹配 + Claude语义排名内部项目 |
| `get_project_details` | 通过ID检索特定项目的完整详细信息 |
| `search_tech_stack` | 查找使用特定技术的项目 |
| `get_case_studies` | 检索与客户行业部门相关的案例研究 |
### 提案编写智能体
生成具有双语支持(英语/西班牙语)的专业、结构化的提案。
| 工具 | 描述 |
|------|-------------|
| `generate_proposal` | 从收集的上下文中创建完整的8节提案 |
| `generate_timeline` | 构建具有里程碑和交付成果的项目阶段 |
| `generate_executive_summary` | 将提案提炼成关键的高管谈话要点 |
| `export_proposal_docx` | 将markdown提案导出为专业的Word(.docx)文件 |
**提案章节:** 执行摘要、理解、拟议解决方案、方法论、团队、案例研究、投资、后续步骤
### 定价智能体
估算项目成本,配置团队组成、复杂性乘数和折扣等级。
| 工具 | 描述 |
|------|-------------|
| `estimate_project` | AI分析范围,推荐团队组成并计算总成本 |
| `estimate_from_roles` | 基于手动团队的自定义角色选择进行定价 |
| `get_rate_card` | 返回小时费率、复杂性乘数和折扣规则 |
**定价功能:**
- 9个预定义角色,小时费率(欧元60-100/小时)
- 复杂度乘数:低(0.8倍)至非常高(1.6倍)
- 折扣等级:标准、长期、战略(最多10%)
- 基于阶段的成本分配(发现8%,设计12%,开发50%,测试15%,部署15%)
---
## 技术栈
| 类别 | 技术 | 目的 |
|----------|-----------|---------|
| **LLM** | [Anthropic Claude API](https://docs.anthropic.com/) | 推理、分析、内容生成 |
| **智能体框架** | [MCP(模型上下文协议)](https://modelcontextprotocol.io/) / FastMCP | 智能体服务器框架和工具注册 |
| **编排** | A2A协议 | 多智能体协调和路由 |
| **网络搜索** | [Tavily API](https://tavily.com/) | 公司研究和LinkedIn代理搜索 |
| **HTTP客户端** | [httpx](https://www.python-httpx.org/) | 对外部API的异步HTTP请求 |
| **验证** | [Pydantic v2](https://docs.pydantic.dev/) | 输入/输出数据验证和序列化 |
| **文档导出** | [python-docx](https://python-docx.readthedocs.io/) | 将提案导出为专业的Word(.docx)文件 |
| **前端** | [Streamlit](https://streamlit.io/) | 基于Web的聊天界面,带有智能体可见性 |
| **配置** | [python-dotenv](https://pypi.org/project/python-dotenv/) | 环境变量管理 |
| **语言** | Python 3.10+ | 异步/等待、类型提示、结构模式匹配 |
---
## 项目结构
```
smart-rfp-agent/
├── agents/
│ ├── client_research/ # 客户和RFP研究智能体
│ │ ├── server.py # MCP服务器定义和入口点
│ │ ├── tools.py # 工具实现(Tavily + Claude)
│ │ └── models.py # Pydantic输入/输出模型
│ ├── knowledge_base/ # 内部项目数据库智能体
│ │ ├── server.py # MCP服务器定义
│ │ ├── tools.py # 搜索和排名逻辑
│ │ ├── models.py # Pydantic模型
│ │ └── data/
│ │ └── projects.json # 过去的项目数据库
│ ├── proposal_writer/ # 提案生成智能体
│ │ ├── server.py # MCP服务器定义
│ │ ├── tools.py # 提案生成逻辑
│ │ ├── models.py # Pydantic模型(双语支持)
│ │ └── templates/
│ │ └── proposal_structure.json # 8节提案模板
│ └── pricing/ # 成本估算智能体
│ ├── server.py # MCP服务器定义
│ ├── tools.py # 定价计算逻辑
│ ├── models.py # Pydantic模型
│ └── data/
│ └── rate_card.json # 费率、乘数和折扣
├── orchestrator/
│ ├── main.py # 交互式命令行入口
│ ├── orchestrator.py # A2A引擎(Claude + 智能体循环)
│ ├── agent_cards.py # 智能体能力注册表
│ └── mcp_client.py # MCP子进程连接管理器
├── streamlit_helpers/
│ ├── async_bridge.py # 异步到同步桥(后台事件循环)
│ └── components.py # 可重用UI组件(侧边栏、聊天、国际化)
├── shared/
│ ├── utils.py # 共享错误处理实用程序
│ └── docx_exporter.py # Markdown → DOCX转换器,带有品牌
├── config/
│ └── settings.py # 环境变量和配置
├── app.py # Streamlit Web前端
├── requirements.txt
└── .env.example
```
---
## 安装
### 先决条件
- Python 3.10+
- [Anthropic API密钥](https://console.anthropic.com/)
- [Tavily API密钥](https://tavily.com/)(用于网络搜索)
### 安装
```bash
# 克隆仓库
git clone https://github.com/your-username/smart-rfp-agent.git
cd smart-rfp-agent
# 安装依赖
pip install -r requirements.txt
# 配置环境变量
cp .env.example .env
# 编辑.env并添加您的API密钥
```
### 环境变量
| 变量 | 必需 | 描述 |
|----------|----------|-------------|
| `ANTHROPIC_API_KEY` | 是 | Claude API访问密钥 |
| `TAVILY_API_KEY` | 是 | Tavily网络搜索API密钥 |
| `LINKEDIN_CLIENT_ID` | 否 | LinkedIn API客户端ID |
| `LINKEDIN_CLIENT_SECRET` | 否 | LinkedIn API客户端密钥 |
| `MCP_TRANSPORT` | 否 | 传输协议(默认:`stdio`) |
| `MCP_PORT` | 否 | 服务器端口(默认:`8000`) |
### 运行
**Web UI(Streamlit)— 推荐:**
```bash
streamlit run app.py
```
这将打开一个基于浏览器的聊天界面,包含:
- 与AI编排器的实时对话
- 显示连接的智能体及其技能的侧边栏
- 语言选择器(英语/西班牙语)
- 一键DOCX导出和下载
- 新对话按钮
**命令行(终端):**
```bash
python orchestrator/main.py
```
| 命令 | 描述 |
|---------|-------------|
| `/new` | 开始新的对话 |
| `/agents` | 列出可用的智能体及其工具 |
| `/quit` | 退出应用程序 |
### 独立运行智能体
每个智能体都可以作为独立的MCP服务器进行测试或集成:
```bash
python agents/client_research/server.py
python agents/knowledge_base/server.py
python agents/proposal_writer/server.py
python agents/pricing/server.py
```
---
## 示例用法
```
> 研究Acme Corp并为移动电子商务应用创建提案
[编排器调用客户研究智能体 → 搜索公司信息]
[编排器调用知识库智能体 → 查找类似的过去项目]
[编排器调用定价智能体 → 估算项目成本]
[编排器调用提案编写智能体 → 生成完整提案]
✅ 生成完整的8节提案,包含:
- 公司分析和背景
- 技术解决方案架构
- 来自过去项目的相关案例研究
- 详细的成本明细和时间表
- 执行摘要和下一步
> 将提案导出为Word
[提案编写智能体 → 导出为DOCX]
✅ 保存到exports/proposal_acme_corp_20260207_143022.docx
```
---
## 关键设计决策
- **MCP优于REST**:智能体通过stdio-based MCP进行通信,而不是HTTP,从而消除了网络开销并简化了本地部署
- **智能体循环**:编排器让Claude决定调用哪些工具以及调用顺序,从而实现灵活的多步骤推理
- **双语支持**:提案可以通过简单的语言参数生成英语或西班牙语
- **可配置的定价**:费率卡、复杂性乘数和折扣层存储在JSON文件中,无需更改代码即可轻松自定义
- **DOCX导出**:提案可以导出为具有封面页、品牌样式、页眉/页脚和页码的专业Word文档,通过`python-docx`
- **智能体卡(A2A发现)**:每个智能体发布一个结构化的卡片,声明其技能、MCP工具映射和依赖关系,从而实现动态发现和可扩展性
- **模块化智能体**:每个智能体都是完全独立的,可以在不影响系统其他部分的情况下进行开发、测试或替换