Compare commits

..

No commits in common. "e78aefac88651f2e080eca0c2096bd6316fab9d1" and "91d20868dab7619c78efa6f298fa66751ab8c95c" have entirely different histories.

433 changed files with 2170 additions and 59920 deletions

6
.gitignore vendored
View File

@ -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
View File

@ -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.

View File

@ -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
View File

@ -1,238 +1,282 @@
# 🤖 AI Agent Collaboration Framework
# 🏛️ 炼妖壶 (Lianyaohu) - 稷下学宫AI辩论系统
> **从模拟到真实让每个AI Agent都拥有独立的Git身份实现真正的实盘协作**
> 🧹 **致AI开发者**: 入此稷下学宫者,当先读 [`AI_DEVELOPER_GUIDELINES.md`](./AI_DEVELOPER_GUIDELINES.md) 了解项目规矩,明藏经阁章法。扫地僧叮嘱:代码如经书,需整齐摆放;文化特色不可丢,八仙智慧要传承。
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)
[![Git 2.20+](https://img.shields.io/badge/git-2.20+-orange.svg)](https://git-scm.com/)
[![Tests](https://github.com/your-org/agent-collaboration-framework/workflows/Tests/badge.svg)](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 开发调试(可选)
[![Star History Chart](https://api.star-history.com/svg?repos=your-org/agent-collaboration-framework&type=Date)](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`

View File

@ -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']}")

View File

View File

View File

@ -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)
"

View File

@ -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()

View File

@ -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

View File

@ -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"
}
}

View File

@ -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

View File

@ -1,49 +0,0 @@
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACFwAAAAdzc2gtcn
NhAAAAAwEAAQAAAgEAwxFTRs1dVvxWbPQVCywG/6mmw0NAa7CMqeclew+yJiSgNutKPK/C
tA8JLcos59apqCHU1Z9vzw+7dAWw+BOVyHXbCBqH9+U7x5LI6QNvXckjhKkIoafjPTz2Vr
51AKLt0u7EEPegETySbJoYcvueX0+fl8Vsbv20xmKQhYPWY3n7c0371hSr2c5xqKWn1Eyq
a0mryLH64nnRLpJoL3qEPzxe+vdjr3/8qV9CYEak2etsiGTdB+KvUePvX9OZLi7Xut4tcT
DtjLo6iAG7D+0v9X8iCIPP4x6tF3ozJtq/kDiIaw0Yr/gIjaEMhq7Q3w+Pfy9hx094dWiE
KW8RByTl+cHUkb3V8Vh9abXglPc3NNZjlSVVqVlpYL6if7NCeqmqw9XnICI4cESgnerArN
tUoW6w+ZAE6VWKeJkqaitR3+ieFAy5DiWKxRQV5I3YhyOIwgPdmprCYPU1G3aSBCxa3qu8
AlQM/Vm+HfrItLJ0DVYNMbsBAyBKAfpjUjCmkx+ClsAnKQ+3SneQjJHCIRscy+MlTKKOpb
wZwBiC685jWVm8AFCSV+tmhlVNhxgUBlVrO+cyW1oyypk1W2p9tEqxOMKFlZYfPisxdrRm
xlY5wH6QnGFR3rV3KBwQlG5BRIzfbQ/54cccsihPGbYGdndjgeTPb68oYMAYGguZItCw+I
kAAAdYn/2qxJ/9qsQAAAAHc3NoLXJzYQAAAgEAwxFTRs1dVvxWbPQVCywG/6mmw0NAa7CM
qeclew+yJiSgNutKPK/CtA8JLcos59apqCHU1Z9vzw+7dAWw+BOVyHXbCBqH9+U7x5LI6Q
NvXckjhKkIoafjPTz2Vr51AKLt0u7EEPegETySbJoYcvueX0+fl8Vsbv20xmKQhYPWY3n7
c0371hSr2c5xqKWn1Eyqa0mryLH64nnRLpJoL3qEPzxe+vdjr3/8qV9CYEak2etsiGTdB+
KvUePvX9OZLi7Xut4tcTDtjLo6iAG7D+0v9X8iCIPP4x6tF3ozJtq/kDiIaw0Yr/gIjaEM
hq7Q3w+Pfy9hx094dWiEKW8RByTl+cHUkb3V8Vh9abXglPc3NNZjlSVVqVlpYL6if7NCeq
mqw9XnICI4cESgnerArNtUoW6w+ZAE6VWKeJkqaitR3+ieFAy5DiWKxRQV5I3YhyOIwgPd
mprCYPU1G3aSBCxa3qu8AlQM/Vm+HfrItLJ0DVYNMbsBAyBKAfpjUjCmkx+ClsAnKQ+3Sn
eQjJHCIRscy+MlTKKOpbwZwBiC685jWVm8AFCSV+tmhlVNhxgUBlVrO+cyW1oyypk1W2p9
tEqxOMKFlZYfPisxdrRmxlY5wH6QnGFR3rV3KBwQlG5BRIzfbQ/54cccsihPGbYGdndjge
TPb68oYMAYGguZItCw+IkAAAADAQABAAACAFt79KJwDiaNkbrnfjcPHvkoh51sHPpkgpPs
ZBei9NoOs1UOZHKxu47WvmdLOmRAuLCxrS/C5p0ls7RmNukhxk2NeHwEdWA9khu3K6Kcic
5iVtYQsIugQWKnBKEKEbWKtB8I+8s5V0i+L63fVzgV6eCpZx+253PmaLHh6AW2HwXoX5Vk
LYfpie9McuG1T1Cx4/sNQhON5SvyFbjR0SrzOrKtjZ4GCCp2y/hjRK4Cc64AS5ZsN31LQw
4U6F74zg5qyaJKMOW1HLOzY2AF78U4aBWq2jtEFmteJ6+rD/JZBR6OZOxP6BQfL2O89DL2
Kd9zXMk5X5IqI0RtEA6emE3RcEkwIYlzPTFCDTfg55Plb/J/oTUfk7YB/EivgJU6FPd2n2
GHgDXBMShDtJ3Df0vKjjccK+/0VlRsthMKkiWTgo8cWLKK+WfVDQAvBObpKiTS626VBkXw
qzz2RdPRWicpWMYEu8E0jaxvd0shZmtykPl3wNWBXvMJ+FEu3gI/gVwXlhVuDUs/HclTaw
WjIYYzHixhJ+84wEY92FDhQNSXqqUi1XLaG/yQrU3hqYSRBNXKxyYH/a+B3sTiDYjJqZQY
R9JBm+pQqqLU/Ktx1OPKCkFSAC4BSeT6+7SJ5Sfn7ebBPUv5N83aR1lsnHiKrPZmIPD4En
7HxkRYLjkvcgipjaRBAAABAQDHzqfZ4CrabCbwKFPshBY3K34aJeW+MbxT38TUJ17BFVOp
8GmIL2USxwudG2HCJYcEWWcB99QEo2E7NQVCbqnGyHOVoTvHnjIzJ5RWJ4ss37N42K0GCo
W4y1Z5ffMOfuxC1439zzqhL4JZ1gZXS1s5cm5631/XdQPdJ5hzFpm3kzdNfxvbR0c8ezJw
4azykDC8CKwNzm+0H7oABS9o9qQH3Ljzh0J+vtgfN8nqLccITJjK0t3ZHXKXu/lwYzldBa
2ok2iXy3a+gT3ssZzTJa7XwtfLfL6Sam+qkLOa/kdlG0Du1WbSlrUvqnPlxEsgQAqyJpM3
MzNyXJLc52WjJWINAAABAQDudHeXzFWf5syrRQjNP3zOHFAUe+qUVCJuhPeRTFjd7NLO7z
3Linorxu8xJHVCSQnVq7ynpgC2dRnpqOk41XM9QsauMMMMM8pAix+EcD04gtvEAe6ATG+T
XJO2hzzyj7h+HkEdzxAJXu79VVGNg/4oXnMt3o+SdjuPOE49o166rImlMoNlsp/+r+Mn2G
mT3N52uWqKWq9ecWufS3TadrRxPmc067kx/paTdBy1tUdeZ4UaO3mzUXyxcfC8iXPDdidt
sIswzQW5l2QR/J9HoU256vzkn48G6htbfUZC2PJlkDvthDHQKFtsINM9p31yxREdF6y6ay
w1SAza+xu28cErAAABAQDRa53GCDz6CJrKpTxdG+aLgzLvdgRrYJT4N5yzIlzeV4bkTiD2
AXBkkflrJGs44O8QzKINf8B70Hl3W8ntwQiY5rSeRCwPtFqtHqSrcpEa/vUJtmZ7VXI8YB
vhPeFzGPsFfTBZ90n0ydb2pDApobuuusLMIZ11Nkwn4GDa3JhEb1Rd9vfq+c0cWzBs6xrn
kCgQsy0dzeP9uDLxzmdsZr2VPuqrUazgxRmcVyoyURinnVxSVKMFgwfNOUPW+sz5Ene7mA
ooYNmyPS8qV1DHDI9RXHYHoAB7gVOaHVoN6GYEXEZnDyYE52GhNlyIURq1RAdLFlJlThhv
vR3eCJJDzksbAAAAHWNsYXVkZUBhaS1jb2xsYWJvcmF0aW9uLmxvY2FsAQIDBAU=
-----END OPENSSH PRIVATE KEY-----

View File

@ -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

View File

@ -1,49 +0,0 @@
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----

View File

@ -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

View File

@ -1,49 +0,0 @@
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----

View File

@ -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

View File

@ -1,49 +0,0 @@
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----

View File

@ -1 +0,0 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDOapLyoJP6EELcpqEbAFxTGBhOXf5f9BM4Unz5cl0A3sSryj2jROBMegXRf0dFrTJoiHcTrY0o+agzZ3resMARKNZoQZc1rtN/1KQf3acducJiAZ1GZNSCDlLHKp2WDXncoyuL1X58/tZJA+/Qb2DyixHbY2fxVaDPUpMP4IJSQg8MLgTOstXIAZ9GYHA2naVf9uJuNq+GotqgK5+KcToyjueXVCVCQvrhrCCIgc2QNjSm3odbw1Dx9h0tDbT5jTpVrsZY1681P6EVekyUhb8lm6IuOcXWTooltM3OOQfSFDtBRKl5iYBmmm53jDtcA86X8A7eSjrFaoRcufuOxHhIIQ1RIU9yNdLTtgm3nQUwe00siZcX/WTusmCK9tRGOw8hvPqyD0xwtN3i9lrtjkA0JgRTGhhbea3cmjESlVLAPPaTvxSsHeQJZnzWEydm0AadzQ3i+kHQV9OvrSkVdhKNS0zFHq6rBnYMNHijvGNPMEWAiVfZwPYwAnPpMB0kczeH4TfMeCXja7ro22ulEnrCQIQKGX2Mnq14TmmSQhM8iHMtOMqdd1SecI17b0bp5icd79VVkdCbe5IrdHNmq++vmG7731frItyiBoxnFVFPZMzhBJnogQ4oqf5ZQSeOcKkkVrG1Xvo8H284mCjveGuvwiqveGY1EpLBjeQql9Pnaw== qwen@ai-collaboration.local

View File

@ -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"

View File

@ -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协作开发"

View File

@ -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()
"

View File

@ -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)
"

View File

@ -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
from google.adk import Agent, Runner
from google.adk.sessions import InMemorySessionService, Session
from google.genai import types
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(

View File

@ -1,15 +0,0 @@
# 新功能架构设计
## 概述
设计一个智能监控系统用于跟踪AI agent的工作状态。
## 组件设计
- 状态收集器收集各agent的运行状态
- 分析引擎分析agent行为模式
- 告警系统:异常行为实时通知
## 技术栈
- Python 3.9+
- Redis作为消息队列
- PostgreSQL存储状态数据
- FastAPI提供REST接口

View File

@ -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

View File

@ -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())

View File

@ -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完成的任务

View File

@ -1,10 +0,0 @@
# 智能监控系统架构设计
## 系统概述
设计一个分布式智能监控系统,支持实时数据采集和分析。
## 核心组件
- 数据采集层
- 实时处理引擎
- 告警通知模块
- 可视化仪表盘

View File

@ -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. **隔离性好**: 不同环境完全隔离,减少干扰

View File

@ -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小时持续监控
- 日常运维: 实时告警监控

View File

@ -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
- 紧急热线: [待填写]
## 持续改进
### 发布回顾
每次发布后一周内进行回顾会议:
- 分析发布过程中的问题
- 收集用户反馈
- 更新发布流程
- 优化监控指标
### 自动化改进
- 逐步增加自动化测试覆盖率
- 完善监控和告警系统
- 优化部署脚本
- 建立自动化回滚机制

View File

@ -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界面")

View File

@ -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