添加qiming-rcoder模块
This commit is contained in:
495
qiming-rcoder/README.md
Normal file
495
qiming-rcoder/README.md
Normal file
@@ -0,0 +1,495 @@
|
||||
# RCoder - AI驱动的开发平台
|
||||
|
||||
> [English](README_EN.md)
|
||||
|
||||
RCoder 是一个基于 Rust 构建的现代化 AI 驱动开发平台,通过 **SACP (Symposium ACP)** 协议实现与多种 AI 代理的统一交互。项目采用**微服务架构**,支持 **Docker 容器化部署**和 **gRPC 高性能通信**。
|
||||
|
||||
## ✨ 核心特性
|
||||
|
||||
- 🔁 **反向代理**:集成 Cloudflare Pingora,高性能端口路由 `/proxy/{port}/{path}`
|
||||
- 🌐 **HTTP API**:基于 Axum 的现代化 REST API 与统一 SSE 进度流
|
||||
- 🤖 **多代理支持**:统一接入 Claude Code、Codex 等 AI 代理
|
||||
- 🐳 **容器化架构**:每个项目对应独立的 Docker 容器,实现隔离和资源管理
|
||||
- ⚡ **gRPC 通信**:基于 Tonic 的高性能内部通信,支持 Server Streaming
|
||||
- 🔧 **配置系统**:命令行 > 环境变量 > 配置文件,多层配置优先级
|
||||
- 📜 **API 文档**:自动化 API 文档(utoipa + Swagger UI)
|
||||
- 📊 **可观测性**:Tracing + OpenTelemetry 完整链路追踪 + Pyroscope 性能分析
|
||||
- 🖥️ **Computer Agent**:容器化 AI 代理环境,集成 VNC 远程桌面、音频流和 IME 输入
|
||||
|
||||
## 🏠 架构概览
|
||||
|
||||
### 整体架构
|
||||
|
||||
```
|
||||
外部客户端 (HTTP/SSE)
|
||||
↓
|
||||
RCoder (HTTP API Server + Docker 管理 + gRPC 客户端)
|
||||
↓ gRPC (Chat, CancelSession, SubscribeProgress)
|
||||
Agent Runner (gRPC Server in Docker)
|
||||
↓ Server Streaming (实时进度事件)
|
||||
RCoder (转换为 SSE)
|
||||
↓
|
||||
外部客户端 (SSE)
|
||||
```
|
||||
|
||||
### 核心组件
|
||||
|
||||
- **RCoder 主服务**:Axum HTTP 服务 + 容器管理 + gRPC 客户端
|
||||
- **Agent Runner**:独立的 AI 代理运行环境(Docker 容器内),提供 gRPC 服务
|
||||
- **Pingora 代理**:高性能反向代理服务,支持端口路由
|
||||
- **Docker Manager**:全局容器生命周期管理
|
||||
|
||||
### 🛠️ 技术栈
|
||||
|
||||
| 组件类型 | 技术选型 | 说明 |
|
||||
|----------|---------|------|
|
||||
| **编程语言** | Rust 2024 Edition | 现代化系统编程语言 |
|
||||
| **HTTP 框架** | Axum + Tower | 高性能异步 Web 框架 |
|
||||
| **RPC 框架** | Tonic (gRPC) | 高性能 RPC 通信 |
|
||||
| **AI 协议** | SACP + MCP | 支持多种 AI 代理协议 |
|
||||
| **容器化** | Docker + Bollard | 容器管理和编排 |
|
||||
| **数据库** | DuckDB + SQLx | 嵌入式分析数据库 |
|
||||
| **日志系统** | Tracing + OpenTelemetry | 结构化日志和分布式追踪 |
|
||||
| **性能分析** | Pyroscope | 持续性能剖析 |
|
||||
| **命令行** | clap | 现代化命令行参数解析 |
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### 📝 环境要求
|
||||
|
||||
- Rust: 1.75+(2024 Edition)
|
||||
- Docker(用于容器化部署)
|
||||
- 可选:Claude Code CLI(用于 Claude 代理)
|
||||
|
||||
### 🛠️ 安装与运行
|
||||
|
||||
#### 本地开发
|
||||
|
||||
```bash
|
||||
# 克隆仓库
|
||||
git clone https://github.com/your-org/rcoder.git
|
||||
cd rcoder
|
||||
|
||||
# 本地编译
|
||||
cargo build --workspace
|
||||
|
||||
# 运行主服务
|
||||
cargo run --bin rcoder
|
||||
|
||||
# 指定端口和项目目录
|
||||
cargo run --bin rcoder -- --port 8087 --projects-dir ./my-projects
|
||||
```
|
||||
|
||||
#### Docker 开发模式(推荐)
|
||||
|
||||
```bash
|
||||
# 构建镜像并启动容器
|
||||
make dev-build # 构建 Docker 镜像
|
||||
make dev-up # 启动开发容器
|
||||
|
||||
# 代码修改后重启
|
||||
make dev-restart # 重新构建并重启
|
||||
|
||||
# 查看日志
|
||||
make dev-logs
|
||||
|
||||
# 停止容器
|
||||
make dev-down
|
||||
```
|
||||
|
||||
#### 启用反向代理
|
||||
|
||||
```bash
|
||||
# 启用 Pingora 反向代理
|
||||
cargo run --bin rcoder -- --enable-proxy --proxy-port 8080
|
||||
|
||||
# 指定默认后端端口
|
||||
cargo run --bin rcoder -- --enable-proxy --proxy-port 8080 --backend-port 3000
|
||||
```
|
||||
|
||||
### 💻 命令行参数
|
||||
|
||||
| 参数 | 短参数 | 说明 | 示例 |
|
||||
|------|--------|------|------|
|
||||
| `--port` | `-p` | 设置主服务端口 | `--port 8087` |
|
||||
| `--projects-dir` | `-d` | 设置项目工作目录 | `--projects-dir ./projects` |
|
||||
| `--enable-proxy` | 无 | 启用 Pingora 反向代理 | `--enable-proxy` |
|
||||
| `--proxy-port` | 无 | 设置 Pingora 监听端口 | `--proxy-port 8080` |
|
||||
| `--backend-port` | 无 | 默认后端端口 | `--backend-port 3000` |
|
||||
|
||||
```bash
|
||||
# 查看所有参数
|
||||
cargo run --bin rcoder -- --help
|
||||
```
|
||||
|
||||
## 📚 API 文档
|
||||
|
||||
### 🔁 Pingora 反向代理
|
||||
|
||||
Pingora 是项目内置的高性能反向代理。
|
||||
|
||||
```bash
|
||||
# 启用代理
|
||||
cargo run --bin rcoder -- --enable-proxy --proxy-port 8080
|
||||
|
||||
# 代理请求示例(转发到 5173 端口)
|
||||
curl "http://127.0.0.1:8080/proxy/5173/page/123/"
|
||||
```
|
||||
|
||||
### 🏥 核心端点
|
||||
|
||||
| 端点 | 方法 | 说明 |
|
||||
|------|------|------|
|
||||
| `/health` | GET | 健康检查 |
|
||||
| `/chat` | POST | 发送聊天消息给 AI 代理 |
|
||||
| `/agent/progress/{session_id}` | GET (SSE) | 获取实时进度流 |
|
||||
| `/agent/session/cancel` | POST | 取消正在执行的任务 |
|
||||
| `/agent/stop` | POST | 停止 Agent |
|
||||
| `/agent/status/{project_id}` | GET | 查询 Agent 状态 |
|
||||
| `/api/docs` | GET | Swagger UI API 文档 |
|
||||
|
||||
### gRPC 服务 (Agent Runner)
|
||||
|
||||
| 方法 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `Chat` | Unary | 发送聊天请求 |
|
||||
| `SubscribeProgress` | Server Streaming | 订阅进度事件流 |
|
||||
| `CancelSession` | Unary | 取消会话任务 |
|
||||
| `GetStatus` | Unary | 查询 Agent 状态 |
|
||||
| `StopAgent` | Unary | 停止 Agent |
|
||||
| `GetContainerStatus` | Unary | 查询容器状态 |
|
||||
| `GetVncStatus` | Unary | 查询 VNC 服务状态 |
|
||||
|
||||
### 🖥️ Computer Agent 端点
|
||||
|
||||
Computer Agent 提供容器化的 AI 代理环境,支持 VNC 远程桌面、音频流和 IME 输入。每个用户对应独立的 Docker 容器,多个项目可共享同一容器。
|
||||
|
||||
#### 核心接口
|
||||
|
||||
| 端点 | 方法 | 说明 |
|
||||
|------|------|------|
|
||||
| `/computer/chat` | POST | 发送聊天消息到 Computer Agent |
|
||||
| `/computer/progress/{session_id}` | GET (SSE) | 获取实时进度流 |
|
||||
| `/computer/agent/stop` | POST | 停止指定项目的 Agent(不销毁容器) |
|
||||
| `/computer/agent/status` | POST | 查询 Agent 状态(alive/idle/busy) |
|
||||
| `/computer/agent/session/cancel` | POST | 取消正在执行的会话 |
|
||||
|
||||
#### 桌面与媒体代理(通过 Pingora)
|
||||
|
||||
| 端点 | 方法 | 说明 |
|
||||
|------|------|------|
|
||||
| `/computer/desktop/{user_id}/{project_id}` | GET | 获取 VNC 桌面访问地址 |
|
||||
| `/computer/vnc/{user_id}/{project_id}/{*path}` | GET | VNC/noVNC 代理(端口 6080) |
|
||||
| `/computer/audio/{user_id}/{project_id}/{*path}` | GET | 音频流代理(端口 6089/6090) |
|
||||
| `/computer/ime/{user_id}/{project_id}/{*path}` | GET | IME 输入法代理(端口 6091) |
|
||||
|
||||
#### Pod/容器管理
|
||||
|
||||
| 端点 | 方法 | 说明 |
|
||||
|------|------|------|
|
||||
| `/computer/pod/count` | GET | 容器数量统计(按服务类型分组) |
|
||||
| `/computer/pod/list` | GET | 列出所有容器详情(支持分页 `?limit=100`) |
|
||||
| `/computer/pod/ensure` | POST | 确保容器存在(幂等,不启动 Agent) |
|
||||
| `/computer/pod/keepalive` | POST | 刷新容器活跃时间(防止自动清理) |
|
||||
| `/computer/pod/restart` | POST | 重启容器(销毁并重建) |
|
||||
| `/computer/pod/status` | GET | 查询容器状态(`?user_id=xxx`) |
|
||||
| `/computer/pod/vnc-status` | GET | 查询 VNC 服务就绪状态 |
|
||||
|
||||
#### Computer Chat 请求示例
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8087/computer/chat \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"user_id": "user-123",
|
||||
"project_id": "my-project",
|
||||
"prompt": "帮我创建一个 Python Web 应用"
|
||||
}'
|
||||
```
|
||||
|
||||
### 🚑 健康检查
|
||||
|
||||
```bash
|
||||
curl -X GET http://localhost:8087/health
|
||||
```
|
||||
|
||||
响应:
|
||||
```json
|
||||
{
|
||||
"status": "ok",
|
||||
"timestamp": "2024-01-01T00:00:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
### 💬 聊天接口
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8087/chat \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"prompt": "你好,请帮我创建一个 Rust Web API 项目",
|
||||
"project_id": "my-project",
|
||||
"session_id": "optional-session-id"
|
||||
}'
|
||||
```
|
||||
|
||||
### 📊 实时进度流
|
||||
|
||||
```bash
|
||||
curl -X GET http://localhost:8087/agent/progress/your-session-id \
|
||||
-H "Accept: text/event-stream"
|
||||
```
|
||||
|
||||
## 📁 项目结构
|
||||
|
||||
```
|
||||
crates/
|
||||
├── agent_abstraction/ # Agent 抽象层
|
||||
├── agent_config/ # Agent 配置管理
|
||||
├── agent_runner/ # Agent 运行时(gRPC 服务端)
|
||||
│ ├── src/
|
||||
│ │ ├── grpc/ # gRPC 服务实现
|
||||
│ │ ├── proxy_agent/ # ACP 代理实现
|
||||
│ │ └── service/ # 核心服务
|
||||
│ └── Cargo.toml
|
||||
├── docker_manager/ # Docker 容器管理
|
||||
├── duckdb_manager/ # DuckDB 数据库管理
|
||||
├── rcoder/ # 主应用
|
||||
│ ├── src/
|
||||
│ │ ├── grpc/ # gRPC 客户端
|
||||
│ │ ├── handler/ # HTTP 处理器
|
||||
│ │ ├── service/ # 业务服务
|
||||
│ │ └── cleanup_task/ # 清理任务
|
||||
│ └── Cargo.toml
|
||||
├── rcoder-proxy/ # Pingora 代理封装
|
||||
├── rcoder-telemetry/ # 遥测和追踪
|
||||
└── shared_types/ # 共享类型和 Proto 定义
|
||||
└── proto/
|
||||
└── agent.proto # gRPC 协议定义
|
||||
```
|
||||
|
||||
## 配置
|
||||
|
||||
### 配置优先级
|
||||
|
||||
1. **命令行参数** - 最高优先级
|
||||
2. **环境变量** - 中等优先级
|
||||
3. **配置文件** - 较低优先级
|
||||
4. **默认配置** - 最低优先级
|
||||
|
||||
### 配置文件 (config.yml)
|
||||
|
||||
```yaml
|
||||
# 默认 Agent ID
|
||||
default_agent_id: "claude-code-acp-ts"
|
||||
|
||||
# 项目工作目录
|
||||
projects_dir: "./project_workspace"
|
||||
|
||||
# 主服务端口
|
||||
port: 8087
|
||||
|
||||
# Docker 配置
|
||||
docker_config:
|
||||
network_mode: "bridge"
|
||||
network_base_name: "agent-network"
|
||||
work_dir: "/app"
|
||||
auto_cleanup: true
|
||||
container_ttl_seconds: 3600
|
||||
api_timeout_seconds: 10
|
||||
cache_status_ttl_seconds: 10
|
||||
|
||||
# 容器清理配置
|
||||
cleanup_config:
|
||||
enabled: true
|
||||
idle_timeout_seconds: 600
|
||||
cleanup_interval_seconds: 300
|
||||
container_protection_seconds: 300
|
||||
|
||||
# API Key 鉴权配置
|
||||
api_key_auth:
|
||||
enabled: false
|
||||
api_key: "sk-xxx"
|
||||
|
||||
# 反向代理配置
|
||||
proxy_config:
|
||||
listen_port: 8088
|
||||
default_backend_port: 8086
|
||||
backend_host: "127.0.0.1"
|
||||
```
|
||||
|
||||
### 环境变量
|
||||
|
||||
| 变量名 | 说明 | 默认值 |
|
||||
|--------|------|--------|
|
||||
| `RCODER_PORT` | 服务端口 | 8087 |
|
||||
| `RCODER_PROJECTS_DIR` | 项目目录 | ./project_workspace |
|
||||
| `RCODER_NETWORK_MODE` | Docker 网络模式 | bridge |
|
||||
| `RCODER_NETWORK_BASE_NAME` | 网络基础名称 | agent-network |
|
||||
| `RCODER_API_TIMEOUT_SECONDS` | Docker API 超时 | 10 |
|
||||
| `RCODER_API_KEY_ENABLED` | 启用 API Key 鉴权 | false |
|
||||
| `RCODER_API_KEY` | API Key 密钥 | - |
|
||||
| `RUST_LOG` | 日志级别 | info |
|
||||
|
||||
### 使用示例
|
||||
|
||||
```bash
|
||||
# 使用环境变量
|
||||
RCODER_PORT=8080 RUST_LOG=debug cargo run --bin rcoder
|
||||
|
||||
# 命令行参数优先级最高
|
||||
RCODER_PORT=8080 cargo run --bin rcoder -- --port 9000
|
||||
```
|
||||
|
||||
## 🔧 开发指南
|
||||
|
||||
### 运行测试
|
||||
|
||||
```bash
|
||||
# 运行所有测试
|
||||
cargo test --workspace
|
||||
|
||||
# 运行单元测试
|
||||
make test-unit
|
||||
|
||||
# 运行集成测试
|
||||
make test-integration
|
||||
```
|
||||
|
||||
### 代码质量
|
||||
|
||||
```bash
|
||||
# 代码格式化
|
||||
cargo fmt
|
||||
|
||||
# 代码检查
|
||||
cargo clippy
|
||||
|
||||
# 全面检查
|
||||
cargo clippy -- -D warnings
|
||||
```
|
||||
|
||||
### 本地开发
|
||||
|
||||
```bash
|
||||
# 启动开发服务器
|
||||
RUST_LOG=debug cargo run --bin rcoder -- --port 8087
|
||||
|
||||
# 监视文件变化
|
||||
cargo install cargo-watch
|
||||
cargo watch -x "run --bin rcoder"
|
||||
```
|
||||
|
||||
## 🚀 部署指南
|
||||
|
||||
### Docker 部署
|
||||
|
||||
```bash
|
||||
# 构建镜像
|
||||
make docker-build
|
||||
|
||||
# 或分别构建
|
||||
make docker-build-master # 主服务镜像
|
||||
make docker-build-agent-runner # Agent Runner 镜像
|
||||
|
||||
# 生产镜像(无调试工具)
|
||||
make docker-build-agent-production
|
||||
```
|
||||
|
||||
### Docker Compose
|
||||
|
||||
```bash
|
||||
# 启动服务
|
||||
make dev-up
|
||||
|
||||
# 查看状态
|
||||
docker-compose -f docker/docker-compose.yml ps
|
||||
|
||||
# 停止服务
|
||||
make dev-down
|
||||
```
|
||||
|
||||
### Pyroscope 性能分析
|
||||
|
||||
```bash
|
||||
# 启动 Pyroscope Server
|
||||
make pyroscope-up
|
||||
|
||||
# 访问 Web UI
|
||||
open http://localhost:4040
|
||||
|
||||
# 停止服务
|
||||
make pyroscope-down
|
||||
```
|
||||
|
||||
## 🐛 问题排查
|
||||
|
||||
### 常见问题
|
||||
|
||||
- **端口被占用**:使用 `--port` 参数指定其他端口
|
||||
- **容器启动失败**:检查 Docker 服务状态和网络配置
|
||||
- **gRPC 连接失败**:确认容器网络和端口配置
|
||||
- **API Key 错误**:检查 `api_key_auth` 配置
|
||||
|
||||
### 调试模式
|
||||
|
||||
```bash
|
||||
# 启用详细日志
|
||||
RUST_LOG=debug cargo run --bin rcoder
|
||||
|
||||
# 查看容器日志
|
||||
make dev-logs
|
||||
|
||||
# 进入容器调试
|
||||
docker exec -it <container_id> /bin/bash
|
||||
```
|
||||
|
||||
## 📈 更新日志
|
||||
|
||||
### v0.1.0 (当前版本)
|
||||
|
||||
#### 新增功能
|
||||
- ✅ 基于 SACP 协议的 AI 代理统一管理
|
||||
- ✅ gRPC 高性能通信架构
|
||||
- ✅ Docker 容器化部署(项目级隔离)
|
||||
- ✅ VNC/noVNC 远程桌面支持
|
||||
- ✅ API Key 鉴权中间件
|
||||
- ✅ 容器自动清理机制
|
||||
- ✅ 多镜像配置支持
|
||||
- ✅ Pyroscope 性能分析集成
|
||||
|
||||
#### 技术特性
|
||||
- ✅ Rust 2024 Edition
|
||||
- ✅ Tonic gRPC (v0.14.2)
|
||||
- ✅ SACP 协议 (v10.1.0)
|
||||
- ✅ MCP 协议支持 (rmcp v0.12.0)
|
||||
- ✅ DuckDB 数据库
|
||||
- ✅ OpenTelemetry 追踪
|
||||
- ✅ eBPF 调试工具支持
|
||||
|
||||
## 🔗 相关链接
|
||||
|
||||
- **项目仓库**: [GitHub](https://github.com/your-org/rcoder)
|
||||
- **问题追踪**: [Issues](https://github.com/your-org/rcoder/issues)
|
||||
- **SACP 协议**: [Symposium ACP](https://crates.io/crates/sacp)
|
||||
- **MCP 协议**: [rmcp](https://crates.io/crates/rmcp)
|
||||
|
||||
## 📝 许可证
|
||||
|
||||
本项目采用 MIT 或 Apache-2.0 双许可证。详见 [LICENSE](LICENSE) 文件。
|
||||
|
||||
## 🤝 贡献
|
||||
|
||||
欢迎贡献!请阅读 [CONTRIBUTING.md](CONTRIBUTING.md) 了解如何参与开发。
|
||||
|
||||
### 贡献指南
|
||||
|
||||
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
|
||||
|
||||
---
|
||||
|
||||
💫 **由 RCoder 团队精心打造,致力于推进 AI 驱动的现代化开发体验。**
|
||||
Reference in New Issue
Block a user