Compare commits
No commits in common. "e78aefac88651f2e080eca0c2096bd6316fab9d1" and "91d20868dab7619c78efa6f298fa66751ab8c95c" have entirely different histories.
e78aefac88
...
91d20868da
|
|
@ -44,7 +44,11 @@ logs/
|
|||
*.db
|
||||
*.sqlite3
|
||||
|
||||
|
||||
# Node.js
|
||||
node_modules/
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
|
|
|
|||
21
LICENSE
21
LICENSE
|
|
@ -1,21 +0,0 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2024 AI Agent Collaboration Framework
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
|
@ -1,90 +0,0 @@
|
|||
# 孢子殖民地项目 - 清理后结构
|
||||
|
||||
## 🎯 根目录(极简版)
|
||||
|
||||
```
|
||||
孢子殖民地/
|
||||
├── README.md # 项目核心介绍
|
||||
├── LICENSE # 开源许可证
|
||||
├── main.py # 主程序入口
|
||||
├── ai_collaboration_demo.py # AI协作演示
|
||||
├── install.sh # 一键安装脚本
|
||||
├── requirements.txt # Python依赖
|
||||
|
||||
├── pytest.ini # 测试配置
|
||||
├── .gitignore # Git忽略规则
|
||||
├── .gitguardian.yaml # 安全配置
|
||||
├── agents/ # AI代理身份系统(核心)
|
||||
├── src/ # 核心协作系统源码
|
||||
├── app/ # Streamlit应用
|
||||
├── demo_feature/ # 演示功能
|
||||
├── design/ # 设计文档
|
||||
├── docs/ # 项目文档
|
||||
├── examples/ # 使用示例
|
||||
├── outputs/ # 输出结果
|
||||
├── tests/ # 测试文件
|
||||
├── tools/ # 工具脚本
|
||||
├── website/ # 项目网站
|
||||
└── modules/ # 模块化组件
|
||||
├── agent-identity/ # AI代理身份模块
|
||||
├── core-collaboration/ # 核心协作模块
|
||||
├── monitoring-dashboard/ # 监控面板模块
|
||||
├── documentation-suite/ # 文档套件模块
|
||||
├── testing-framework/ # 测试框架模块
|
||||
├── devops-tools/ # DevOps工具模块
|
||||
└── legacy-support/ # 历史支持文件
|
||||
```
|
||||
|
||||
## 📁 核心目录说明
|
||||
|
||||
### 🎯 根目录保留文件
|
||||
- **main.py**: 项目主入口,启动AI协作系统
|
||||
- **ai_collaboration_demo.py**: AI协作演示脚本
|
||||
- **install.sh**: 一键安装所有依赖和环境
|
||||
- **requirements.txt**: Python依赖清单
|
||||
|
||||
|
||||
### 🏗️ 核心系统目录
|
||||
- **agents/**: AI代理身份管理系统
|
||||
- **src/**: 核心协作系统源代码
|
||||
- **app/**: Streamlit Web应用界面
|
||||
- **tests/**: 单元测试和集成测试
|
||||
- **tools/**: 开发工具和实用脚本
|
||||
|
||||
### 📊 项目资产目录
|
||||
- **docs/**: 项目文档和使用指南
|
||||
- **examples/**: 使用示例和演示案例
|
||||
- **design/**: 系统架构和设计文档
|
||||
- **outputs/**: 运行输出和结果存储
|
||||
- **website/**: 项目展示网站
|
||||
|
||||
### 🧩 模块化组件(modules/)
|
||||
所有复杂功能和历史文件已迁移到modules目录:
|
||||
- **legacy-support/**: 历史文件、报告、临时文件
|
||||
- **其他5个模块**: 之前创建的模块化组件
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
```bash
|
||||
# 1. 克隆项目
|
||||
git clone [项目地址]
|
||||
cd 孢子殖民地
|
||||
|
||||
# 2. 一键安装
|
||||
./install.sh
|
||||
|
||||
# 3. 启动项目
|
||||
python main.py
|
||||
|
||||
# 4. 访问Web界面
|
||||
streamlit run app/streamlit_app.py
|
||||
```
|
||||
|
||||
## 🎯 设计哲学
|
||||
|
||||
**极简根目录**:只保留最核心、最常用的文件
|
||||
**模块化组织**:复杂功能全部封装到modules目录
|
||||
**清晰边界**:核心系统与辅助工具完全分离
|
||||
**易于导航**:3秒内找到任何文件
|
||||
|
||||
现在项目根目录从30+个文件减少到17个,清爽多了! 🎉
|
||||
460
README.md
460
README.md
|
|
@ -1,238 +1,282 @@
|
|||
# 🤖 AI Agent Collaboration Framework
|
||||
# 🏛️ 炼妖壶 (Lianyaohu) - 稷下学宫AI辩论系统
|
||||
|
||||
> **从模拟到真实:让每个AI Agent都拥有独立的Git身份,实现真正的实盘协作**
|
||||
> 🧹 **致AI开发者**: 入此稷下学宫者,当先读 [`AI_DEVELOPER_GUIDELINES.md`](./AI_DEVELOPER_GUIDELINES.md) 了解项目规矩,明藏经阁章法。扫地僧叮嘱:代码如经书,需整齐摆放;文化特色不可丢,八仙智慧要传承。
|
||||
|
||||
[](https://opensource.org/licenses/MIT)
|
||||
[](https://www.python.org/downloads/)
|
||||
[](https://git-scm.com/)
|
||||
[](https://github.com/your-org/agent-collaboration-framework/actions)
|
||||
提示:已支持 Cloudflare AutoRAG/Vectorize 作为记忆后端(RAG)。见 docs/guides/CLOUDFLARE_AUTORAG_INTEGRATION.md。
|
||||
|
||||
## 🎯 核心理念
|
||||
基于中国哲学传统的多AI智能体辩论平台,重构版本。
|
||||
|
||||
**不是让AI Agent假装协作,而是让每个Agent都有真实的Git身份:独立的SSH密钥、GPG签名、用户名和邮箱,实现可追溯的团队协作历史。**
|
||||
## ✨ 核心特性
|
||||
|
||||
## ✨ 特性亮点
|
||||
- **🎭 稷下学宫八仙论道**: 基于中国传统八仙文化的多AI智能体辩论系统
|
||||
- **🧠 Vertex AI记忆银行**: 集成Google Cloud Memory Bank,让AI智能体具备持久化记忆能力
|
||||
- **🌍 天下体系分析**: 基于儒门天下观的资本生态"天命树"分析模型
|
||||
- **🔒 安全配置管理**: 使用Doppler进行统一的密钥和配置管理
|
||||
- **📊 智能数据源**: 基于17个RapidAPI订阅的永动机数据引擎
|
||||
- **📈 市场数据 (可选)**: 集成 OpenBB v4,统一路由多数据提供商,详见 docs/openbb_integration/README.md
|
||||
- **🎨 现代化界面**: 基于Streamlit的响应式Web界面
|
||||
|
||||
### 🔐 真实身份系统
|
||||
- ✅ 每个Agent拥有独立的SSH密钥对
|
||||
- ✅ 独立的GPG签名密钥(可选)
|
||||
- ✅ 独立的Git配置(用户名、邮箱)
|
||||
- ✅ 可追溯的完整提交历史
|
||||
## 🏗️ 项目结构
|
||||
|
||||
### 🤖 预定义Agent角色
|
||||
| Agent | 角色 | 专长 |
|
||||
|-------|------|------|
|
||||
| `claude-ai` | 架构师 | 系统设计、技术选型 |
|
||||
| `gemini-dev` | 开发者 | 核心功能开发 |
|
||||
| `qwen-ops` | 运维 | 部署脚本、监控 |
|
||||
| `llama-research` | 研究员 | 性能分析、优化 |
|
||||
|
||||
### 🚀 一键启动
|
||||
```bash
|
||||
curl -fsSL https://raw.githubusercontent.com/your-org/agent-collaboration-framework/main/install.sh | bash
|
||||
```
|
||||
liurenchaxin/
|
||||
├── app/ # 应用入口
|
||||
│ ├── streamlit_app.py # 主Streamlit应用
|
||||
│ └── tabs/ # 功能模块
|
||||
│ └── tianxia_tab.py # 天下体系分析
|
||||
├── src/ # 核心业务逻辑
|
||||
│ └── jixia/ # 稷下学宫系统
|
||||
│ └── engines/ # 核心引擎
|
||||
│ └── perpetual_engine.py # 永动机引擎
|
||||
├── config/ # 配置管理
|
||||
│ └── settings.py # Doppler配置接口
|
||||
├── scripts/ # 工具脚本
|
||||
│ └── test_openrouter_api.py # API连接测试
|
||||
├── tests/ # 测试代码
|
||||
├── .kiro/ # Kiro AI助手配置
|
||||
│ └── steering/ # AI指导规则
|
||||
└── requirements.txt # 依赖清单
|
||||
```
|
||||
|
||||
## 🏃♂️ 快速开始
|
||||
## 🚀 快速开始
|
||||
|
||||
### 1. 安装
|
||||
```bash
|
||||
git clone https://github.com/your-org/agent-collaboration-framework.git
|
||||
cd agent-collaboration-framework
|
||||
./install.sh
|
||||
```
|
||||
### 1. 环境准备
|
||||
|
||||
### 2. 运行演示
|
||||
```bash
|
||||
# 启动多Agent协作演示
|
||||
python3 examples/basic/demo_collaboration.py
|
||||
|
||||
# 查看Agent状态
|
||||
./agents/stats.sh
|
||||
```
|
||||
|
||||
### 3. 手动协作
|
||||
```bash
|
||||
# 切换到架构师Agent
|
||||
./agents/switch_agent.sh claude-ai
|
||||
echo "# 系统架构设计" > docs/architecture.md
|
||||
git add docs/architecture.md
|
||||
git commit -m "添加系统架构设计文档"
|
||||
|
||||
# 切换到开发者Agent
|
||||
./agents/switch_agent.sh gemini-dev
|
||||
echo "console.log('Hello World');" > src/app.js
|
||||
git add src/app.js
|
||||
git commit -m "实现基础应用功能"
|
||||
```
|
||||
|
||||
## 📊 实时协作展示
|
||||
|
||||
### 当前Agent活动
|
||||
```bash
|
||||
$ ./agents/stats.sh
|
||||
|
||||
🔍 Agent协作统计:
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
Agent: claude-ai (架构师)
|
||||
提交次数: 5
|
||||
代码行数: 120
|
||||
主要贡献: 架构设计, 文档编写
|
||||
|
||||
Agent: gemini-dev (开发者)
|
||||
提交次数: 8
|
||||
代码行数: 350
|
||||
主要贡献: 核心功能, 单元测试
|
||||
|
||||
Agent: qwen-ops (运维)
|
||||
提交次数: 3
|
||||
代码行数: 80
|
||||
主要贡献: 部署脚本, 配置管理
|
||||
|
||||
Agent: llama-research (研究员)
|
||||
提交次数: 2
|
||||
代码行数: 60
|
||||
主要贡献: 性能分析, 优化建议
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
```
|
||||
|
||||
## 🏗️ 架构设计
|
||||
|
||||
### 核心组件
|
||||
```
|
||||
agent-collaboration-framework/
|
||||
├── agents/ # Agent身份管理
|
||||
│ ├── identity_manager.py # 身份管理系统
|
||||
│ ├── switch_agent.sh # Agent切换工具
|
||||
│ └── stats.sh # 统计工具
|
||||
├── src/ # 核心源码
|
||||
├── examples/ # 使用示例
|
||||
├── tests/ # 测试套件
|
||||
└── docs/ # 完整文档
|
||||
```
|
||||
|
||||
### 身份管理流程
|
||||
```mermaid
|
||||
graph TD
|
||||
A[启动项目] --> B[初始化Agent]
|
||||
B --> C[生成SSH密钥]
|
||||
B --> D[配置Git身份]
|
||||
C --> E[Agent切换]
|
||||
D --> E
|
||||
E --> F[真实Git提交]
|
||||
F --> G[可追溯历史]
|
||||
```
|
||||
|
||||
## 🎭 使用场景
|
||||
|
||||
### 1. 🏢 个人项目增强
|
||||
- 模拟大型团队协作
|
||||
- 代码审查练习
|
||||
- 架构设计验证
|
||||
|
||||
### 2. 🎓 教学演示
|
||||
- Git协作教学
|
||||
- 敏捷开发实践
|
||||
- 代码审查培训
|
||||
|
||||
### 3. 🏭 企业级应用
|
||||
- AI辅助代码审查
|
||||
- 多角色代码分析
|
||||
- 自动化文档生成
|
||||
|
||||
## 🔧 高级功能
|
||||
|
||||
### 自定义Agent角色
|
||||
```bash
|
||||
# 创建新Agent角色
|
||||
./scripts/create_agent.sh "rust-expert" "Rust专家" "rust@ai-collaboration.local"
|
||||
```
|
||||
|
||||
### 批量操作
|
||||
```bash
|
||||
# 所有Agent同时更新文档
|
||||
./scripts/bulk_commit.sh "更新文档" --agents="all"
|
||||
```
|
||||
|
||||
### 代码审查模式
|
||||
```bash
|
||||
# 启动审查模式
|
||||
./scripts/review_mode.sh
|
||||
```
|
||||
|
||||
## 🐳 Docker部署
|
||||
#### 方法一:使用自动化设置脚本(推荐)
|
||||
|
||||
```bash
|
||||
# 使用Docker快速启动
|
||||
docker run -it \
|
||||
-v $(pwd):/workspace \
|
||||
agent-collaboration:latest
|
||||
|
||||
# 使用Docker Compose
|
||||
docker-compose up -d
|
||||
# 一键设置虚拟环境和依赖
|
||||
./setup_venv.sh
|
||||
```
|
||||
|
||||
## 📈 路线图
|
||||
#### 方法二:手动设置
|
||||
|
||||
### Phase 1: 核心功能 ✅
|
||||
- [x] 多Agent身份管理
|
||||
- [x] Git协作演示
|
||||
- [x] 基础工具脚本
|
||||
- [x] Docker支持
|
||||
```bash
|
||||
# 创建虚拟环境
|
||||
python3 -m venv venv
|
||||
|
||||
### Phase 2: 增强协作 🚧
|
||||
- [ ] Web界面管理
|
||||
- [ ] 实时协作监控
|
||||
- [ ] 代码质量分析
|
||||
- [ ] 权限管理系统
|
||||
# 激活虚拟环境
|
||||
# macOS/Linux
|
||||
source venv/bin/activate
|
||||
# Windows CMD
|
||||
# venv\Scripts\activate.bat
|
||||
# Windows PowerShell
|
||||
# venv\Scripts\Activate.ps1
|
||||
|
||||
### Phase 3: 企业级 🎯
|
||||
- [ ] 审计日志
|
||||
- [ ] 集成CI/CD
|
||||
- [ ] 高级分析
|
||||
- [ ] 云原生部署
|
||||
# 升级pip
|
||||
pip install --upgrade pip
|
||||
|
||||
# 安装依赖
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
#### 虚拟环境管理
|
||||
|
||||
```bash
|
||||
# 激活虚拟环境
|
||||
source venv/bin/activate
|
||||
|
||||
# 退出虚拟环境
|
||||
deactivate
|
||||
|
||||
# 查看已安装的包
|
||||
pip list
|
||||
|
||||
# 更新依赖(开发时)
|
||||
pip freeze > requirements.txt
|
||||
```
|
||||
|
||||
### 2. 配置管理
|
||||
|
||||
项目使用Doppler进行安全的配置管理。需要配置以下环境变量:
|
||||
|
||||
```bash
|
||||
# 必需配置(数据源)
|
||||
RAPIDAPI_KEY=your_rapidapi_key
|
||||
|
||||
# 选择其一的AI服务密钥
|
||||
# A) OpenRouter(旧)
|
||||
OPENROUTER_API_KEY_1=your_openrouter_key
|
||||
# B) Google ADK / Gemini(新)
|
||||
GOOGLE_API_KEY=your_gemini_api_key
|
||||
# 如果使用 Vertex AI Express Mode(可选)
|
||||
GOOGLE_GENAI_USE_VERTEXAI=TRUE
|
||||
|
||||
# Vertex AI Memory Bank 配置(新功能)
|
||||
GOOGLE_CLOUD_PROJECT_ID=your-project-id
|
||||
GOOGLE_CLOUD_LOCATION=us-central1
|
||||
VERTEX_MEMORY_BANK_ENABLED=TRUE
|
||||
|
||||
# 可选配置
|
||||
POSTGRES_URL=your_postgres_url
|
||||
MONGODB_URL=your_mongodb_url
|
||||
ZILLIZ_URL=your_zilliz_url
|
||||
ZILLIZ_TOKEN=your_zilliz_token
|
||||
```
|
||||
|
||||
### 3. 启动应用
|
||||
|
||||
```bash
|
||||
# 启动Streamlit应用
|
||||
streamlit run app/streamlit_app.py
|
||||
|
||||
# 或指定端口
|
||||
streamlit run app/streamlit_app.py --server.port 8501
|
||||
```
|
||||
|
||||
### 4. 安装Swarm (可选)
|
||||
|
||||
如果要使用Swarm八仙论道功能:
|
||||
|
||||
```bash
|
||||
# 安装OpenAI Swarm
|
||||
python scripts/install_swarm.py
|
||||
|
||||
# 或手动安装
|
||||
pip install git+https://github.com/openai/swarm.git
|
||||
```
|
||||
|
||||
### 5. 测试连接
|
||||
|
||||
```bash
|
||||
# 测试API连接
|
||||
python scripts/test_openrouter_api.py
|
||||
|
||||
# 验证配置
|
||||
python config/settings.py
|
||||
|
||||
# 测试Swarm辩论 (可选)
|
||||
python src/jixia/debates/swarm_debate.py
|
||||
|
||||
# 测试Vertex AI Memory Bank (新功能)
|
||||
python tests/test_vertex_memory_bank.py
|
||||
```
|
||||
|
||||
## 🎭 稷下学宫八仙论道
|
||||
|
||||
### 辩论顺序 (Debate Order)
|
||||
|
||||
辩论严格遵循中国哲学中的先天八卦顺序,分为两个阶段:
|
||||
|
||||
1. **第一轮:核心对立辩论**
|
||||
此轮按照两两对立的原则进行,顺序如下:
|
||||
- **乾坤对立 (男女)**: 吕洞宾 vs 何仙姑
|
||||
- **兑艮对立 (老少)**: 张果老 vs 韩湘子
|
||||
- **离坎对立 (富贫)**: 汉钟离 vs 蓝采和
|
||||
- **震巽对立 (贵贱)**: 曹国舅 vs 铁拐李
|
||||
|
||||
2. **第二轮:顺序发言**
|
||||
此轮按照先天八卦的完整顺序进行 (乾一, 兑二, 离三, 震四, 巽五, 坎六, 艮七, 坤八),顺序如下:
|
||||
- **乾**: 吕洞宾
|
||||
- **兑**: 张果老
|
||||
- **离**: 汉钟离
|
||||
- **震**: 曹国舅
|
||||
- **巽**: 铁拐李
|
||||
- **坎**: 蓝采和
|
||||
- **艮**: 韩湘子
|
||||
- **坤**: 何仙姑
|
||||
|
||||
### 人物设定 (Character Settings)
|
||||
基于中国传统八仙文化,每位仙人都有专属的卦象、代表和人设:
|
||||
|
||||
- **吕洞宾** (乾): 男性代表
|
||||
- **何仙姑** (坤): 女性代表
|
||||
- **张果老** (兑): 老者代表
|
||||
- **韩湘子** (艮): 少年代表
|
||||
- **汉钟离** (离): 富者代表
|
||||
- **蓝采和** (坎): 贫者代表
|
||||
- **曹国舅** (震): 贵者代表
|
||||
- **铁拐李** (巽): 贱者代表
|
||||
|
||||
### Swarm模式 (AI智能体辩论)
|
||||
基于OpenAI Swarm框架的四仙智能体辩论系统:
|
||||
|
||||
- **🗡️ 吕洞宾** (乾卦): 技术分析专家,看涨派,犀利直接
|
||||
- **🌸 何仙姑** (坤卦): 风险控制专家,看跌派,温和坚定
|
||||
- **📚 张果老** (兑卦): 历史数据分析师,看涨派,博古通今
|
||||
- **⚡ 铁拐李** (巽卦): 逆向投资大师,看跌派,挑战共识
|
||||
|
||||
#### 支持两种运行模式:
|
||||
- **OpenRouter模式**: 使用云端AI服务,模型选择丰富
|
||||
- **Ollama模式**: 使用本地AI服务,完全离线运行
|
||||
|
||||
## 🌍 天下体系分析
|
||||
|
||||
基于儒门天下观的"天命树"结构模型:
|
||||
|
||||
### 四层架构
|
||||
- **👑 天子**: 定义范式的平台型公司 (如NVIDIA, Tesla, Apple)
|
||||
- **🏛️ 大夫**: 深度绑定天子的核心供应商 (如TSMC, CATL)
|
||||
- **⚔️ 士**: 专业供应商和服务商 (如ASML, Luxshare)
|
||||
- **🔗 嫁接**: 跨生态的策略性链接关系
|
||||
|
||||
### 三大生态
|
||||
- **🤖 AI生态**: NVIDIA统治的AI计算生态
|
||||
- **⚡ EV生态**: Tesla定义的电动汽车生态
|
||||
- **📱 消费电子生态**: Apple建立的iOS生态
|
||||
|
||||
## 🔧 开发指南
|
||||
|
||||
### 代码规范
|
||||
- 使用Python类型注解
|
||||
- 遵循PEP 8编码规范
|
||||
- 所有公共函数必须有文档字符串
|
||||
- 使用dataclass定义数据结构
|
||||
|
||||
### 安全要求
|
||||
- **零硬编码密钥**: 所有敏感信息通过Doppler或环境变量获取
|
||||
- **环境隔离**: 开发、测试、生产环境严格分离
|
||||
- **自动化扫描**: 所有提交必须通过安全检查
|
||||
|
||||
### 测试要求
|
||||
- 所有核心功能必须有单元测试
|
||||
- API调用必须有集成测试
|
||||
- 配置管理必须有验证测试
|
||||
|
||||
## 📊 API使用统计
|
||||
|
||||
项目基于17个RapidAPI订阅构建永动机数据引擎:
|
||||
|
||||
- **智能故障转移**: 主API失败时自动切换备用API
|
||||
- **负载均衡**: 智能分配API调用,避免单点过载
|
||||
- **使用统计**: 实时监控API使用情况和成本优化
|
||||
|
||||
## 🤝 贡献指南
|
||||
|
||||
我们欢迎所有形式的贡献!
|
||||
|
||||
### 快速贡献
|
||||
1. 🍴 Fork项目
|
||||
2. 🌿 创建功能分支
|
||||
3. 📝 提交更改
|
||||
4. 🚀 创建Pull Request
|
||||
|
||||
### 开发环境
|
||||
```bash
|
||||
git clone https://github.com/your-org/agent-collaboration-framework.git
|
||||
cd agent-collaboration-framework
|
||||
pip install -r requirements-dev.txt
|
||||
pytest tests/
|
||||
```
|
||||
|
||||
## 📚 完整文档
|
||||
|
||||
- 📖 [安装指南](SETUP.md)
|
||||
- 🚀 [快速开始](QUICK_START.md)
|
||||
- 🤝 [贡献指南](CONTRIBUTING.md)
|
||||
- 📊 [API文档](docs/api/README.md)
|
||||
- 🎓 [教程](docs/guides/README.md)
|
||||
|
||||
## 📞 社区支持
|
||||
|
||||
- 💬 [GitHub Discussions](https://github.com/your-org/agent-collaboration-framework/discussions)
|
||||
- 🐛 [Issue追踪](https://github.com/your-org/agent-collaboration-framework/issues)
|
||||
- 🌟 [Star历史](https://star-history.com/#your-org/agent-collaboration-framework)
|
||||
1. Fork项目
|
||||
2. 创建功能分支 (`git checkout -b feature/amazing-feature`)
|
||||
3. 提交更改 (`git commit -m 'Add amazing feature'`)
|
||||
4. 推送到分支 (`git push origin feature/amazing-feature`)
|
||||
5. 创建Pull Request
|
||||
|
||||
## 📄 许可证
|
||||
|
||||
[MIT许可证](LICENSE) - 详见许可证文件。
|
||||
本项目采用MIT许可证 - 详见 [LICENSE](LICENSE) 文件
|
||||
|
||||
## ⚠️ 免责声明
|
||||
|
||||
本系统仅供学习和研究使用。所有投资分析和建议仅供参考,不构成投资建议。投资有风险,决策需谨慎。
|
||||
|
||||
---
|
||||
|
||||
<div align="center">
|
||||
**炼妖壶 - 让AI辩论照亮投资智慧** 🏛️✨
|
||||
|
||||
**🚀 从模拟到真实,从工具到伙伴。**
|
||||
## 🧪 ADK 开发调试(可选)
|
||||
|
||||
[](https://star-history.com/#your-org/agent-collaboration-framework&Date)
|
||||
如果切换到 Google ADK:
|
||||
|
||||
</div>
|
||||
```bash
|
||||
# 安装 ADK(任选其一)
|
||||
pip install google-adk
|
||||
# 或安装最新开发版
|
||||
pip install git+https://github.com/google/adk-python.git@main
|
||||
|
||||
# 启动 ADK 开发界面(在包含 agent 目录的父目录运行)
|
||||
adk web
|
||||
# 或命令行
|
||||
adk run multi_tool_agent
|
||||
# 或启动 API 服务
|
||||
adk api_server
|
||||
```
|
||||
|
||||
> 如果遇到 _make_subprocess_transport NotImplementedError,可使用 `adk web --no-reload`。
|
||||
|
|
@ -1,227 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
"""
|
||||
Agent Identity Manager
|
||||
为每个AI agent提供独立的git身份和提交能力
|
||||
|
||||
这个系统让每个agent拥有:
|
||||
- 独立的SSH key对
|
||||
- 独立的GPG签名key
|
||||
- 独立的git配置(name, email)
|
||||
- 可追溯的提交历史
|
||||
|
||||
模拟真实团队协作,而非内部讨论
|
||||
"""
|
||||
|
||||
import os
|
||||
import json
|
||||
import subprocess
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
from typing import Dict, List, Optional
|
||||
import logging
|
||||
|
||||
class AgentIdentity:
|
||||
"""单个agent的身份信息"""
|
||||
def __init__(self, name: str, email: str, role: str):
|
||||
self.name = name
|
||||
self.email = email
|
||||
self.role = role
|
||||
self.ssh_key_path = None
|
||||
self.gpg_key_id = None
|
||||
|
||||
def to_dict(self) -> Dict:
|
||||
return {
|
||||
"name": self.name,
|
||||
"email": self.email,
|
||||
"role": self.role,
|
||||
"ssh_key_path": str(self.ssh_key_path) if self.ssh_key_path else None,
|
||||
"gpg_key_id": self.gpg_key_id
|
||||
}
|
||||
|
||||
class AgentIdentityManager:
|
||||
"""管理所有agent的身份和git操作"""
|
||||
|
||||
def __init__(self, base_dir: str = "/home/ben/github/liurenchaxin"):
|
||||
self.base_dir = Path(base_dir)
|
||||
self.agents_dir = self.base_dir / "agents"
|
||||
self.keys_dir = self.agents_dir / "keys"
|
||||
self.config_file = self.agents_dir / "identities.json"
|
||||
|
||||
# 确保目录存在
|
||||
self.agents_dir.mkdir(exist_ok=True)
|
||||
self.keys_dir.mkdir(exist_ok=True)
|
||||
|
||||
self.identities: Dict[str, AgentIdentity] = {}
|
||||
self.load_identities()
|
||||
|
||||
def load_identities(self):
|
||||
"""从配置文件加载agent身份"""
|
||||
if self.config_file.exists():
|
||||
with open(self.config_file, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
for name, identity_data in data.items():
|
||||
identity = AgentIdentity(
|
||||
identity_data["name"],
|
||||
identity_data["email"],
|
||||
identity_data["role"]
|
||||
)
|
||||
identity.ssh_key_path = Path(identity_data["ssh_key_path"]) if identity_data["ssh_key_path"] else None
|
||||
identity.gpg_key_id = identity_data["gpg_key_id"]
|
||||
self.identities[name] = identity
|
||||
|
||||
def save_identities(self):
|
||||
"""保存agent身份到配置文件"""
|
||||
data = {name: identity.to_dict() for name, identity in self.identities.items()}
|
||||
with open(self.config_file, 'w', encoding='utf-8') as f:
|
||||
json.dump(data, f, indent=2, ensure_ascii=False)
|
||||
|
||||
def create_agent(self, name: str, email: str, role: str) -> AgentIdentity:
|
||||
"""创建新的agent身份"""
|
||||
if name in self.identities:
|
||||
raise ValueError(f"Agent {name} 已存在")
|
||||
|
||||
identity = AgentIdentity(name, email, role)
|
||||
|
||||
# 生成SSH key
|
||||
ssh_key_path = self.keys_dir / f"{name}_rsa"
|
||||
self._generate_ssh_key(name, email, ssh_key_path)
|
||||
identity.ssh_key_path = ssh_key_path
|
||||
|
||||
# 生成GPG key
|
||||
gpg_key_id = self._generate_gpg_key(name, email)
|
||||
identity.gpg_key_id = gpg_key_id
|
||||
|
||||
self.identities[name] = identity
|
||||
self.save_identities()
|
||||
|
||||
logging.info(f"创建agent: {name} ({role})")
|
||||
return identity
|
||||
|
||||
def _generate_ssh_key(self, name: str, email: str, key_path: Path):
|
||||
"""为agent生成SSH key"""
|
||||
cmd = [
|
||||
"ssh-keygen",
|
||||
"-t", "rsa",
|
||||
"-b", "4096",
|
||||
"-C", email,
|
||||
"-f", str(key_path),
|
||||
"-N", "" # 空密码
|
||||
]
|
||||
|
||||
try:
|
||||
subprocess.run(cmd, check=True, capture_output=True)
|
||||
logging.info(f"SSH key已生成: {key_path}")
|
||||
except subprocess.CalledProcessError as e:
|
||||
logging.error(f"生成SSH key失败: {e}")
|
||||
raise
|
||||
|
||||
def _generate_gpg_key(self, name: str, email: str) -> str:
|
||||
"""为agent生成GPG key"""
|
||||
# 这里简化处理,实际应该使用python-gnupg库
|
||||
# 返回模拟的key ID
|
||||
return f"{name.upper()}12345678"
|
||||
|
||||
def switch_to_agent(self, agent_name: str):
|
||||
"""切换到指定agent身份"""
|
||||
if agent_name not in self.identities:
|
||||
raise ValueError(f"Agent {agent_name} 不存在")
|
||||
|
||||
identity = self.identities[agent_name]
|
||||
|
||||
# 设置git配置
|
||||
commands = [
|
||||
["git", "config", "user.name", identity.name],
|
||||
["git", "config", "user.email", identity.email],
|
||||
["git", "config", "user.signingkey", identity.gpg_key_id],
|
||||
["git", "config", "commit.gpgsign", "true"]
|
||||
]
|
||||
|
||||
for cmd in commands:
|
||||
try:
|
||||
subprocess.run(cmd, check=True, cwd=self.base_dir)
|
||||
except subprocess.CalledProcessError as e:
|
||||
logging.error(f"设置git配置失败: {e}")
|
||||
raise
|
||||
|
||||
# 设置SSH key (通过ssh-agent)
|
||||
if identity.ssh_key_path and identity.ssh_key_path.exists():
|
||||
self._setup_ssh_agent(identity.ssh_key_path)
|
||||
|
||||
logging.info(f"已切换到agent: {agent_name}")
|
||||
|
||||
def _setup_ssh_agent(self, key_path: Path):
|
||||
"""设置SSH agent使用指定key"""
|
||||
# 这里简化处理,实际应该管理ssh-agent
|
||||
os.environ["GIT_SSH_COMMAND"] = f"ssh -i {key_path}"
|
||||
|
||||
def commit_as_agent(self, agent_name: str, message: str, files: List[str] = None):
|
||||
"""以指定agent身份提交代码"""
|
||||
self.switch_to_agent(agent_name)
|
||||
|
||||
# 添加文件
|
||||
if files:
|
||||
subprocess.run(["git", "add"] + files, check=True, cwd=self.base_dir)
|
||||
else:
|
||||
subprocess.run(["git", "add", "."], check=True, cwd=self.base_dir)
|
||||
|
||||
# 提交 - 暂时禁用GPG签名
|
||||
subprocess.run(["git", "commit", "-m", message], check=True, cwd=self.base_dir)
|
||||
|
||||
logging.info(f"Agent {agent_name} 提交: {message}")
|
||||
|
||||
def list_agents(self) -> List[Dict]:
|
||||
"""列出所有agent"""
|
||||
return [identity.to_dict() for identity in self.identities.values()]
|
||||
|
||||
def get_agent_stats(self, agent_name: str) -> Dict:
|
||||
"""获取agent的git统计信息"""
|
||||
if agent_name not in self.identities:
|
||||
raise ValueError(f"Agent {agent_name} 不存在")
|
||||
|
||||
identity = self.identities[agent_name]
|
||||
|
||||
# 获取提交统计
|
||||
cmd = [
|
||||
"git", "log", "--author", identity.email,
|
||||
"--pretty=format:%h|%an|%ae|%ad|%s",
|
||||
"--date=short"
|
||||
]
|
||||
|
||||
try:
|
||||
result = subprocess.run(cmd, capture_output=True, text=True, cwd=self.base_dir)
|
||||
commits = result.stdout.strip().split('\n') if result.stdout.strip() else []
|
||||
|
||||
return {
|
||||
"agent_name": agent_name,
|
||||
"total_commits": len(commits),
|
||||
"commits": commits[:10] # 最近10条
|
||||
}
|
||||
except subprocess.CalledProcessError:
|
||||
return {
|
||||
"agent_name": agent_name,
|
||||
"total_commits": 0,
|
||||
"commits": []
|
||||
}
|
||||
|
||||
# 使用示例和初始化
|
||||
if __name__ == "__main__":
|
||||
manager = AgentIdentityManager()
|
||||
|
||||
# 创建示例agents
|
||||
agents_config = [
|
||||
{"name": "claude-ai", "email": "claude@ai-collaboration.local", "role": "架构师"},
|
||||
{"name": "gemini-dev", "email": "gemini@ai-collaboration.local", "role": "开发者"},
|
||||
{"name": "qwen-ops", "email": "qwen@ai-collaboration.local", "role": "运维"},
|
||||
{"name": "llama-research", "email": "llama@ai-collaboration.local", "role": "研究员"}
|
||||
]
|
||||
|
||||
for agent in agents_config:
|
||||
try:
|
||||
manager.create_agent(agent["name"], agent["email"], agent["role"])
|
||||
print(f"✅ 创建agent: {agent['name']}")
|
||||
except ValueError as e:
|
||||
print(f"⚠️ {e}")
|
||||
|
||||
print("\n📊 当前agent列表:")
|
||||
for agent in manager.list_agents():
|
||||
print(f" - {agent['name']} ({agent['role']}) - {agent['email']}")
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
#!/bin/bash
|
||||
# 以指定agent身份提交
|
||||
|
||||
if [[ $# -lt 2 ]]; then
|
||||
echo "用法: ./commit_as_agent.sh <agent名称> \"提交信息\" [文件...]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
AGENT_NAME=$1
|
||||
MESSAGE=$2
|
||||
shift 2
|
||||
FILES=$@
|
||||
|
||||
echo "📝 Agent $AGENT_NAME 正在提交..."
|
||||
python3 -c "
|
||||
import sys
|
||||
sys.path.append('agents')
|
||||
from agent_identity_manager import AgentIdentityManager
|
||||
manager = AgentIdentityManager()
|
||||
try:
|
||||
manager.commit_as_agent('$AGENT_NAME', '$MESSAGE', '$FILES'.split() if '$FILES' else None)
|
||||
print('✅ 提交成功')
|
||||
except Exception as e:
|
||||
print(f'❌ 提交失败: {e}')
|
||||
exit(1)
|
||||
"
|
||||
|
|
@ -1,270 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
"""
|
||||
Agent协作演示
|
||||
展示如何让不同AI agent以真实身份协作完成任务
|
||||
|
||||
这个演示模拟以下场景:
|
||||
1. 架构师agent设计系统架构
|
||||
2. 开发者agent实现核心功能
|
||||
3. 运维agent配置部署
|
||||
4. 研究员agent撰写文档
|
||||
|
||||
每个步骤都有真实的git提交记录
|
||||
"""
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
import time
|
||||
from pathlib import Path
|
||||
from agent_identity_manager import AgentIdentityManager
|
||||
|
||||
class AgentCollaborationDemo:
|
||||
def __init__(self):
|
||||
self.manager = AgentIdentityManager()
|
||||
self.base_dir = Path("/home/ben/github/liurenchaxin")
|
||||
|
||||
def create_demo_files(self):
|
||||
"""创建演示用的文件"""
|
||||
demo_dir = self.base_dir / "demo_feature"
|
||||
demo_dir.mkdir(exist_ok=True)
|
||||
|
||||
# 架构师的设计文档
|
||||
architecture_file = demo_dir / "architecture.md"
|
||||
architecture_content = """# 新功能架构设计
|
||||
|
||||
## 概述
|
||||
设计一个智能监控系统,用于跟踪AI agent的工作状态。
|
||||
|
||||
## 组件设计
|
||||
- 状态收集器:收集各agent的运行状态
|
||||
- 分析引擎:分析agent行为模式
|
||||
- 告警系统:异常行为实时通知
|
||||
|
||||
## 技术栈
|
||||
- Python 3.9+
|
||||
- Redis作为消息队列
|
||||
- PostgreSQL存储状态数据
|
||||
- FastAPI提供REST接口
|
||||
"""
|
||||
architecture_file.write_text(architecture_content)
|
||||
|
||||
# 开发者的实现代码
|
||||
core_file = demo_dir / "monitor.py"
|
||||
core_content = """#!/usr/bin/env python3
|
||||
import asyncio
|
||||
import json
|
||||
from datetime import datetime
|
||||
from typing import Dict, Any
|
||||
|
||||
class AgentMonitor:
|
||||
def __init__(self):
|
||||
self.agents_status = {}
|
||||
|
||||
async def collect_status(self, agent_name: str) -> Dict[str, Any]:
|
||||
return {
|
||||
"name": agent_name,
|
||||
"timestamp": datetime.now().isoformat(),
|
||||
"status": "active",
|
||||
"tasks_completed": 0
|
||||
}
|
||||
|
||||
async def run(self):
|
||||
while True:
|
||||
# 模拟状态收集
|
||||
await asyncio.sleep(1)
|
||||
|
||||
if __name__ == "__main__":
|
||||
monitor = AgentMonitor()
|
||||
asyncio.run(monitor.run())
|
||||
"""
|
||||
core_file.write_text(core_content)
|
||||
|
||||
# 运维的配置文件
|
||||
config_file = demo_dir / "deploy.yaml"
|
||||
config_content = """version: '3.8'
|
||||
services:
|
||||
agent-monitor:
|
||||
build: .
|
||||
ports:
|
||||
- "8000:8000"
|
||||
environment:
|
||||
- REDIS_URL=redis://redis:6379
|
||||
- DB_URL=postgresql://user:pass@postgres:5432/agentdb
|
||||
depends_on:
|
||||
- redis
|
||||
- postgres
|
||||
|
||||
redis:
|
||||
image: redis:alpine
|
||||
ports:
|
||||
- "6379:6379"
|
||||
|
||||
postgres:
|
||||
image: postgres:13
|
||||
environment:
|
||||
POSTGRES_DB: agentdb
|
||||
POSTGRES_USER: user
|
||||
POSTGRES_PASSWORD: pass
|
||||
"""
|
||||
config_file.write_text(config_content)
|
||||
|
||||
# 研究员的文档
|
||||
docs_file = demo_dir / "usage_guide.md"
|
||||
docs_content = """# Agent监控系统使用指南
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 1. 启动监控服务
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### 2. 查看agent状态
|
||||
```bash
|
||||
curl http://localhost:8000/api/agents
|
||||
```
|
||||
|
||||
### 3. 配置告警
|
||||
编辑 `config/alerts.yaml` 文件设置告警规则。
|
||||
|
||||
## API文档
|
||||
|
||||
### GET /api/agents
|
||||
获取所有agent的当前状态
|
||||
|
||||
### POST /api/agents/{name}/task
|
||||
记录agent完成的任务
|
||||
"""
|
||||
docs_file.write_text(docs_content)
|
||||
|
||||
return [architecture_file, core_file, config_file, docs_file]
|
||||
|
||||
def run_collaboration_demo(self):
|
||||
"""运行协作演示"""
|
||||
print("🎭 开始Agent协作演示")
|
||||
print("=" * 50)
|
||||
|
||||
# 1. 架构师设计
|
||||
print("1️⃣ 架构师agent开始设计...")
|
||||
files = self.create_demo_files()
|
||||
self.manager.commit_as_agent(
|
||||
"claude-ai",
|
||||
"📐 设计智能监控系统架构 - 添加架构设计文档",
|
||||
[str(f) for f in files[:1]]
|
||||
)
|
||||
time.sleep(1)
|
||||
|
||||
# 2. 开发者实现
|
||||
print("2️⃣ 开发者agent开始编码...")
|
||||
self.manager.commit_as_agent(
|
||||
"gemini-dev",
|
||||
"💻 实现监控系统核心功能 - 添加AgentMonitor类",
|
||||
[str(files[1])]
|
||||
)
|
||||
time.sleep(1)
|
||||
|
||||
# 3. 运维配置
|
||||
print("3️⃣ 运维agent配置部署...")
|
||||
self.manager.commit_as_agent(
|
||||
"qwen-ops",
|
||||
"⚙️ 添加Docker部署配置 - 支持一键启动",
|
||||
[str(files[2])]
|
||||
)
|
||||
time.sleep(1)
|
||||
|
||||
# 4. 研究员文档
|
||||
print("4️⃣ 研究员agent撰写文档...")
|
||||
self.manager.commit_as_agent(
|
||||
"llama-research",
|
||||
"📚 完善使用文档 - 添加API说明和快速指南",
|
||||
[str(files[3])]
|
||||
)
|
||||
time.sleep(1)
|
||||
|
||||
# 5. 架构师review
|
||||
print("5️⃣ 架构师review并优化...")
|
||||
optimize_file = self.base_dir / "demo_feature" / "optimization.md"
|
||||
optimize_content = """# 架构优化建议
|
||||
|
||||
基于实现代码的review,提出以下优化:
|
||||
|
||||
## 性能优化
|
||||
- 使用asyncio.create_task替换直接调用
|
||||
- 添加连接池管理
|
||||
|
||||
## 监控增强
|
||||
- 添加prometheus指标收集
|
||||
- 实现健康检查端点
|
||||
|
||||
## 下一步计划
|
||||
1. 实现告警系统
|
||||
2. 添加Web界面
|
||||
3. 集成日志分析
|
||||
"""
|
||||
optimize_file.write_text(optimize_content)
|
||||
|
||||
self.manager.commit_as_agent(
|
||||
"claude-ai",
|
||||
"🔍 架构review - 提出性能优化和监控增强建议",
|
||||
[str(optimize_file)]
|
||||
)
|
||||
|
||||
print("\n✅ 协作演示完成!")
|
||||
|
||||
def show_git_history(self):
|
||||
"""显示git提交历史"""
|
||||
print("\n📊 Git提交历史(按agent分组):")
|
||||
print("=" * 50)
|
||||
|
||||
for agent_name in ["claude-ai", "gemini-dev", "qwen-ops", "llama-research"]:
|
||||
stats = self.manager.get_agent_stats(agent_name)
|
||||
if stats["commits"]:
|
||||
print(f"\n👤 {agent_name}:")
|
||||
for commit in stats["commits"]:
|
||||
parts = commit.split("|", 4)
|
||||
if len(parts) >= 5:
|
||||
hash_id, name, email, date, message = parts
|
||||
print(f" {hash_id[:8]} {date} {message}")
|
||||
|
||||
def cleanup_demo(self):
|
||||
"""清理演示文件"""
|
||||
demo_dir = self.base_dir / "demo_feature"
|
||||
if demo_dir.exists():
|
||||
# 保留git历史,只移除工作区文件
|
||||
subprocess.run(["git", "rm", "-rf", "demo_feature"],
|
||||
cwd=self.base_dir, capture_output=True)
|
||||
subprocess.run(["git", "commit", "-m", "🧹 清理演示文件 - 保留协作历史"],
|
||||
cwd=self.base_dir, capture_output=True)
|
||||
print("🧹 演示文件已清理,git历史保留")
|
||||
|
||||
def main():
|
||||
"""主函数"""
|
||||
demo = AgentCollaborationDemo()
|
||||
|
||||
print("🎭 AI Agent协作演示")
|
||||
print("=" * 50)
|
||||
print("这个演示将展示如何让不同agent以真实身份协作")
|
||||
print("每个agent都有独立的git身份和提交记录")
|
||||
print("")
|
||||
|
||||
# 检查agent是否已创建
|
||||
if not demo.manager.list_agents():
|
||||
print("❌ 请先运行 ./agents/setup_agents.sh 创建agent")
|
||||
return
|
||||
|
||||
# 运行演示
|
||||
demo.run_collaboration_demo()
|
||||
demo.show_git_history()
|
||||
|
||||
print("\n💡 下一步:")
|
||||
print("1. 查看git log --oneline --graph 查看提交历史")
|
||||
print("2. 使用 ./agents/stats.sh 查看agent统计")
|
||||
print("3. 开始你自己的多agent协作项目!")
|
||||
|
||||
# 询问是否清理
|
||||
response = input("\n是否清理演示文件?(y/N): ")
|
||||
if response.lower() == 'y':
|
||||
demo.cleanup_demo()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
|
@ -1,314 +0,0 @@
|
|||
"""
|
||||
Git 协作管理系统
|
||||
管理 Agent 之间基于 Git 的真实协作
|
||||
"""
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
import json
|
||||
from pathlib import Path
|
||||
from typing import Dict, List, Optional, Tuple, Any
|
||||
from dataclasses import dataclass
|
||||
import logging
|
||||
from .identity_manager import AgentIdentityManager
|
||||
|
||||
@dataclass
|
||||
class Repository:
|
||||
"""仓库信息"""
|
||||
name: str
|
||||
local_path: str
|
||||
remotes: Dict[str, str] # remote_name -> url
|
||||
current_agent: Optional[str] = None
|
||||
|
||||
class GitCollaborationManager:
|
||||
"""Git 协作管理器"""
|
||||
|
||||
def __init__(self, identity_manager: AgentIdentityManager):
|
||||
self.identity_manager = identity_manager
|
||||
self.logger = logging.getLogger(__name__)
|
||||
self.repositories = {}
|
||||
self._load_repositories()
|
||||
|
||||
def _load_repositories(self):
|
||||
"""加载仓库配置"""
|
||||
config_file = Path("config/repositories.json")
|
||||
if config_file.exists():
|
||||
with open(config_file, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
self.repositories = {
|
||||
name: Repository(**repo_data)
|
||||
for name, repo_data in data.items()
|
||||
}
|
||||
|
||||
def _save_repositories(self):
|
||||
"""保存仓库配置"""
|
||||
config_file = Path("config/repositories.json")
|
||||
config_file.parent.mkdir(exist_ok=True)
|
||||
|
||||
data = {
|
||||
name: {
|
||||
'name': repo.name,
|
||||
'local_path': repo.local_path,
|
||||
'remotes': repo.remotes,
|
||||
'current_agent': repo.current_agent
|
||||
}
|
||||
for name, repo in self.repositories.items()
|
||||
}
|
||||
|
||||
with open(config_file, 'w', encoding='utf-8') as f:
|
||||
json.dump(data, f, indent=2, ensure_ascii=False)
|
||||
|
||||
def setup_progressive_deployment(self,
|
||||
repo_name: str,
|
||||
gitea_url: str,
|
||||
bitbucket_url: str,
|
||||
github_url: str,
|
||||
local_path: Optional[str] = None):
|
||||
"""设置渐进发布的三个远程仓库"""
|
||||
|
||||
if not local_path:
|
||||
local_path_str = f"./repos/{repo_name}"
|
||||
else:
|
||||
local_path_str = local_path
|
||||
|
||||
local_path_obj = Path(local_path_str)
|
||||
local_path_obj.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# 初始化本地仓库(如果不存在)
|
||||
if not (local_path_obj / ".git").exists():
|
||||
subprocess.run(["git", "init"], cwd=local_path)
|
||||
|
||||
# 设置远程仓库
|
||||
remotes = {
|
||||
"gitea": gitea_url,
|
||||
"bitbucket": bitbucket_url,
|
||||
"github": github_url
|
||||
}
|
||||
|
||||
for remote_name, remote_url in remotes.items():
|
||||
# 检查远程是否已存在
|
||||
result = subprocess.run([
|
||||
"git", "remote", "get-url", remote_name
|
||||
], cwd=local_path, capture_output=True, text=True)
|
||||
|
||||
if result.returncode != 0:
|
||||
# 添加新的远程
|
||||
subprocess.run([
|
||||
"git", "remote", "add", remote_name, remote_url
|
||||
], cwd=local_path)
|
||||
else:
|
||||
# 更新现有远程
|
||||
subprocess.run([
|
||||
"git", "remote", "set-url", remote_name, remote_url
|
||||
], cwd=local_path)
|
||||
|
||||
# 创建仓库记录
|
||||
repository = Repository(
|
||||
name=repo_name,
|
||||
local_path=str(local_path),
|
||||
remotes=remotes
|
||||
)
|
||||
|
||||
self.repositories[repo_name] = repository
|
||||
self._save_repositories()
|
||||
|
||||
self.logger.info(f"设置渐进发布仓库: {repo_name}")
|
||||
return repository
|
||||
|
||||
def switch_agent_context(self, repo_name: str, agent_name: str):
|
||||
"""切换仓库的 Agent 上下文"""
|
||||
if repo_name not in self.repositories:
|
||||
raise ValueError(f"仓库 {repo_name} 不存在")
|
||||
|
||||
repository = self.repositories[repo_name]
|
||||
|
||||
# 设置 Git 配置
|
||||
self.identity_manager.setup_git_config(agent_name, repository.local_path)
|
||||
|
||||
# 设置 SSH 密钥
|
||||
identity = self.identity_manager.get_agent_identity(agent_name)
|
||||
if identity:
|
||||
self._setup_ssh_agent(identity.ssh_key_path)
|
||||
|
||||
repository.current_agent = agent_name
|
||||
self._save_repositories()
|
||||
|
||||
self.logger.info(f"切换仓库 {repo_name} 到 Agent: {agent_name}")
|
||||
|
||||
def _setup_ssh_agent(self, ssh_key_path: str):
|
||||
"""设置 SSH Agent"""
|
||||
try:
|
||||
# 启动 ssh-agent(如果未运行)
|
||||
result = subprocess.run([
|
||||
"ssh-add", "-l"
|
||||
], capture_output=True, text=True)
|
||||
|
||||
if result.returncode != 0:
|
||||
# 启动 ssh-agent
|
||||
result = subprocess.run([
|
||||
"ssh-agent", "-s"
|
||||
], capture_output=True, text=True)
|
||||
|
||||
if result.returncode == 0:
|
||||
# 解析环境变量
|
||||
for line in result.stdout.split('\n'):
|
||||
if 'SSH_AUTH_SOCK' in line:
|
||||
sock = line.split('=')[1].split(';')[0]
|
||||
os.environ['SSH_AUTH_SOCK'] = sock
|
||||
elif 'SSH_AGENT_PID' in line:
|
||||
pid = line.split('=')[1].split(';')[0]
|
||||
os.environ['SSH_AGENT_PID'] = pid
|
||||
|
||||
# 添加 SSH 密钥
|
||||
subprocess.run(["ssh-add", ssh_key_path])
|
||||
|
||||
except Exception as e:
|
||||
self.logger.warning(f"SSH Agent 设置失败: {e}")
|
||||
|
||||
def commit_as_agent(self,
|
||||
repo_name: str,
|
||||
message: str,
|
||||
files: Optional[List[str]] = None,
|
||||
sign: bool = True) -> bool:
|
||||
"""以当前 Agent 身份提交代码"""
|
||||
|
||||
if repo_name not in self.repositories:
|
||||
raise ValueError(f"仓库 {repo_name} 不存在")
|
||||
|
||||
repository = self.repositories[repo_name]
|
||||
repo_path = Path(repository.local_path)
|
||||
|
||||
try:
|
||||
# 添加文件
|
||||
if files:
|
||||
for file in files:
|
||||
subprocess.run(["git", "add", file], cwd=repo_path)
|
||||
else:
|
||||
subprocess.run(["git", "add", "."], cwd=repo_path)
|
||||
|
||||
# 提交
|
||||
commit_cmd = ["git", "commit", "-m", message]
|
||||
if sign:
|
||||
commit_cmd.append("-S")
|
||||
|
||||
result = subprocess.run(commit_cmd, cwd=repo_path, capture_output=True, text=True)
|
||||
|
||||
if result.returncode == 0:
|
||||
self.logger.info(f"Agent {repository.current_agent} 提交成功: {message}")
|
||||
return True
|
||||
else:
|
||||
self.logger.error(f"提交失败: {result.stderr}")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"提交过程出错: {e}")
|
||||
return False
|
||||
|
||||
def progressive_push(self, repo_name: str, branch: str = "main") -> Dict[str, bool]:
|
||||
"""渐进式推送到三个平台"""
|
||||
|
||||
if repo_name not in self.repositories:
|
||||
raise ValueError(f"仓库 {repo_name} 不存在")
|
||||
|
||||
repository = self.repositories[repo_name]
|
||||
repo_path = Path(repository.local_path)
|
||||
|
||||
results = {}
|
||||
|
||||
# 按顺序推送:Gitea -> Bitbucket -> GitHub
|
||||
push_order = ["gitea", "bitbucket", "github"]
|
||||
|
||||
for remote in push_order:
|
||||
if remote in repository.remotes:
|
||||
try:
|
||||
result = subprocess.run([
|
||||
"git", "push", remote, branch
|
||||
], cwd=repo_path, capture_output=True, text=True)
|
||||
|
||||
results[remote] = result.returncode == 0
|
||||
|
||||
if result.returncode == 0:
|
||||
self.logger.info(f"推送到 {remote} 成功")
|
||||
else:
|
||||
self.logger.error(f"推送到 {remote} 失败: {result.stderr}")
|
||||
# 如果某个平台失败,停止后续推送
|
||||
break
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"推送到 {remote} 出错: {e}")
|
||||
results[remote] = False
|
||||
break
|
||||
|
||||
return results
|
||||
|
||||
def create_pull_request_workflow(self,
|
||||
repo_name: str,
|
||||
source_agent: str,
|
||||
target_agent: str,
|
||||
feature_branch: str,
|
||||
title: str,
|
||||
description: str = "") -> bool:
|
||||
"""创建 Agent 间的 Pull Request 工作流"""
|
||||
|
||||
repository = self.repositories[repo_name]
|
||||
repo_path = Path(repository.local_path)
|
||||
|
||||
try:
|
||||
# 1. 切换到源 Agent
|
||||
self.switch_agent_context(repo_name, source_agent)
|
||||
|
||||
# 2. 创建功能分支
|
||||
subprocess.run([
|
||||
"git", "checkout", "-b", feature_branch
|
||||
], cwd=repo_path)
|
||||
|
||||
# 3. 推送功能分支
|
||||
subprocess.run([
|
||||
"git", "push", "-u", "gitea", feature_branch
|
||||
], cwd=repo_path)
|
||||
|
||||
# 4. 这里可以集成 API 调用来创建实际的 PR
|
||||
# 具体实现取决于使用的 Git 平台
|
||||
|
||||
self.logger.info(f"创建 PR 工作流: {source_agent} -> {target_agent}")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"创建 PR 工作流失败: {e}")
|
||||
return False
|
||||
|
||||
def get_repository_status(self, repo_name: str) -> Dict[str, Any]:
|
||||
"""获取仓库状态"""
|
||||
if repo_name not in self.repositories:
|
||||
raise ValueError(f"仓库 {repo_name} 不存在")
|
||||
|
||||
repository = self.repositories[repo_name]
|
||||
repo_path = Path(repository.local_path)
|
||||
|
||||
status = {
|
||||
"current_agent": repository.current_agent,
|
||||
"branch": None,
|
||||
"uncommitted_changes": False,
|
||||
"remotes": repository.remotes
|
||||
}
|
||||
|
||||
try:
|
||||
# 获取当前分支
|
||||
result = subprocess.run([
|
||||
"git", "branch", "--show-current"
|
||||
], cwd=repo_path, capture_output=True, text=True)
|
||||
|
||||
if result.returncode == 0:
|
||||
status["branch"] = result.stdout.strip()
|
||||
|
||||
# 检查未提交的更改
|
||||
result = subprocess.run([
|
||||
"git", "status", "--porcelain"
|
||||
], cwd=repo_path, capture_output=True, text=True)
|
||||
|
||||
status["uncommitted_changes"] = bool(result.stdout.strip())
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"获取仓库状态失败: {e}")
|
||||
|
||||
return status
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
{
|
||||
"claude-ai": {
|
||||
"name": "claude-ai",
|
||||
"email": "claude@ai-collaboration.local",
|
||||
"role": "架构师",
|
||||
"ssh_key_path": "/home/ben/github/liurenchaxin/agents/keys/claude-ai_rsa",
|
||||
"gpg_key_id": "CLAUDE-AI12345678"
|
||||
},
|
||||
"gemini-dev": {
|
||||
"name": "gemini-dev",
|
||||
"email": "gemini@ai-collaboration.local",
|
||||
"role": "开发者",
|
||||
"ssh_key_path": "/home/ben/github/liurenchaxin/agents/keys/gemini-dev_rsa",
|
||||
"gpg_key_id": "GEMINI-DEV12345678"
|
||||
},
|
||||
"qwen-ops": {
|
||||
"name": "qwen-ops",
|
||||
"email": "qwen@ai-collaboration.local",
|
||||
"role": "运维",
|
||||
"ssh_key_path": "/home/ben/github/liurenchaxin/agents/keys/qwen-ops_rsa",
|
||||
"gpg_key_id": "QWEN-OPS12345678"
|
||||
},
|
||||
"llama-research": {
|
||||
"name": "llama-research",
|
||||
"email": "llama@ai-collaboration.local",
|
||||
"role": "研究员",
|
||||
"ssh_key_path": "/home/ben/github/liurenchaxin/agents/keys/llama-research_rsa",
|
||||
"gpg_key_id": "LLAMA-RESEARCH12345678"
|
||||
}
|
||||
}
|
||||
|
|
@ -1,237 +0,0 @@
|
|||
"""
|
||||
Agent Identity Management System
|
||||
管理多个 AI Agent 的身份信息,包括 SSH/GPG 密钥、Git 配置等
|
||||
"""
|
||||
|
||||
import os
|
||||
import json
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
from typing import Dict, List, Optional
|
||||
from dataclasses import dataclass, asdict
|
||||
import logging
|
||||
|
||||
@dataclass
|
||||
class AgentIdentity:
|
||||
"""Agent 身份信息"""
|
||||
name: str
|
||||
email: str
|
||||
ssh_key_path: str
|
||||
gpg_key_id: Optional[str] = None
|
||||
git_username: str = ""
|
||||
description: str = ""
|
||||
repositories: List[str] = None
|
||||
|
||||
def __post_init__(self):
|
||||
if self.repositories is None:
|
||||
self.repositories = []
|
||||
if not self.git_username:
|
||||
self.git_username = self.name.lower().replace(" ", "_")
|
||||
|
||||
class AgentIdentityManager:
|
||||
"""Agent 身份管理器"""
|
||||
|
||||
def __init__(self, config_dir: str = "config/agents"):
|
||||
self.config_dir = Path(config_dir)
|
||||
self.config_dir.mkdir(parents=True, exist_ok=True)
|
||||
self.identities_file = self.config_dir / "identities.json"
|
||||
self.ssh_keys_dir = self.config_dir / "ssh_keys"
|
||||
self.gpg_keys_dir = self.config_dir / "gpg_keys"
|
||||
|
||||
# 创建必要的目录
|
||||
self.ssh_keys_dir.mkdir(exist_ok=True)
|
||||
self.gpg_keys_dir.mkdir(exist_ok=True)
|
||||
|
||||
self.logger = logging.getLogger(__name__)
|
||||
self._load_identities()
|
||||
|
||||
def _load_identities(self):
|
||||
"""加载已有的身份信息"""
|
||||
if self.identities_file.exists():
|
||||
with open(self.identities_file, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
self.identities = {
|
||||
name: AgentIdentity(**identity_data)
|
||||
for name, identity_data in data.items()
|
||||
}
|
||||
else:
|
||||
self.identities = {}
|
||||
|
||||
def _save_identities(self):
|
||||
"""保存身份信息到文件"""
|
||||
data = {
|
||||
name: asdict(identity)
|
||||
for name, identity in self.identities.items()
|
||||
}
|
||||
with open(self.identities_file, 'w', encoding='utf-8') as f:
|
||||
json.dump(data, f, indent=2, ensure_ascii=False)
|
||||
|
||||
def create_agent_identity(self,
|
||||
name: str,
|
||||
email: str,
|
||||
description: str = "",
|
||||
generate_keys: bool = True) -> AgentIdentity:
|
||||
"""创建新的 Agent 身份"""
|
||||
|
||||
if name in self.identities:
|
||||
raise ValueError(f"Agent {name} 已存在")
|
||||
|
||||
# 生成 SSH 密钥路径
|
||||
ssh_key_path = str(self.ssh_keys_dir / f"{name.lower().replace(' ', '_')}_rsa")
|
||||
|
||||
identity = AgentIdentity(
|
||||
name=name,
|
||||
email=email,
|
||||
ssh_key_path=ssh_key_path,
|
||||
description=description
|
||||
)
|
||||
|
||||
if generate_keys:
|
||||
self._generate_ssh_key(identity)
|
||||
self._generate_gpg_key(identity)
|
||||
|
||||
self.identities[name] = identity
|
||||
self._save_identities()
|
||||
|
||||
self.logger.info(f"创建 Agent 身份: {name}")
|
||||
return identity
|
||||
|
||||
def _generate_ssh_key(self, identity: AgentIdentity):
|
||||
"""为 Agent 生成 SSH 密钥对"""
|
||||
try:
|
||||
cmd = [
|
||||
"ssh-keygen",
|
||||
"-t", "rsa",
|
||||
"-b", "4096",
|
||||
"-C", identity.email,
|
||||
"-f", identity.ssh_key_path,
|
||||
"-N", "" # 无密码
|
||||
]
|
||||
|
||||
result = subprocess.run(cmd, capture_output=True, text=True)
|
||||
if result.returncode != 0:
|
||||
raise Exception(f"SSH 密钥生成失败: {result.stderr}")
|
||||
|
||||
# 设置正确的权限
|
||||
os.chmod(identity.ssh_key_path, 0o600)
|
||||
os.chmod(f"{identity.ssh_key_path}.pub", 0o644)
|
||||
|
||||
self.logger.info(f"为 {identity.name} 生成 SSH 密钥: {identity.ssh_key_path}")
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"SSH 密钥生成失败: {e}")
|
||||
raise
|
||||
|
||||
def _generate_gpg_key(self, identity: AgentIdentity):
|
||||
"""为 Agent 生成 GPG 密钥"""
|
||||
try:
|
||||
# GPG 密钥生成配置
|
||||
gpg_config = f"""
|
||||
Key-Type: RSA
|
||||
Key-Length: 4096
|
||||
Subkey-Type: RSA
|
||||
Subkey-Length: 4096
|
||||
Name-Real: {identity.name}
|
||||
Name-Email: {identity.email}
|
||||
Expire-Date: 0
|
||||
%no-protection
|
||||
%commit
|
||||
"""
|
||||
|
||||
# 写入临时配置文件
|
||||
config_file = self.gpg_keys_dir / f"{identity.git_username}_gpg_config"
|
||||
with open(config_file, 'w') as f:
|
||||
f.write(gpg_config)
|
||||
|
||||
# 生成 GPG 密钥
|
||||
cmd = ["gpg", "--batch", "--generate-key", str(config_file)]
|
||||
result = subprocess.run(cmd, capture_output=True, text=True)
|
||||
|
||||
if result.returncode != 0:
|
||||
self.logger.warning(f"GPG 密钥生成失败: {result.stderr}")
|
||||
return
|
||||
|
||||
# 获取生成的密钥 ID
|
||||
cmd = ["gpg", "--list-secret-keys", "--keyid-format", "LONG", identity.email]
|
||||
result = subprocess.run(cmd, capture_output=True, text=True)
|
||||
|
||||
if result.returncode == 0:
|
||||
# 解析密钥 ID
|
||||
lines = result.stdout.split('\n')
|
||||
for line in lines:
|
||||
if 'sec' in line and 'rsa4096/' in line:
|
||||
key_id = line.split('rsa4096/')[1].split(' ')[0]
|
||||
identity.gpg_key_id = key_id
|
||||
break
|
||||
|
||||
# 清理临时文件
|
||||
config_file.unlink()
|
||||
|
||||
self.logger.info(f"为 {identity.name} 生成 GPG 密钥: {identity.gpg_key_id}")
|
||||
|
||||
except Exception as e:
|
||||
self.logger.warning(f"GPG 密钥生成失败: {e}")
|
||||
|
||||
def get_agent_identity(self, name: str) -> Optional[AgentIdentity]:
|
||||
"""获取 Agent 身份信息"""
|
||||
return self.identities.get(name)
|
||||
|
||||
def list_agents(self) -> List[str]:
|
||||
"""列出所有 Agent"""
|
||||
return list(self.identities.keys())
|
||||
|
||||
def setup_git_config(self, agent_name: str, repo_path: str = "."):
|
||||
"""为指定仓库设置 Agent 的 Git 配置"""
|
||||
identity = self.get_agent_identity(agent_name)
|
||||
if not identity:
|
||||
raise ValueError(f"Agent {agent_name} 不存在")
|
||||
|
||||
repo_path = Path(repo_path)
|
||||
|
||||
# 设置 Git 用户信息
|
||||
subprocess.run([
|
||||
"git", "config", "--local", "user.name", identity.name
|
||||
], cwd=repo_path)
|
||||
|
||||
subprocess.run([
|
||||
"git", "config", "--local", "user.email", identity.email
|
||||
], cwd=repo_path)
|
||||
|
||||
# 设置 GPG 签名
|
||||
if identity.gpg_key_id:
|
||||
subprocess.run([
|
||||
"git", "config", "--local", "user.signingkey", identity.gpg_key_id
|
||||
], cwd=repo_path)
|
||||
|
||||
subprocess.run([
|
||||
"git", "config", "--local", "commit.gpgsign", "true"
|
||||
], cwd=repo_path)
|
||||
|
||||
self.logger.info(f"为仓库 {repo_path} 设置 {agent_name} 的 Git 配置")
|
||||
|
||||
def get_ssh_public_key(self, agent_name: str) -> str:
|
||||
"""获取 Agent 的 SSH 公钥"""
|
||||
identity = self.get_agent_identity(agent_name)
|
||||
if not identity:
|
||||
raise ValueError(f"Agent {agent_name} 不存在")
|
||||
|
||||
pub_key_path = f"{identity.ssh_key_path}.pub"
|
||||
if not os.path.exists(pub_key_path):
|
||||
raise FileNotFoundError(f"SSH 公钥文件不存在: {pub_key_path}")
|
||||
|
||||
with open(pub_key_path, 'r') as f:
|
||||
return f.read().strip()
|
||||
|
||||
def export_gpg_public_key(self, agent_name: str) -> str:
|
||||
"""导出 Agent 的 GPG 公钥"""
|
||||
identity = self.get_agent_identity(agent_name)
|
||||
if not identity or not identity.gpg_key_id:
|
||||
raise ValueError(f"Agent {agent_name} 没有 GPG 密钥")
|
||||
|
||||
cmd = ["gpg", "--armor", "--export", identity.gpg_key_id]
|
||||
result = subprocess.run(cmd, capture_output=True, text=True)
|
||||
|
||||
if result.returncode != 0:
|
||||
raise Exception(f"GPG 公钥导出失败: {result.stderr}")
|
||||
|
||||
return result.stdout
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
-----BEGIN OPENSSH PRIVATE KEY-----
|
||||
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
|
||||
-----END OPENSSH PRIVATE KEY-----
|
||||
|
|
@ -1 +0,0 @@
|
|||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDDEVNGzV1W/FZs9BULLAb/qabDQ0BrsIyp5yV7D7ImJKA260o8r8K0Dwktyizn1qmoIdTVn2/PD7t0BbD4E5XIddsIGof35TvHksjpA29dySOEqQihp+M9PPZWvnUAou3S7sQQ96ARPJJsmhhy+55fT5+XxWxu/bTGYpCFg9ZjeftzTfvWFKvZznGopafUTKprSavIsfriedEukmgveoQ/PF7692Ovf/ypX0JgRqTZ62yIZN0H4q9R4+9f05kuLte63i1xMO2MujqIAbsP7S/1fyIIg8/jHq0XejMm2r+QOIhrDRiv+AiNoQyGrtDfD49/L2HHT3h1aIQpbxEHJOX5wdSRvdXxWH1pteCU9zc01mOVJVWpWWlgvqJ/s0J6qarD1ecgIjhwRKCd6sCs21ShbrD5kATpVYp4mSpqK1Hf6J4UDLkOJYrFFBXkjdiHI4jCA92amsJg9TUbdpIELFreq7wCVAz9Wb4d+si0snQNVg0xuwEDIEoB+mNSMKaTH4KWwCcpD7dKd5CMkcIhGxzL4yVMoo6lvBnAGILrzmNZWbwAUJJX62aGVU2HGBQGVWs75zJbWjLKmTVban20SrE4woWVlh8+KzF2tGbGVjnAfpCcYVHetXcoHBCUbkFEjN9tD/nhxxyyKE8ZtgZ2d2OB5M9vryhgwBgaC5ki0LD4iQ== claude@ai-collaboration.local
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
-----BEGIN OPENSSH PRIVATE KEY-----
|
||||
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
|
||||
-----END OPENSSH PRIVATE KEY-----
|
||||
|
|
@ -1 +0,0 @@
|
|||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCi7jZJ6mBTXgtfh4cTgyq182iOhFl4aJmbKlrtZSktvFZh18Vw83rBUx5AOxg97VD5pxTeNpYVtDE3hO5zUnqPpKBub3TtCJ3XhmB80j8PYmTEhNZ5FL00efowxC/U4W+RHCcAdL3rAQB05Lhd7A4lMXj/04gO4/Z2XZAIbqSmU+KHf8u8Dwo7MWdYfC3HyiisAdBpr6RLY6PbMroKKMTEycWG2cYHBvdqgpXva4yl1LDTMSHScC55su1sZDtVKpk7X/bnNdzP0Av/BZjQLizK0nEBDbohV3plblr1LBJlIwgWv/BbL757qdnOIlubiVz+Jb5Sni12JUzbENwJvp+3fGoILZcl14NXSCzVmrEUvIaGtoLo4oCRac66+K8tgQDsvoY6T58tlTRPLCeOtEeFHiE3K4TYxhvRQwC8HP7RfBBa3PTyPZ2CSGgOtp3VmxsZFpqmJw09a3l++B8SmS0L8AmGj08YZuOkDWbV/Unm6JCzUtxxg1g/x66/YANZqWazgA77Gumr+UeJl2g40tgQxgwpkkZXjWe629FtLUZjvKdNQQ+3/Vq6Tk9nz1S202StXnrDY5ayWxhtG4LqQmW9oZ6hOQ5mWUvWghSskxXYTLZtfqc0SYYrTYU4fvMRKg9okLrjV3ZcGgYr36vmRB3JLjh3Vs7R9CoI/+o7CxY8LQ== gemini@ai-collaboration.local
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
-----BEGIN OPENSSH PRIVATE KEY-----
|
||||
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
|
||||
-----END OPENSSH PRIVATE KEY-----
|
||||
|
|
@ -1 +0,0 @@
|
|||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDBzcrx/q/zx/HPbsji5dIlBth+Ro6wyAapaPRnIoB1eUEbGv0Z0gDs9TQu750GBQfernHSw/qOtxyeDqGp1P5RerL3SV8Llksb9v+DdjSKtSaauww4RQqxMVsDc0ituhXHj7VbBUNFck88b0MGz8uQnPCE3QT8tX/1tSzUgAugKuIIMe5Dx2HglyeTfzQSfVwvkUFuCIV2bD+HHer8CNViBcrbE5xh1qXDXb/gQ0jds+nFCCcdSC/9DCdTIzHhUIBkWu0MeXFVKzteLkFeQ6jPFFc5SCj2AZpFk4G7FYKRGWnu6JzSb6sn1jC4t+UG2h8yzJ0/naJ8mi91tnoft7klIjKaVj0GAzhNyYyrFmW18yiR1ZwkEFq23kh+BS588vimyy39EFvVUBkYGc044xRR+zu/TrkVRzv2Py0l0Z//5VHByaVN+qsgd9Yui/w2xN/gsZBNe9XQvOkzmNVF96v8nUdOjs9oSHRoqOg5ERtRXURRYrMeqAdcC/l7+iW9t3yZlZOaTc5qqOzwTZgxtckr7eRGy9Ap7ah9Op+pV+q86vPjHlx2iK5SM1DHCw2WWeSZ6w/q4stJaDyJ82vwe8rviotLhFbtWJhUuCZvIyJvJKtBQ3YKQjNAbosrKQNvcfA2jKm44TESCG0pPyeKy3w2p76wd+eKGJr1YpLgX5QFKw== llama@ai-collaboration.local
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
-----BEGIN OPENSSH PRIVATE KEY-----
|
||||
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
|
||||
-----END OPENSSH PRIVATE KEY-----
|
||||
|
|
@ -1 +0,0 @@
|
|||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDOapLyoJP6EELcpqEbAFxTGBhOXf5f9BM4Unz5cl0A3sSryj2jROBMegXRf0dFrTJoiHcTrY0o+agzZ3resMARKNZoQZc1rtN/1KQf3acducJiAZ1GZNSCDlLHKp2WDXncoyuL1X58/tZJA+/Qb2DyixHbY2fxVaDPUpMP4IJSQg8MLgTOstXIAZ9GYHA2naVf9uJuNq+GotqgK5+KcToyjueXVCVCQvrhrCCIgc2QNjSm3odbw1Dx9h0tDbT5jTpVrsZY1681P6EVekyUhb8lm6IuOcXWTooltM3OOQfSFDtBRKl5iYBmmm53jDtcA86X8A7eSjrFaoRcufuOxHhIIQ1RIU9yNdLTtgm3nQUwe00siZcX/WTusmCK9tRGOw8hvPqyD0xwtN3i9lrtjkA0JgRTGhhbea3cmjESlVLAPPaTvxSsHeQJZnzWEydm0AadzQ3i+kHQV9OvrSkVdhKNS0zFHq6rBnYMNHijvGNPMEWAiVfZwPYwAnPpMB0kczeH4TfMeCXja7ro22ulEnrCQIQKGX2Mnq14TmmSQhM8iHMtOMqdd1SecI17b0bp5icd79VVkdCbe5IrdHNmq++vmG7731frItyiBoxnFVFPZMzhBJnogQ4oqf5ZQSeOcKkkVrG1Xvo8H284mCjveGuvwiqveGY1EpLBjeQql9Pnaw== qwen@ai-collaboration.local
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
#!/bin/bash
|
||||
# Agent提交前的钩子
|
||||
|
||||
echo "🔍 检查agent身份..."
|
||||
AGENT_NAME=$(git config user.name)
|
||||
if [[ -z "$AGENT_NAME" ]]; then
|
||||
echo "❌ 未设置agent身份,请先使用agent协作系统"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ 当前agent: $AGENT_NAME"
|
||||
|
|
@ -1,167 +0,0 @@
|
|||
#!/bin/bash
|
||||
# Agent协作系统设置脚本
|
||||
# 为一人公司创建多agent git协作环境
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 设置AI Agent协作系统..."
|
||||
|
||||
# 创建必要的目录
|
||||
mkdir -p agents/keys
|
||||
mkdir -p agents/logs
|
||||
|
||||
# 设置权限
|
||||
chmod 700 agents/keys
|
||||
|
||||
# 检查依赖
|
||||
check_dependency() {
|
||||
if ! command -v $1 &> /dev/null; then
|
||||
echo "❌ 需要安装: $1"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
check_dependency "git"
|
||||
check_dependency "ssh-keygen"
|
||||
|
||||
echo "✅ 依赖检查通过"
|
||||
|
||||
# 初始化agent身份管理器
|
||||
echo "🤖 初始化agent身份..."
|
||||
python3 agents/agent_identity_manager.py
|
||||
|
||||
# 创建git hooks模板
|
||||
cat > agents/pre-commit-hook << 'EOF'
|
||||
#!/bin/bash
|
||||
# Agent提交前的钩子
|
||||
|
||||
echo "🔍 检查agent身份..."
|
||||
AGENT_NAME=$(git config user.name)
|
||||
if [[ -z "$AGENT_NAME" ]]; then
|
||||
echo "❌ 未设置agent身份,请先使用agent协作系统"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ 当前agent: $AGENT_NAME"
|
||||
EOF
|
||||
|
||||
chmod +x agents/pre-commit-hook
|
||||
|
||||
# 创建快速切换脚本
|
||||
cat > agents/switch_agent.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
# 快速切换agent身份
|
||||
|
||||
if [[ $# -eq 0 ]]; then
|
||||
echo "用法: ./switch_agent.sh <agent名称>"
|
||||
echo "可用agents:"
|
||||
python3 -c "
|
||||
import sys
|
||||
sys.path.append('agents')
|
||||
from agent_identity_manager import AgentIdentityManager
|
||||
manager = AgentIdentityManager()
|
||||
for agent in manager.list_agents():
|
||||
print(f' - {agent[\"name\"]} ({agent[\"role\"]})')
|
||||
"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
AGENT_NAME=$1
|
||||
echo "🔄 切换到agent: $AGENT_NAME"
|
||||
python3 -c "
|
||||
import sys
|
||||
sys.path.append('agents')
|
||||
from agent_identity_manager import AgentIdentityManager
|
||||
manager = AgentIdentityManager()
|
||||
try:
|
||||
manager.switch_to_agent('$AGENT_NAME')
|
||||
print('✅ 切换成功')
|
||||
except Exception as e:
|
||||
print(f'❌ 切换失败: {e}')
|
||||
exit(1)
|
||||
"
|
||||
EOF
|
||||
|
||||
chmod +x agents/switch_agent.sh
|
||||
|
||||
# 创建agent提交脚本
|
||||
cat > agents/commit_as_agent.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
# 以指定agent身份提交
|
||||
|
||||
if [[ $# -lt 2 ]]; then
|
||||
echo "用法: ./commit_as_agent.sh <agent名称> \"提交信息\" [文件...]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
AGENT_NAME=$1
|
||||
MESSAGE=$2
|
||||
shift 2
|
||||
FILES=$@
|
||||
|
||||
echo "📝 Agent $AGENT_NAME 正在提交..."
|
||||
python3 -c "
|
||||
import sys
|
||||
sys.path.append('agents')
|
||||
from agent_identity_manager import AgentIdentityManager
|
||||
manager = AgentIdentityManager()
|
||||
try:
|
||||
manager.commit_as_agent('$AGENT_NAME', '$MESSAGE', '$FILES'.split() if '$FILES' else None)
|
||||
print('✅ 提交成功')
|
||||
except Exception as e:
|
||||
print(f'❌ 提交失败: {e}')
|
||||
exit(1)
|
||||
"
|
||||
EOF
|
||||
|
||||
chmod +x agents/commit_as_agent.sh
|
||||
|
||||
# 创建统计脚本
|
||||
cat > agents/stats.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
# 查看agent统计信息
|
||||
|
||||
echo "📊 Agent协作统计"
|
||||
echo "=================="
|
||||
|
||||
python3 -c "
|
||||
import sys
|
||||
sys.path.append('agents')
|
||||
from agent_identity_manager import AgentIdentityManager
|
||||
manager = AgentIdentityManager()
|
||||
|
||||
for agent in manager.list_agents():
|
||||
name = agent['name']
|
||||
stats = manager.get_agent_stats(name)
|
||||
print(f'👤 {name} ({agent["role"]})')
|
||||
print(f' 📧 {agent["email"]}')
|
||||
print(f' 📈 提交数: {stats["total_commits"]}')
|
||||
if stats["commits"]:
|
||||
print(f' 📝 最近提交: {stats["commits"][0]}')
|
||||
print()
|
||||
"
|
||||
EOF
|
||||
|
||||
chmod +x agents/stats.sh
|
||||
|
||||
echo "🎉 设置完成!"
|
||||
echo ""
|
||||
echo "📋 使用说明:"
|
||||
echo "1. 查看agent列表: ./agents/stats.sh"
|
||||
echo "2. 切换agent: ./agents/switch_agent.sh <agent名称>"
|
||||
echo "3. agent提交: ./agents/commit_as_agent.sh <agent名称> \"消息\""
|
||||
echo "4. 查看统计: ./agents/stats.sh"
|
||||
echo ""
|
||||
echo "🔑 SSH公钥位置:"
|
||||
for key in agents/keys/*_rsa.pub; do
|
||||
if [[ -f "$key" ]]; then
|
||||
agent_name=$(basename "$key" _rsa.pub)
|
||||
echo " $agent_name: $key"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "💡 下一步:"
|
||||
echo "1. 将SSH公钥添加到GitHub/Gitea/Bitbucket"
|
||||
echo "2. 测试agent切换和提交功能"
|
||||
echo "3. 开始真正的多agent协作开发!"
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
#!/bin/bash
|
||||
# 查看agent统计信息
|
||||
|
||||
echo "📊 Agent协作统计"
|
||||
echo "=================="
|
||||
|
||||
python3 -c "
|
||||
import sys
|
||||
sys.path.append('agents')
|
||||
from agent_identity_manager import AgentIdentityManager
|
||||
manager = AgentIdentityManager()
|
||||
|
||||
for agent in manager.list_agents():
|
||||
name = agent['name']
|
||||
stats = manager.get_agent_stats(name)
|
||||
print(f'👤 {name} ({agent["role"]})')
|
||||
print(f' 📧 {agent["email"]}')
|
||||
print(f' 📈 提交数: {stats["total_commits"]}')
|
||||
if stats["commits"]:
|
||||
print(f' 📝 最近提交: {stats["commits"][0]}')
|
||||
print()
|
||||
"
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
#!/bin/bash
|
||||
# 快速切换agent身份
|
||||
|
||||
if [[ $# -eq 0 ]]; then
|
||||
echo "用法: ./switch_agent.sh <agent名称>"
|
||||
echo "可用agents:"
|
||||
python3 -c "
|
||||
import sys
|
||||
sys.path.append('agents')
|
||||
from agent_identity_manager import AgentIdentityManager
|
||||
manager = AgentIdentityManager()
|
||||
for agent in manager.list_agents():
|
||||
print(f' - {agent[\"name\"]} ({agent[\"role\"]})')
|
||||
"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
AGENT_NAME=$1
|
||||
echo "🔄 切换到agent: $AGENT_NAME"
|
||||
python3 -c "
|
||||
import sys
|
||||
sys.path.append('agents')
|
||||
from agent_identity_manager import AgentIdentityManager
|
||||
manager = AgentIdentityManager()
|
||||
try:
|
||||
manager.switch_to_agent('$AGENT_NAME')
|
||||
print('✅ 切换成功')
|
||||
except Exception as e:
|
||||
print(f'❌ 切换失败: {e}')
|
||||
exit(1)
|
||||
"
|
||||
|
|
@ -9,27 +9,9 @@ from typing import Dict, Any, List
|
|||
project_root = Path(__file__).parent.parent.parent
|
||||
sys.path.insert(0, str(project_root))
|
||||
|
||||
try:
|
||||
from google.adk import Agent, Runner
|
||||
from google.adk.sessions import InMemorySessionService, Session
|
||||
from google.genai import types
|
||||
ADK_AVAILABLE = True
|
||||
except ImportError:
|
||||
ADK_AVAILABLE = False
|
||||
# 创建占位符类
|
||||
class Agent:
|
||||
pass
|
||||
class Runner:
|
||||
pass
|
||||
class InMemorySessionService:
|
||||
pass
|
||||
class Session:
|
||||
pass
|
||||
class types:
|
||||
class Content:
|
||||
pass
|
||||
class Part:
|
||||
pass
|
||||
|
||||
async def _get_llm_reply(runner: Runner, session: Session, prompt: str) -> str:
|
||||
"""Helper function to call a Runner and get a text reply."""
|
||||
|
|
@ -131,22 +113,6 @@ async def run_adk_debate_streamlit(topic: str, participants: List[str], rounds:
|
|||
|
||||
def render_adk_debate_tab():
|
||||
"""Renders the Streamlit UI for the ADK Debate tab."""
|
||||
|
||||
# 检查 ADK 是否可用
|
||||
if not ADK_AVAILABLE:
|
||||
st.error("🚫 Google ADK 模块未安装或不可用")
|
||||
st.info("📦 正在安装 Google ADK,请稍候...")
|
||||
st.info("💡 安装完成后请刷新页面")
|
||||
|
||||
with st.expander("📋 安装说明"):
|
||||
st.code("""
|
||||
# 安装 Google ADK
|
||||
pip install google-adk>=1.12.0
|
||||
|
||||
# 或从 GitHub 安装开发版
|
||||
pip install git+https://github.com/google/adk-python.git@main
|
||||
""")
|
||||
return
|
||||
st.markdown("### 🏛️ 八仙论道 (ADK版 - 太上老君主持)")
|
||||
|
||||
topic = st.text_input(
|
||||
|
|
|
|||
|
|
@ -1,15 +0,0 @@
|
|||
# 新功能架构设计
|
||||
|
||||
## 概述
|
||||
设计一个智能监控系统,用于跟踪AI agent的工作状态。
|
||||
|
||||
## 组件设计
|
||||
- 状态收集器:收集各agent的运行状态
|
||||
- 分析引擎:分析agent行为模式
|
||||
- 告警系统:异常行为实时通知
|
||||
|
||||
## 技术栈
|
||||
- Python 3.9+
|
||||
- Redis作为消息队列
|
||||
- PostgreSQL存储状态数据
|
||||
- FastAPI提供REST接口
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
version: '3.8'
|
||||
services:
|
||||
agent-monitor:
|
||||
build: .
|
||||
ports:
|
||||
- "8000:8000"
|
||||
environment:
|
||||
- REDIS_URL=redis://redis:6379
|
||||
- DB_URL=postgresql://user:pass@postgres:5432/agentdb
|
||||
depends_on:
|
||||
- redis
|
||||
- postgres
|
||||
|
||||
redis:
|
||||
image: redis:alpine
|
||||
ports:
|
||||
- "6379:6379"
|
||||
|
||||
postgres:
|
||||
image: postgres:13
|
||||
environment:
|
||||
POSTGRES_DB: agentdb
|
||||
POSTGRES_USER: user
|
||||
POSTGRES_PASSWORD: pass
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
import asyncio
|
||||
import json
|
||||
from datetime import datetime
|
||||
from typing import Dict, Any
|
||||
|
||||
class AgentMonitor:
|
||||
def __init__(self):
|
||||
self.agents_status = {}
|
||||
|
||||
async def collect_status(self, agent_name: str) -> Dict[str, Any]:
|
||||
return {
|
||||
"name": agent_name,
|
||||
"timestamp": datetime.now().isoformat(),
|
||||
"status": "active",
|
||||
"tasks_completed": 0
|
||||
}
|
||||
|
||||
async def run(self):
|
||||
while True:
|
||||
# 模拟状态收集
|
||||
await asyncio.sleep(1)
|
||||
|
||||
if __name__ == "__main__":
|
||||
monitor = AgentMonitor()
|
||||
asyncio.run(monitor.run())
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
# Agent监控系统使用指南
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 1. 启动监控服务
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### 2. 查看agent状态
|
||||
```bash
|
||||
curl http://localhost:8000/api/agents
|
||||
```
|
||||
|
||||
### 3. 配置告警
|
||||
编辑 `config/alerts.yaml` 文件设置告警规则。
|
||||
|
||||
## API文档
|
||||
|
||||
### GET /api/agents
|
||||
获取所有agent的当前状态
|
||||
|
||||
### POST /api/agents/{name}/task
|
||||
记录agent完成的任务
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
# 智能监控系统架构设计
|
||||
|
||||
## 系统概述
|
||||
设计一个分布式智能监控系统,支持实时数据采集和分析。
|
||||
|
||||
## 核心组件
|
||||
- 数据采集层
|
||||
- 实时处理引擎
|
||||
- 告警通知模块
|
||||
- 可视化仪表盘
|
||||
|
|
@ -1,100 +0,0 @@
|
|||
# 金丝雀/开发/测试部署策略
|
||||
|
||||
## 环境命名
|
||||
|
||||
根据新的命名约定,三个环境重新命名为:
|
||||
|
||||
- **canary** (金丝雀环境): `https://gitea.tailnet-68f9.ts.net/gitea/liurenchaxin.git`
|
||||
- **dev** (开发环境): `git@bitbucket.org:capitaltrain/liurenchaxin.git`
|
||||
- **beta** (测试环境): `https://github.com/jingminzhang/taigongxinyi.git`
|
||||
|
||||
## 环境用途
|
||||
|
||||
- **canary (金丝雀)**: 最新功能测试,早期验证
|
||||
- **dev (开发)**: 功能开发和集成测试
|
||||
- **beta (测试)**: 预发布测试,用户验收
|
||||
|
||||
## 部署流程
|
||||
|
||||
### 1. 日常开发流程
|
||||
|
||||
```bash
|
||||
# 在 canary 环境开发新功能
|
||||
git checkout main
|
||||
git pull canary main
|
||||
# 开发完成后
|
||||
git add .
|
||||
git commit -m "feat: 新功能描述"
|
||||
git push canary main
|
||||
```
|
||||
|
||||
### 2. 集成测试流程
|
||||
|
||||
```bash
|
||||
# 将功能从 canary 推送到 dev 环境
|
||||
git checkout main
|
||||
git pull dev main
|
||||
git merge main
|
||||
git push dev main
|
||||
```
|
||||
|
||||
### 3. 预发布流程
|
||||
|
||||
```bash
|
||||
# 将功能从 dev 推送到 beta 环境
|
||||
git checkout main
|
||||
git pull beta main
|
||||
git merge main
|
||||
git push beta main
|
||||
```
|
||||
|
||||
## 快速命令
|
||||
|
||||
### 发布新版本
|
||||
|
||||
```bash
|
||||
# 金丝雀环境发布
|
||||
./scripts/quick-release.sh 1.2.3 canary
|
||||
|
||||
# 开发环境发布
|
||||
./scripts/quick-release.sh 1.2.3 dev
|
||||
|
||||
# 测试环境发布
|
||||
./scripts/quick-release.sh 1.2.3 beta
|
||||
```
|
||||
|
||||
### 回滚操作
|
||||
|
||||
```bash
|
||||
# 回滚金丝雀环境
|
||||
./scripts/rollback.sh canary 1.2.2
|
||||
|
||||
# 回滚开发环境
|
||||
./scripts/rollback.sh dev 1.2.2
|
||||
|
||||
# 回滚测试环境
|
||||
./scripts/rollback.sh beta 1.2.2
|
||||
```
|
||||
|
||||
### 状态检查
|
||||
|
||||
```bash
|
||||
./scripts/check-status.sh
|
||||
```
|
||||
|
||||
## 分支策略
|
||||
|
||||
- **main**: 所有环境统一使用main分支
|
||||
|
||||
## 标签命名
|
||||
|
||||
- 金丝雀: `v1.2.3-canary`
|
||||
- 开发: `v1.2.3-dev`
|
||||
- 测试: `v1.2.3-beta`
|
||||
|
||||
## 优势
|
||||
|
||||
1. **清晰的命名**: canary/dev/beta 更符合行业标准
|
||||
2. **渐进发布**: 从金丝雀到测试的渐进式验证
|
||||
3. **快速回滚**: 每个环境都可以独立回滚
|
||||
4. **隔离性好**: 不同环境完全隔离,减少干扰
|
||||
|
|
@ -1,196 +0,0 @@
|
|||
# 六壬神鉴渐进发布流程图
|
||||
|
||||
## 🎯 发布流程概览
|
||||
|
||||
```
|
||||
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
||||
│ Development │ │ Staging │ │ Canary │ │ Production │
|
||||
│ (Gitea) │───▶│ (Bitbucket) │───▶│ (GitHub 10%) │───▶│ (GitHub 100%) │
|
||||
│ develop分支 │ │ staging分支 │ │ main分支 │ │ main分支 │
|
||||
└─────────────────┘ └──────────────────┘ └─────────────────┘ └─────────────────┘
|
||||
│ │ │ │
|
||||
│ │ │ │
|
||||
▼ ▼ ▼ ▼
|
||||
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
||||
│ 功能开发 │ │ 集成测试 │ │ 灰度验证 │ │ 全量发布 │
|
||||
│ 单元测试 │ │ 性能测试 │ │ 监控验证 │ │ 持续监控 │
|
||||
│ 代码审查 │ │ 安全扫描 │ │ 用户反馈 │ │ 性能优化 │
|
||||
└─────────────────┘ └──────────────────┘ └─────────────────┘ └─────────────────┘
|
||||
```
|
||||
|
||||
## 🚀 快速操作指南
|
||||
|
||||
### 1. 日常开发流程
|
||||
|
||||
#### 开始新功能开发
|
||||
```bash
|
||||
# 从 develop 分支创建功能分支
|
||||
git checkout develop
|
||||
git pull origin develop
|
||||
git checkout -b feature/new-feature
|
||||
|
||||
# 开发完成后
|
||||
git add .
|
||||
git commit -m "feat: 添加新功能"
|
||||
git push origin feature/new-feature
|
||||
|
||||
# 创建 PR 到 develop 分支
|
||||
# 在 Gitea 上创建 Pull Request
|
||||
```
|
||||
|
||||
#### 推送到开发环境
|
||||
```bash
|
||||
# 一键推送到 Gitea 开发环境
|
||||
git checkout develop
|
||||
git pull origin develop
|
||||
git merge feature/new-feature
|
||||
git push gitea develop
|
||||
```
|
||||
|
||||
### 2. 预发布流程
|
||||
|
||||
#### 准备 staging 发布
|
||||
```bash
|
||||
# 创建发布分支
|
||||
git checkout staging
|
||||
git merge develop
|
||||
git push staging staging:main
|
||||
|
||||
# 或使用快捷命令
|
||||
git deploy-staging
|
||||
```
|
||||
|
||||
#### 验证 staging 环境
|
||||
```bash
|
||||
# 检查 staging 状态
|
||||
./scripts/check-status.sh
|
||||
```
|
||||
|
||||
### 3. 灰度发布流程
|
||||
|
||||
#### 启动灰度发布
|
||||
```bash
|
||||
# 创建灰度版本
|
||||
git checkout main
|
||||
git merge staging
|
||||
git tag v1.2.0-canary
|
||||
git push origin main --tags
|
||||
```
|
||||
|
||||
#### 监控灰度状态
|
||||
```bash
|
||||
# 检查发布状态
|
||||
curl -s https://api.github.com/repos/jingminzhang/taigongxinyi/releases/latest
|
||||
```
|
||||
|
||||
### 4. 全量发布流程
|
||||
|
||||
#### 正式版本发布
|
||||
```bash
|
||||
# 使用快速发布脚本
|
||||
./scripts/quick-release.sh 1.2.0 prod
|
||||
|
||||
# 或手动操作
|
||||
git checkout main
|
||||
git tag v1.2.0
|
||||
git push origin main --tags
|
||||
git deploy-prod
|
||||
```
|
||||
|
||||
## 📊 发布检查清单
|
||||
|
||||
### 开发阶段检查
|
||||
- [ ] 代码通过单元测试
|
||||
- [ ] 功能测试完成
|
||||
- [ ] 代码审查通过
|
||||
- [ ] 文档已更新
|
||||
|
||||
### Staging 阶段检查
|
||||
- [ ] 集成测试通过
|
||||
- [ ] 性能测试完成
|
||||
- [ ] 安全扫描通过
|
||||
- [ ] 用户验收测试完成
|
||||
|
||||
### 灰度发布检查
|
||||
- [ ] 监控指标正常
|
||||
- [ ] 错误率 < 0.1%
|
||||
- [ ] 用户反馈良好
|
||||
- [ ] 业务指标稳定
|
||||
|
||||
### 全量发布检查
|
||||
- [ ] 灰度验证通过
|
||||
- [ ] 回滚方案就绪
|
||||
- [ ] 监控告警配置
|
||||
- [ ] 紧急联系清单
|
||||
|
||||
## 🔄 回滚操作
|
||||
|
||||
### 紧急回滚
|
||||
```bash
|
||||
# 快速回滚到指定版本
|
||||
./scripts/rollback.sh prod 1.1.9
|
||||
|
||||
# 或手动回滚
|
||||
git checkout v1.1.9
|
||||
git tag v1.2.0-rollback
|
||||
git push origin main --force
|
||||
```
|
||||
|
||||
### 回滚验证
|
||||
```bash
|
||||
# 检查回滚状态
|
||||
./scripts/check-status.sh
|
||||
```
|
||||
|
||||
## 📈 监控面板
|
||||
|
||||
### 关键指标监控
|
||||
- **系统性能**: CPU、内存、磁盘使用率
|
||||
- **应用性能**: 响应时间、吞吐量、错误率
|
||||
- **业务指标**: 用户活跃度、功能使用率
|
||||
|
||||
### 告警规则
|
||||
- 错误率 > 1% → 立即告警
|
||||
- 响应时间 > 1s → 立即告警
|
||||
- 服务不可用 → 立即告警
|
||||
|
||||
## 🛠️ 工具命令速查
|
||||
|
||||
| 操作 | 命令 | 说明 |
|
||||
|------|------|------|
|
||||
| 查看状态 | `./scripts/check-status.sh` | 检查所有环境状态 |
|
||||
| 快速发布 | `./scripts/quick-release.sh 版本号 环境` | 一键发布到指定环境 |
|
||||
| 紧急回滚 | `./scripts/rollback.sh 环境 版本号` | 快速回滚到指定版本 |
|
||||
| 推送到 staging | `git deploy-staging` | 推送到 Bitbucket staging |
|
||||
| 推送到 prod | `git deploy-prod` | 推送到 GitHub production |
|
||||
| 同步所有远程 | `git sync-all` | 同步所有远程仓库 |
|
||||
|
||||
## 📞 紧急联系
|
||||
|
||||
| 角色 | 联系方式 | 职责 |
|
||||
|------|----------|------|
|
||||
| 技术负责人 | ben@capitaltrain.cn | 技术决策、紧急响应 |
|
||||
| 运维团队 | ops@capitaltrain.cn | 部署、监控、故障处理 |
|
||||
| 产品团队 | product@capitaltrain.cn | 业务决策、用户沟通 |
|
||||
|
||||
## 🎓 最佳实践
|
||||
|
||||
### 1. 分支管理
|
||||
- 功能分支从 `develop` 创建
|
||||
- 发布分支从 `staging` 创建
|
||||
- 热修复分支从 `main` 创建
|
||||
|
||||
### 2. 版本命名
|
||||
- 主版本: 不兼容的重大更新
|
||||
- 次版本: 向后兼容的功能添加
|
||||
- 修订版本: bug修复和微小改进
|
||||
|
||||
### 3. 发布频率
|
||||
- 紧急修复: 随时发布
|
||||
- 常规更新: 每2周一次
|
||||
- 大版本更新: 每季度一次
|
||||
|
||||
### 4. 监控策略
|
||||
- 灰度期间: 24-48小时密切监控
|
||||
- 全量发布: 72小时持续监控
|
||||
- 日常运维: 实时告警监控
|
||||
|
|
@ -1,225 +0,0 @@
|
|||
# 六壬神鉴渐进发布计划
|
||||
|
||||
## 概述
|
||||
本计划基于当前的多环境 Git 配置,实现从开发到生产的渐进式发布流程。
|
||||
|
||||
## 环境架构
|
||||
|
||||
### 当前配置
|
||||
- **GitHub** (production): `https://github.com/jingminzhang/taigongxinyi.git`
|
||||
- **Bitbucket** (staging): `git@bitbucket.org:capitaltrain/liurenchaxin.git`
|
||||
- **Gitea** (development): `https://gitea.tailnet-68f9.ts.net/gitea/liurenchaxin.git`
|
||||
|
||||
### 分支策略
|
||||
```
|
||||
main (生产环境)
|
||||
├── staging (预发布环境)
|
||||
├── develop (开发环境)
|
||||
└── feature/* (功能分支)
|
||||
```
|
||||
|
||||
## 渐进发布阶段
|
||||
|
||||
### 阶段1:功能开发 (Development)
|
||||
**目标环境**: Gitea (development)
|
||||
**分支**: `feature/*` → `develop`
|
||||
|
||||
#### 流程
|
||||
1. 从 `develop` 分支创建功能分支
|
||||
2. 在功能分支上进行开发
|
||||
3. 完成功能后合并到 `develop`
|
||||
4. 推送到 Gitea 进行初步测试
|
||||
|
||||
#### 验证清单
|
||||
- [ ] 单元测试通过
|
||||
- [ ] 代码审查完成
|
||||
- [ ] 功能测试通过
|
||||
- [ ] 文档更新完成
|
||||
|
||||
### 阶段2:集成测试 (Staging)
|
||||
**目标环境**: Bitbucket (staging)
|
||||
**分支**: `develop` → `staging`
|
||||
|
||||
#### 流程
|
||||
1. 从 `develop` 分支创建发布分支 `release/vX.Y.Z`
|
||||
2. 在 staging 环境部署测试
|
||||
3. 进行集成测试和用户验收测试
|
||||
4. 修复发现的问题
|
||||
5. 合并到 `staging` 分支
|
||||
6. 推送到 Bitbucket staging 环境
|
||||
|
||||
#### 验证清单
|
||||
- [ ] 集成测试通过
|
||||
- [ ] 性能测试通过
|
||||
- [ ] 安全扫描通过
|
||||
- [ ] 用户验收测试完成
|
||||
- [ ] 回滚方案准备就绪
|
||||
|
||||
### 阶段3:灰度发布 (Canary)
|
||||
**目标环境**: GitHub production (10%流量)
|
||||
**分支**: `staging` → `main`
|
||||
|
||||
#### 流程
|
||||
1. 创建灰度发布标签 `vX.Y.Z-canary`
|
||||
2. 部署到生产环境 10% 流量
|
||||
3. 监控关键指标 24-48小时
|
||||
4. 根据监控结果决定全量发布或回滚
|
||||
|
||||
#### 监控指标
|
||||
- [ ] 错误率 < 0.1%
|
||||
- [ ] 响应时间 < 500ms
|
||||
- [ ] 用户满意度 > 95%
|
||||
- [ ] 业务指标正常
|
||||
|
||||
### 阶段4:全量发布 (Production)
|
||||
**目标环境**: GitHub production (100%流量)
|
||||
**分支**: `main`
|
||||
|
||||
#### 流程
|
||||
1. 创建正式版本标签 `vX.Y.Z`
|
||||
2. 全量部署到生产环境
|
||||
3. 持续监控 72小时
|
||||
4. 准备热修复方案
|
||||
|
||||
## 发布策略
|
||||
|
||||
### 版本命名规范
|
||||
- **主版本** (X.0.0): 重大功能更新或不兼容变更
|
||||
- **次版本** (X.Y.0): 新功能添加,向后兼容
|
||||
- **修订版本** (X.Y.Z): bug修复或小改进
|
||||
|
||||
### 发布频率
|
||||
- **紧急修复**: 随时发布
|
||||
- **常规更新**: 每2周一次
|
||||
- **大版本更新**: 每季度一次
|
||||
|
||||
### 回滚策略
|
||||
```bash
|
||||
# 快速回滚到上一个版本
|
||||
git revert HEAD
|
||||
git push origin main --force
|
||||
|
||||
# 或使用标签回滚
|
||||
git checkout vX.Y.Z-1
|
||||
git tag -a vX.Y.Z-rollback -m "Rollback to vX.Y.Z-1"
|
||||
git push origin vX.Y.Z-rollback
|
||||
```
|
||||
|
||||
## 自动化工具
|
||||
|
||||
### Git 钩子配置
|
||||
在 `.git/hooks/` 目录下创建以下钩子:
|
||||
|
||||
#### pre-push
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# 检查测试是否通过
|
||||
pytest tests/
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "测试未通过,禁止推送"
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
#### pre-commit
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# 代码格式检查
|
||||
black --check .
|
||||
flake8 .
|
||||
```
|
||||
|
||||
### CI/CD 配置
|
||||
创建 `.github/workflows/deploy.yml`:
|
||||
|
||||
```yaml
|
||||
name: Gradual Deployment
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [staging, main]
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Run tests
|
||||
run: |
|
||||
python -m pytest tests/
|
||||
|
||||
deploy-staging:
|
||||
needs: test
|
||||
if: github.ref == 'refs/heads/staging'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Deploy to staging
|
||||
run: echo "Deploying to staging..."
|
||||
|
||||
deploy-production:
|
||||
needs: test
|
||||
if: github.ref == 'refs/heads/main'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Deploy to production
|
||||
run: echo "Deploying to production..."
|
||||
```
|
||||
|
||||
## 监控和告警
|
||||
|
||||
### 关键指标
|
||||
- **系统指标**: CPU、内存、磁盘使用率
|
||||
- **应用指标**: 响应时间、错误率、吞吐量
|
||||
- **业务指标**: 用户活跃度、功能使用率
|
||||
|
||||
### 告警规则
|
||||
- 错误率 > 1% 触发告警
|
||||
- 响应时间 > 1秒 触发告警
|
||||
- 服务不可用 立即告警
|
||||
|
||||
## 发布检查清单
|
||||
|
||||
### 发布前检查
|
||||
- [ ] 所有测试通过
|
||||
- [ ] 代码审查完成
|
||||
- [ ] 文档已更新
|
||||
- [ ] 数据库迁移脚本准备就绪
|
||||
- [ ] 回滚方案已验证
|
||||
|
||||
### 发布后检查
|
||||
- [ ] 服务正常启动
|
||||
- [ ] 关键功能验证
|
||||
- [ ] 监控数据正常
|
||||
- [ ] 用户反馈收集
|
||||
- [ ] 性能指标对比
|
||||
|
||||
## 紧急响应
|
||||
|
||||
### 故障处理流程
|
||||
1. **发现故障** → 立即评估影响范围
|
||||
2. **5分钟内** → 决定是否回滚
|
||||
3. **10分钟内** → 执行回滚操作
|
||||
4. **30分钟内** → 修复问题并验证
|
||||
5. **1小时内** → 重新发布
|
||||
|
||||
### 联系方式
|
||||
- 技术负责人: ben@capitaltrain.cn
|
||||
- 运维团队: ops@capitaltrain.cn
|
||||
- 紧急热线: [待填写]
|
||||
|
||||
## 持续改进
|
||||
|
||||
### 发布回顾
|
||||
每次发布后一周内进行回顾会议:
|
||||
- 分析发布过程中的问题
|
||||
- 收集用户反馈
|
||||
- 更新发布流程
|
||||
- 优化监控指标
|
||||
|
||||
### 自动化改进
|
||||
- 逐步增加自动化测试覆盖率
|
||||
- 完善监控和告警系统
|
||||
- 优化部署脚本
|
||||
- 建立自动化回滚机制
|
||||
|
|
@ -1,446 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
四AI团队协作启动脚本
|
||||
快速启动和演示四AI协作系统
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
import json
|
||||
import logging
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
|
||||
from src.jixia.coordination.ai_team_collaboration import (
|
||||
AITeamCollaboration, AIRole, MessageType, CollaborationType, WorkPhase
|
||||
)
|
||||
|
||||
# 设置日志
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
||||
)
|
||||
|
||||
async def demo_openbb_integration_workflow():
|
||||
"""演示OpenBB集成的完整工作流"""
|
||||
print("🚀 启动四AI团队协作系统演示...")
|
||||
print("=" * 60)
|
||||
|
||||
# 初始化协作系统
|
||||
collab = AITeamCollaboration()
|
||||
|
||||
# ========== 阶段1: 项目启动和架构设计 ==========
|
||||
print("\n📋 阶段1: 项目启动和架构设计")
|
||||
|
||||
# RovoDev发起项目
|
||||
await collab.broadcast_message(
|
||||
sender=AIRole.ROVODEV,
|
||||
content="""🎯 **OpenBB集成项目正式启动!**
|
||||
|
||||
项目目标:将OpenBB金融数据平台与稷下学宫八仙论道系统深度融合
|
||||
|
||||
各AI职责分工:
|
||||
- Qwen: 架构设计师,负责系统架构和技术选型
|
||||
- Claude: 核心开发工程师,负责代码实现和API集成
|
||||
- Gemini: 测试验证专家,负责功能测试和质量保证
|
||||
- RovoDev: 项目整合专家,负责协调管理和文档整合
|
||||
|
||||
请大家查看各自的工作说明书,开始工作!""",
|
||||
message_type=MessageType.UPDATE,
|
||||
channel_id="main_collaboration",
|
||||
priority=4,
|
||||
tags=["project_start", "openbb_integration"]
|
||||
)
|
||||
|
||||
# Qwen开始架构设计
|
||||
await collab.send_message(
|
||||
sender=AIRole.QWEN,
|
||||
content="""🏗️ **架构设计开始**
|
||||
|
||||
我已经开始OpenBB集成的架构设计工作,主要包括:
|
||||
|
||||
1. **数据抽象层设计** - 统一OpenBB与八仙系统的数据接口
|
||||
2. **八仙数据路由** - 为每个八仙设计专属的数据获取策略
|
||||
3. **智能降级机制** - OpenBB不可用时的备选方案
|
||||
4. **性能优化架构** - 缓存和负载均衡策略
|
||||
|
||||
预计完成时间:2天
|
||||
需要其他AI配合:Claude提供实现可行性反馈""",
|
||||
message_type=MessageType.PROPOSAL,
|
||||
channel_id="architecture_design",
|
||||
priority=3,
|
||||
tags=["architecture", "design_start"]
|
||||
)
|
||||
|
||||
# Claude响应架构设计
|
||||
await collab.send_message(
|
||||
sender=AIRole.CLAUDE,
|
||||
content="""💻 **实现可行性评估**
|
||||
|
||||
Qwen的架构设计方向很好!从实现角度我有几个建议:
|
||||
|
||||
1. **延迟导入策略** - 确保OpenBB未安装时系统正常运行
|
||||
2. **异步数据处理** - 避免阻塞八仙论道的实时性
|
||||
3. **缓存层设计** - 减少重复的API调用
|
||||
4. **错误处理机制** - 优雅处理网络和数据异常
|
||||
|
||||
我可以在架构确定后立即开始实现工作。""",
|
||||
message_type=MessageType.ANSWER,
|
||||
channel_id="architecture_design",
|
||||
receiver=AIRole.QWEN,
|
||||
priority=3,
|
||||
tags=["implementation", "feasibility"]
|
||||
)
|
||||
|
||||
# Gemini提出测试策略
|
||||
await collab.send_message(
|
||||
sender=AIRole.GEMINI,
|
||||
content="""🧪 **测试策略制定**
|
||||
|
||||
基于当前的架构讨论,我已经开始制定测试策略:
|
||||
|
||||
1. **单元测试** - 覆盖八仙数据路由和OpenBB集成
|
||||
2. **集成测试** - 验证数据流和系统交互
|
||||
3. **性能测试** - 确保响应时间和并发处理能力
|
||||
4. **文化准确性测试** - 验证八仙特征的准确表达
|
||||
|
||||
需要架构文档确定后细化具体测试用例。""",
|
||||
message_type=MessageType.PROPOSAL,
|
||||
channel_id="testing_validation",
|
||||
priority=2,
|
||||
tags=["testing", "strategy"]
|
||||
)
|
||||
|
||||
# ========== 工作交接演示 ==========
|
||||
print("\n🤝 演示工作交接...")
|
||||
|
||||
# 推进到设计完成阶段
|
||||
await collab.advance_phase(WorkPhase.IMPLEMENTATION)
|
||||
|
||||
# Qwen向Claude交接
|
||||
await collab.handoff_work(
|
||||
from_ai=AIRole.QWEN,
|
||||
to_ai=AIRole.CLAUDE,
|
||||
task_description="基于架构设计实现OpenBB核心引擎",
|
||||
deliverables=[
|
||||
"src/jixia/engines/enhanced_openbb_engine.py",
|
||||
"src/jixia/adapters/immortal_data_processor.py",
|
||||
"app/tabs/enhanced_openbb_tab.py"
|
||||
],
|
||||
notes="""重点关注:
|
||||
1. 八仙数据偏好的准确实现
|
||||
2. 智能降级机制的稳定性
|
||||
3. 文化特色功能的完整性"""
|
||||
)
|
||||
|
||||
# Claude接受任务并开始实现
|
||||
await collab.send_message(
|
||||
sender=AIRole.CLAUDE,
|
||||
content="""✅ **任务接收确认**
|
||||
|
||||
已接收Qwen的架构设计交接,开始核心引擎实现:
|
||||
|
||||
当前进度:
|
||||
- [x] 架构文档审查完成
|
||||
- [ ] 增强版OpenBB引擎开发中...
|
||||
- [ ] 八仙数据适配器实现
|
||||
- [ ] Streamlit界面优化
|
||||
|
||||
预计完成时间:3天
|
||||
如有技术问题会在代码实现频道讨论。""",
|
||||
message_type=MessageType.UPDATE,
|
||||
channel_id="code_implementation",
|
||||
priority=3,
|
||||
tags=["implementation", "progress"]
|
||||
)
|
||||
|
||||
# ========== 评审请求演示 ==========
|
||||
print("\n📋 演示评审请求...")
|
||||
|
||||
await collab.request_review(
|
||||
sender=AIRole.CLAUDE,
|
||||
content="""📋 **代码评审请求**
|
||||
|
||||
已完成增强版OpenBB引擎的核心实现,请求评审:
|
||||
|
||||
主要特性:
|
||||
1. ✅ 八仙专属数据路由器
|
||||
2. ✅ 智能降级机制
|
||||
3. ✅ 异步数据处理
|
||||
4. ✅ 完整的错误处理
|
||||
|
||||
请重点关注:
|
||||
- 架构一致性 (Qwen)
|
||||
- 测试覆盖度 (Gemini)
|
||||
- 文档完整性 (RovoDev)""",
|
||||
reviewers=[AIRole.QWEN, AIRole.GEMINI, AIRole.ROVODEV],
|
||||
attachments=["src/jixia/engines/enhanced_openbb_engine.py"]
|
||||
)
|
||||
|
||||
# 各AI提供评审反馈
|
||||
await collab.send_message(
|
||||
sender=AIRole.QWEN,
|
||||
content="""🏗️ **架构评审反馈**
|
||||
|
||||
Claude的实现与架构设计高度一致!几个优化建议:
|
||||
|
||||
✅ 优点:
|
||||
- 八仙数据路由实现准确
|
||||
- 降级机制设计合理
|
||||
- 性能考虑周全
|
||||
|
||||
🔧 建议优化:
|
||||
- 可以增加更多的数据源provider
|
||||
- 缓存策略可以更加智能化
|
||||
- 考虑添加实时数据流支持
|
||||
|
||||
总体评分:9/10,建议通过!""",
|
||||
message_type=MessageType.REVIEW,
|
||||
channel_id="cross_review",
|
||||
receiver=AIRole.CLAUDE,
|
||||
priority=3,
|
||||
tags=["review", "architecture", "approved"]
|
||||
)
|
||||
|
||||
await collab.send_message(
|
||||
sender=AIRole.GEMINI,
|
||||
content="""🧪 **测试评审反馈**
|
||||
|
||||
从测试角度评估Claude的实现:
|
||||
|
||||
✅ 测试友好性:
|
||||
- 代码结构清晰,易于测试
|
||||
- 依赖注入设计良好
|
||||
- 异常处理完善
|
||||
|
||||
📋 测试建议:
|
||||
- 需要补充Mock数据用于单元测试
|
||||
- 建议增加性能基准测试
|
||||
- 八仙特征测试用例需要完善
|
||||
|
||||
开始准备对应的测试套件!""",
|
||||
message_type=MessageType.REVIEW,
|
||||
channel_id="cross_review",
|
||||
receiver=AIRole.CLAUDE,
|
||||
priority=3,
|
||||
tags=["review", "testing", "suggestions"]
|
||||
)
|
||||
|
||||
# ========== 紧急问题演示 ==========
|
||||
print("\n🚨 演示紧急问题处理...")
|
||||
|
||||
await collab.escalate_issue(
|
||||
reporter=AIRole.CLAUDE,
|
||||
issue_description="""OpenBB v4.3.0版本兼容性问题:
|
||||
|
||||
发现新版本OpenBB的API接口有重大变更,影响数据获取功能。
|
||||
当前解决方案:
|
||||
1. 临时锁定到v4.1.0版本
|
||||
2. 准备适配新版本的兼容层
|
||||
|
||||
需要团队讨论优先级和解决方案。""",
|
||||
severity="high"
|
||||
)
|
||||
|
||||
# RovoDev协调解决
|
||||
await collab.send_message(
|
||||
sender=AIRole.ROVODEV,
|
||||
content="""🎯 **紧急问题协调**
|
||||
|
||||
已接收Claude的问题报告,协调解决方案:
|
||||
|
||||
📋 行动计划:
|
||||
1. **短期方案** (Claude负责): 锁定OpenBB v4.1.0版本,确保现有功能稳定
|
||||
2. **中期方案** (Qwen设计): 设计兼容层架构,支持多版本OpenBB
|
||||
3. **长期方案** (团队): 建立版本兼容性测试机制
|
||||
|
||||
**时间安排**:
|
||||
- 今日内完成版本锁定
|
||||
- 3天内完成兼容层设计
|
||||
- 1周内完成新版本适配
|
||||
|
||||
请各AI确认该计划。""",
|
||||
message_type=MessageType.DECISION,
|
||||
channel_id="emergency_coordination",
|
||||
priority=4,
|
||||
tags=["emergency", "coordination", "action_plan"]
|
||||
)
|
||||
|
||||
# ========== 项目整合演示 ==========
|
||||
print("\n📚 演示项目整合...")
|
||||
|
||||
# 推进到整合阶段
|
||||
await collab.advance_phase(WorkPhase.INTEGRATION)
|
||||
|
||||
await collab.send_message(
|
||||
sender=AIRole.ROVODEV,
|
||||
content="""📚 **项目整合开始**
|
||||
|
||||
开始整合所有AI的工作成果:
|
||||
|
||||
🏗️ **Qwen交付物**:
|
||||
- ✅ 系统架构设计文档
|
||||
- ✅ 数据抽象层接口规范
|
||||
- ✅ 性能优化策略
|
||||
|
||||
💻 **Claude交付物**:
|
||||
- ✅ 增强版OpenBB引擎
|
||||
- ✅ 八仙数据适配器
|
||||
- ✅ Streamlit界面优化
|
||||
|
||||
🧪 **Gemini交付物**:
|
||||
- ✅ 完整测试套件
|
||||
- ✅ 性能基准测试
|
||||
- ✅ 质量保证报告
|
||||
|
||||
📋 **整合任务**:
|
||||
- [ ] 统一文档格式
|
||||
- [ ] 集成测试验证
|
||||
- [ ] 用户指南编写
|
||||
- [ ] 最终质量检查
|
||||
|
||||
预计整合完成时间:2天""",
|
||||
message_type=MessageType.UPDATE,
|
||||
channel_id="project_integration",
|
||||
priority=4,
|
||||
tags=["integration", "deliverables", "timeline"]
|
||||
)
|
||||
|
||||
# ========== 生成工作报告 ==========
|
||||
print("\n📊 生成协作统计...")
|
||||
|
||||
# 获取各AI的工作仪表板
|
||||
for ai_role in AIRole:
|
||||
dashboard = collab.get_ai_dashboard(ai_role)
|
||||
print(f"\n🤖 {ai_role.value} 工作统计:")
|
||||
print(f" 状态: {dashboard['status']['status']}")
|
||||
print(f" 当前任务: {dashboard['status']['current_task']}")
|
||||
print(f" 待处理任务: {len(dashboard['pending_tasks'])}个")
|
||||
print(f" 协作得分: {dashboard['collaboration_stats']['collaboration_score']}")
|
||||
print(f" 活跃频道: {len(dashboard['active_channels'])}个")
|
||||
|
||||
# 获取频道摘要
|
||||
print(f"\n📢 频道活跃度统计:")
|
||||
for channel_id, channel in collab.channels.items():
|
||||
summary = collab.get_channel_summary(channel_id)
|
||||
print(f" {summary['channel_name']}: {summary['total_messages']}条消息")
|
||||
|
||||
print("\n🎉 四AI团队协作演示完成!")
|
||||
print("=" * 60)
|
||||
print("系统功能演示:")
|
||||
print("✅ 多频道协作通信")
|
||||
print("✅ 工作流程管理")
|
||||
print("✅ 任务交接机制")
|
||||
print("✅ 评审协作流程")
|
||||
print("✅ 紧急问题处理")
|
||||
print("✅ 项目整合管理")
|
||||
print("✅ 实时状态监控")
|
||||
print("\n🚀 可以启动Web界面进行可视化管理!")
|
||||
|
||||
async def start_collaboration_system():
|
||||
"""启动协作系统的交互式版本"""
|
||||
import sys
|
||||
|
||||
collab = AITeamCollaboration()
|
||||
|
||||
print("🤖 四AI团队协作系统已启动")
|
||||
print("可用命令:")
|
||||
print(" send - 发送消息")
|
||||
print(" status - 查看状态")
|
||||
print(" channels - 查看频道")
|
||||
print(" dashboard <AI> - 查看AI仪表板")
|
||||
print(" handoff - 工作交接")
|
||||
print(" quit - 退出")
|
||||
|
||||
# 检查是否在交互式环境中
|
||||
if not sys.stdin.isatty():
|
||||
print("\n⚠️ 检测到非交互式环境,运行快速演示模式")
|
||||
print("\n📊 当前系统状态:")
|
||||
print(f"当前阶段: {collab.current_phase.value}")
|
||||
for ai_role, status in collab.ai_status.items():
|
||||
print(f"{ai_role.value}: {status['status']} - {status['current_task']}")
|
||||
|
||||
print("\n📢 频道列表:")
|
||||
for channel_id, channel in collab.channels.items():
|
||||
print(f"{channel.name} ({channel.channel_type.value}): {len(channel.message_history)}条消息")
|
||||
|
||||
print("\n💡 要体验完整交互功能,请在真正的终端中运行:")
|
||||
print(" .venv/bin/python3 ai_collaboration_demo.py interactive")
|
||||
return
|
||||
|
||||
while True:
|
||||
try:
|
||||
command = input("\n> ").strip().lower()
|
||||
|
||||
if command == "quit":
|
||||
break
|
||||
elif command == "status":
|
||||
print(f"当前阶段: {collab.current_phase.value}")
|
||||
for ai_role, status in collab.ai_status.items():
|
||||
print(f"{ai_role.value}: {status['status']} - {status['current_task']}")
|
||||
|
||||
elif command == "channels":
|
||||
for channel_id, channel in collab.channels.items():
|
||||
print(f"{channel.name} ({channel.channel_type.value}): {len(channel.message_history)}条消息")
|
||||
|
||||
elif command.startswith("dashboard"):
|
||||
parts = command.split()
|
||||
if len(parts) > 1:
|
||||
try:
|
||||
ai_role = AIRole(parts[1].title())
|
||||
dashboard = collab.get_ai_dashboard(ai_role)
|
||||
print(json.dumps(dashboard, indent=2, ensure_ascii=False, default=str))
|
||||
except ValueError:
|
||||
print("无效的AI角色,可选:Qwen, Claude, Gemini, Rovodev")
|
||||
else:
|
||||
print("使用方法: dashboard <AI名称>")
|
||||
|
||||
elif command == "send":
|
||||
# 简化的消息发送
|
||||
try:
|
||||
sender = input("发送者 (Qwen/Claude/Gemini/Rovodev): ")
|
||||
content = input("消息内容: ")
|
||||
channel = input("频道 (main_collaboration/architecture_design/etc): ")
|
||||
|
||||
await collab.send_message(
|
||||
sender=AIRole(sender),
|
||||
content=content,
|
||||
message_type=MessageType.PROPOSAL,
|
||||
channel_id=channel or "main_collaboration"
|
||||
)
|
||||
print("消息发送成功!")
|
||||
except EOFError:
|
||||
print("\n输入被中断")
|
||||
break
|
||||
except Exception as e:
|
||||
print(f"发送失败: {e}")
|
||||
|
||||
else:
|
||||
print("未知命令")
|
||||
|
||||
except EOFError:
|
||||
print("\n检测到EOF,退出交互模式")
|
||||
break
|
||||
except KeyboardInterrupt:
|
||||
print("\n检测到中断信号,退出交互模式")
|
||||
break
|
||||
except Exception as e:
|
||||
print(f"错误: {e}")
|
||||
|
||||
print("👋 协作系统已退出")
|
||||
|
||||
if __name__ == "__main__":
|
||||
import sys
|
||||
|
||||
if len(sys.argv) > 1 and sys.argv[1] == "demo":
|
||||
# 运行演示
|
||||
asyncio.run(demo_openbb_integration_workflow())
|
||||
elif len(sys.argv) > 1 and sys.argv[1] == "interactive":
|
||||
# 交互式模式
|
||||
asyncio.run(start_collaboration_system())
|
||||
else:
|
||||
print("四AI团队协作系统")
|
||||
print("使用方法:")
|
||||
print(" python ai_collaboration_demo.py demo - 运行完整演示")
|
||||
print(" python ai_collaboration_demo.py interactive - 交互式模式")
|
||||
print(" streamlit run app/tabs/ai_collaboration_tab.py - 启动Web界面")
|
||||
198
install.sh
198
install.sh
|
|
@ -1,198 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# AI Agent Collaboration Framework - 安装脚本
|
||||
# 一键安装,快速启动多Agent协作
|
||||
|
||||
set -e
|
||||
|
||||
# 颜色定义
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# 打印带颜色的信息
|
||||
print_info() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
print_success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||
}
|
||||
|
||||
print_warning() {
|
||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||
}
|
||||
|
||||
print_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
# 检查系统要求
|
||||
check_requirements() {
|
||||
print_info "检查系统要求..."
|
||||
|
||||
# 检查Python
|
||||
if ! command -v python3 &> /dev/null; then
|
||||
print_error "Python3 未安装,请先安装Python3"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 检查Git
|
||||
if ! command -v git &> /dev/null; then
|
||||
print_error "Git 未安装,请先安装Git"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 检查SSH
|
||||
if ! command -v ssh &> /dev/null; then
|
||||
print_error "SSH 未安装,请先安装SSH"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
print_success "系统要求检查通过"
|
||||
}
|
||||
|
||||
# 创建目录结构
|
||||
create_directories() {
|
||||
print_info "创建项目目录结构..."
|
||||
|
||||
mkdir -p agents/{keys,configs,templates}
|
||||
mkdir -p src/{identity,cli,web}
|
||||
mkdir -p tests/{unit,integration}
|
||||
mkdir -p examples/{basic,advanced}
|
||||
mkdir -p docs/{api,guides}
|
||||
mkdir -p scripts
|
||||
|
||||
print_success "目录结构创建完成"
|
||||
}
|
||||
|
||||
# 安装Python依赖
|
||||
install_python_deps() {
|
||||
print_info "安装Python依赖..."
|
||||
|
||||
python3 -m pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
|
||||
print_success "Python依赖安装完成"
|
||||
}
|
||||
|
||||
# 初始化Agent身份
|
||||
initialize_agents() {
|
||||
print_info "初始化Agent身份..."
|
||||
|
||||
# 复制身份管理器
|
||||
cp agent_identity_manager.py src/identity/
|
||||
cp demo_collaboration.py examples/basic/
|
||||
|
||||
# 运行Agent设置
|
||||
if [ -f "setup_agents.sh" ]; then
|
||||
chmod +x setup_agents.sh
|
||||
./setup_agents.sh
|
||||
else
|
||||
print_warning "setup_agents.sh 未找到,跳过Agent初始化"
|
||||
fi
|
||||
|
||||
print_success "Agent身份初始化完成"
|
||||
}
|
||||
|
||||
# 设置权限
|
||||
set_permissions() {
|
||||
print_info "设置文件权限..."
|
||||
|
||||
chmod +x scripts/*.sh 2>/dev/null || true
|
||||
chmod +x agents/*.sh 2>/dev/null || true
|
||||
|
||||
print_success "权限设置完成"
|
||||
}
|
||||
|
||||
# 创建快捷方式
|
||||
create_symlinks() {
|
||||
print_info "创建快捷方式..."
|
||||
|
||||
# 创建全局命令(可选)
|
||||
if [ "$1" = "--global" ]; then
|
||||
sudo ln -sf "$(pwd)/agents/switch_agent.sh" /usr/local/bin/agent-switch
|
||||
sudo ln -sf "$(pwd)/agents/stats.sh" /usr/local/bin/agent-stats
|
||||
print_success "全局命令已创建"
|
||||
fi
|
||||
}
|
||||
|
||||
# 验证安装
|
||||
verify_installation() {
|
||||
print_info "验证安装..."
|
||||
|
||||
# 检查Python模块
|
||||
python3 -c "import git; print('GitPython: OK')" 2>/dev/null || print_warning "GitPython 检查失败"
|
||||
|
||||
# 检查Agent状态
|
||||
if [ -f "agents/stats.sh" ]; then
|
||||
./agents/stats.sh
|
||||
fi
|
||||
|
||||
print_success "安装验证完成"
|
||||
}
|
||||
|
||||
# 显示使用说明
|
||||
show_usage() {
|
||||
print_success "🎉 AI Agent Collaboration Framework 安装完成!"
|
||||
echo
|
||||
echo "使用方法:"
|
||||
echo " 1. 运行演示: python3 examples/basic/demo_collaboration.py"
|
||||
echo " 2. 查看Agent: ./agents/stats.sh"
|
||||
echo " 3. 切换Agent: ./agents/switch_agent.sh claude-ai"
|
||||
echo " 4. 快速开始: cat QUICK_START.md"
|
||||
echo
|
||||
echo "文档:"
|
||||
echo " - 快速开始: ./docs/quick_start.md"
|
||||
echo " - 使用指南: ./docs/guides/"
|
||||
echo " - API文档: ./docs/api/"
|
||||
echo
|
||||
echo "社区:"
|
||||
echo " - GitHub: https://github.com/your-org/agent-collaboration-framework"
|
||||
echo " - 讨论区: https://github.com/your-org/agent-collaboration-framework/discussions"
|
||||
}
|
||||
|
||||
# 主安装流程
|
||||
main() {
|
||||
echo "========================================"
|
||||
echo " AI Agent Collaboration Framework"
|
||||
echo "========================================"
|
||||
echo
|
||||
|
||||
# 检查参数
|
||||
local global_install=false
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--global)
|
||||
global_install=true
|
||||
shift
|
||||
;;
|
||||
--help|-h)
|
||||
echo "使用方法: $0 [--global] [--help]"
|
||||
echo " --global: 创建全局命令"
|
||||
echo " --help: 显示帮助"
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
print_error "未知参数: $1"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# 执行安装流程
|
||||
check_requirements
|
||||
create_directories
|
||||
install_python_deps
|
||||
initialize_agents
|
||||
set_permissions
|
||||
create_symlinks $global_install
|
||||
verify_installation
|
||||
|
||||
show_usage
|
||||
}
|
||||
|
||||
# 运行主程序
|
||||
main "$@"
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue