# 开发指南 **本文档引用的文件** - [Cargo.toml](file://Cargo.toml) - [README.md](file://README.md) - [config.yml](file://config.yml) - [main.rs](file://crates/rcoder/src/main.rs) - [agent_runner/src/main.rs](file://crates/agent_runner/src/main.rs) - [config.rs](file://crates/rcoder/src/config.rs) - [agent_runner/src/config.rs](file://crates/agent_runner/src/config.rs) - [router.rs](file://crates/rcoder/src/router.rs) - [agent_runner/src/router.rs](file://crates/agent_runner/src/router.rs) - [chat_handler.rs](file://crates/rcoder/src/handler/chat_handler.rs) - [agent_session_notification.rs](file://crates/rcoder/src/handler/agent_session_notification.rs) - [mod.rs](file://crates/rcoder/src/proxy_agent/mod.rs) - [shared_types/src/lib.rs](file://crates/shared_types/src/lib.rs) - [shared_types/src/multi_image_config.rs](file://crates/shared_types/src/multi_image_config.rs) - [docker_manager/src/lib.rs](file://crates/docker_manager/src/lib.rs) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构概述](#架构概述) 5. [详细组件分析](#详细组件分析) 6. [依赖分析](#依赖分析) 7. [性能考虑](#性能考虑) 8. [故障排除指南](#故障排除指南) 9. [结论](#结论) ## 简介 RCoder 是一个基于 Rust 构建的现代化 AI 驱动开发平台,通过 ACP (Agent Client Protocol) 协议实现与多种 AI 代理的统一交互。平台提供简洁的 HTTP API 接口,让开发者能够轻松集成和管理 AI 辅助开发功能。 **Section sources** - [README.md](file://README.md#L1-L652) ## 项目结构 项目采用 Rust workspace 结构,包含多个 crates,每个 crate 负责特定功能: ``` . ├── crates/ │ ├── acp_adapter/ # ACP 协议适配器 │ ├── agent_runner/ # 代理运行器核心 │ ├── claude-code-agent/ # Claude Code 代理实现 │ ├── codex-acp-agent/ # Codex ACP 代理实现 │ ├── docker_manager/ # Docker 管理器 │ ├── pingora-proxy/ # Pingora 反向代理封装 │ ├── rcoder/ # 主应用(Axum 路由、业务、配置) │ └── shared_types/ # 共享类型定义 ├── docker/ # Docker 相关脚本和配置 ├── specs/ # 设计文档 ├── .dockerignore ├── .gitignore ├── CLAUDE.md ├── Cargo.lock ├── Cargo.toml # Workspace 配置 ├── Makefile ├── README.md ├── config.yml # 默认配置文件 ├── http_test.rest ├── install.md └── test_auto_arch_detection.sh ``` **Section sources** - [README.md](file://README.md#L269-L377) ## 核心组件 系统由多个核心组件构成,包括主应用、代理运行器、Docker 管理器、Pingora 反向代理和共享类型。 **Section sources** - [Cargo.toml](file://Cargo.toml#L1-L205) - [README.md](file://README.md#L380-L382) ## 架构概述 系统采用微服务架构,主要组件包括主服务、代理运行器和反向代理。 ```mermaid graph TB A[Client] --> B[Axum HTTP Server] A --> C[Pingora Proxy] B --> D[API Routes] B --> E[Agent Worker (LocalSet)] C --> F[Backends: 127.0.0.1:{port}] ``` **Diagram sources** - [README.md](file://README.md#L18-L25) ## 详细组件分析 ### 配置系统分析 配置系统支持多层优先级配置,从高到低为:命令行参数 > 环境变量 > 配置文件 > 默认配置。 #### 配置结构 ```mermaid classDiagram class AppConfig { +default_agent : AgentType +projects_dir : PathBuf +port : u16 +proxy_config : Option +docker_config : Option } class ProxyConfig { +listen_port : u16 +default_backend_port : u16 +backend_host : String +port_param : String +health_check : HealthCheckConfig } class DockerConfig { +multi_image_config : Option +network_mode : Option +work_dir : Option +auto_cleanup : Option +container_ttl_seconds : Option } class HealthCheckConfig { +enabled : bool +interval_seconds : u64 +timeout_seconds : u64 +healthy_threshold : u32 +unhealthy_threshold : u32 } AppConfig --> ProxyConfig : "包含" AppConfig --> DockerConfig : "包含" ProxyConfig --> HealthCheckConfig : "包含" ``` **Diagram sources** - [crates/rcoder/src/config.rs](file://crates/rcoder/src/config.rs#L38-L96) - [crates/agent_runner/src/config.rs](file://crates/agent_runner/src/config.rs#L39-L73) #### 配置加载流程 ```mermaid flowchart TD Start([开始加载配置]) --> CheckFile["检查配置文件是否存在"] CheckFile --> |存在| LoadFromFile["从文件加载配置"] CheckFile --> |不存在| CreateDefault["创建默认配置文件"] LoadFromFile --> ApplyEnv["应用环境变量覆盖"] CreateDefault --> ApplyEnv ApplyEnv --> ApplyCli["应用命令行参数覆盖"] ApplyCli --> Validate["验证配置"] Validate --> End([返回最终配置]) ``` **Diagram sources** - [crates/rcoder/src/config.rs](file://crates/rcoder/src/config.rs#L254-L331) - [crates/agent_runner/src/config.rs](file://crates/agent_runner/src/config.rs#L111-L191) ### 主应用分析 主应用负责处理 HTTP 请求、管理会话状态和协调其他组件。 #### 主应用启动流程 ```mermaid sequenceDiagram participant Main as main() participant Config as load_config_with_args() participant PathResolver as HostPathResolver participant DockerManager as DockerManager participant Cleanup as startup_cleanup_containers() participant Proxy as PingoraServerManager participant Server as Axum Server Main->>Config : 解析命令行参数并加载配置 Config-->>Main : 返回配置对象 Main->>PathResolver : 初始化宿主机路径解析器 PathResolver-->>Main : 返回路径解析器 Main->>DockerManager : 初始化全局 DockerManager DockerManager-->>Main : 返回 DockerManager 实例 Main->>Cleanup : 启动时清理遗留容器 Cleanup-->>Main : 清理结果 Main->>Proxy : 启动 Pingora 反向代理如果启用 Proxy-->>Main : 代理服务句柄 Main->>Server : 创建路由并启动 HTTP 服务器 Server-->>Main : 服务器句柄 Main->>Main : 等待关闭信号 Main->>Main : 执行优雅关闭 ``` **Diagram sources** - [crates/rcoder/src/main.rs](file://crates/rcoder/src/main.rs#L32-L451) ### 路由系统分析 路由系统使用 Axum 框架,提供 REST API 和 SSE 流接口。 #### 路由结构 ```mermaid classDiagram class AppState { +config : AppConfig +sessions : DashMap> +project_and_agent_map : DashMap> +pingora_service : Option> } class Router { +create_router(state : Arc) Router +create_swagger_ui() SwaggerUi } class SessionInfo { +session_id : String +user_id : String +project_id : Option +created_at : DateTime +last_activity : DateTime } Router --> AppState : "使用" AppState --> SessionInfo : "包含" ``` **Diagram sources** - [crates/rcoder/src/router.rs](file://crates/rcoder/src/router.rs#L26-L36) - [crates/agent_runner/src/router.rs](file://crates/agent_runner/src/router.rs#L26-L38) #### API 路由流程 ```mermaid flowchart TD Start([HTTP 请求]) --> MatchRoute["匹配路由"] MatchRoute --> |/health| HealthCheck["健康检查处理器"] MatchRoute --> |/chat| ChatHandler["聊天处理器"] MatchRoute --> |/agent/progress/{session_id}| SSEHandler["SSE 通知处理器"] MatchRoute --> |/agent/session/cancel| CancelHandler["会话取消处理器"] MatchRoute --> |/agent/stop| StopHandler["代理停止处理器"] MatchRoute --> |/agent/status/{project_id}| StatusHandler["状态查询处理器"] MatchRoute --> |/proxy/*| ProxyHandler["代理处理器"] HealthCheck --> Response["返回健康状态"] ChatHandler --> Response SSEHandler --> Response CancelHandler --> Response StopHandler --> Response StatusHandler --> Response ProxyHandler --> Response ``` **Diagram sources** - [crates/rcoder/src/router.rs](file://crates/rcoder/src/router.rs#L53-L83) - [crates/agent_runner/src/router.rs](file://crates/agent_runner/src/router.rs#L41-L69) ### 聊天处理器分析 聊天处理器负责处理用户聊天请求,转发到容器化代理服务。 #### 聊天请求处理流程 ```mermaid sequenceDiagram participant Client as 客户端 participant Handler as handle_chat participant Container as ContainerManager participant Forward as forward_request_to_container_service participant Agent as agent_runner Client->>Handler : 发送聊天请求 Handler->>Container : 获取或创建容器 Container-->>Handler : 返回容器信息 Handler->>Handler : 更新项目状态映射 Handler->>Forward : 转发请求到容器服务 Forward->>Agent : 发送 HTTP 请求到 agent_runner Agent-->>Forward : 返回处理结果 Forward-->>Handler : 返回解析结果 Handler->>Handler : 更新会话状态 Handler-->>Client : 返回响应 ``` **Diagram sources** - [crates/rcoder/src/handler/chat_handler.rs](file://crates/rcoder/src/handler/chat_handler.rs#L108-L321) ### SSE 通知处理器分析 SSE 通知处理器负责建立服务器发送事件连接,实时推送代理执行进度。 #### SSE 代理流程 ```mermaid flowchart TD Start([SSE 连接请求]) --> FindContainer["查找对应容器"] FindContainer --> |找到| GetSSEURL["获取容器 SSE 端点 URL"] FindContainer --> |未找到| ReturnError["返回 404 错误"] GetSSEURL --> |成功| CreateStream["创建 SSE 代理流"] GetSSEURL --> |失败| ReturnError CreateStream --> ConnectContainer["连接到容器 SSE 端点"] ConnectContainer --> |成功| ForwardEvents["转发 SSE 事件"] ConnectContainer --> |失败| SendErrorEvent["发送错误事件"] ForwardEvents --> Client["客户端接收事件"] SendErrorEvent --> Client ``` **Diagram sources** - [crates/rcoder/src/handler/agent_session_notification.rs](file://crates/rcoder/src/handler/agent_session_notification.rs#L97-L153) ### Docker 管理器分析 Docker 管理器负责容器的创建、启动、停止和删除操作。 #### 多镜像配置结构 ```mermaid classDiagram class MultiImageConfig { +global_defaults : GlobalImageDefaults +services : HashMap +selection_strategy : ImageSelectionStrategy +cache_config : ImageCacheConfig } class GlobalImageDefaults { +image : Option +arm64_image : Option +amd64_image : Option +default_image : Option +registry_prefix : Option } class ServiceImageConfig { +service_type : ServiceType +image : Option +arm64_image : Option +amd64_image : Option +default_image : Option +image_tag_prefix : String +enabled : bool +environment : HashMap +command : Vec +entrypoint : Option> +resource_limits : ResourceLimits +work_dir : String +network_mode : String +mounts : Vec } class ImageSelectionStrategy { +ServiceOnly } class ImageCacheConfig { +enabled : bool +ttl_seconds : u64 +max_entries : usize } MultiImageConfig --> GlobalImageDefaults : "包含" MultiImageConfig --> ServiceImageConfig : "包含多个" MultiImageConfig --> ImageSelectionStrategy : "包含" MultiImageConfig --> ImageCacheConfig : "包含" ``` **Diagram sources** - [crates/shared_types/src/multi_image_config.rs](file://crates/shared_types/src/multi_image_config.rs#L17-L26) #### 全局 DockerManager 结构 ```mermaid classDiagram class DockerManager { +config : DockerManagerConfig +docker : Docker +image_selector : ImageSelector } class DockerManagerConfig { +multi_image_config : MultiImageConfig +auto_cleanup : bool +container_ttl_seconds : Option } class ImageSelector { +select_image(service_type : ServiceType) String } class global { +init_global_docker_manager() DockerResult<()> +init_global_docker_manager_with_config(config : DockerManagerConfig) DockerResult<()> +get_global_docker_manager() DockerResult> +with_global_docker_manager(f : FnOnce(&Arc) -> R) DockerResult } DockerManager --> DockerManagerConfig : "使用" DockerManager --> ImageSelector : "使用" global --> DockerManager : "管理单例" ``` **Diagram sources** - [crates/docker_manager/src/lib.rs](file://crates/docker_manager/src/lib.rs#L144-L210) ## 依赖分析 项目依赖关系复杂,主要依赖包括: ```mermaid graph TB subgraph "主应用" Rcoder[rcoder] AgentRunner[agent_runner] end subgraph "基础设施" Pingora[pingora-proxy] DockerManager[docker_manager] SharedTypes[shared_types] end subgraph "协议适配" AcpAdapter[acp_adapter] ClaudeAgent[claude-code-agent] CodexAgent[codex-acp-agent] end Rcoder --> AgentRunner Rcoder --> Pingora Rcoder --> DockerManager Rcoder --> SharedTypes AgentRunner --> Pingora AgentRunner --> DockerManager AgentRunner --> SharedTypes AcpAdapter --> SharedTypes ClaudeAgent --> AcpAdapter CodexAgent --> AcpAdapter style Rcoder fill:#f9f,stroke:#333 style AgentRunner fill:#f9f,stroke:#333 ``` **Diagram sources** - [Cargo.toml](file://Cargo.toml#L1-L205) ## 性能考虑 系统在设计时考虑了多项性能优化: 1. **异步架构**:使用 Tokio 异步运行时,支持高并发处理 2. **状态管理**:使用 DashMap 实现高效的并发状态管理 3. **连接复用**:使用 reqwest 客户端复用 HTTP 连接 4. **日志优化**:使用 tracing 和 JSON 格式日志,便于后续分析 5. **资源清理**:定期清理闲置容器,释放系统资源 **Section sources** - [crates/rcoder/src/main.rs](file://crates/rcoder/src/main.rs#L160-L164) - [crates/rcoder/src/config.rs](file://crates/rcoder/src/config.rs#L158-L164) ## 故障排除指南 常见问题及解决方案: ### 容器自检测失败 当容器自检测失败时,检查以下配置: - Docker socket 路径是否正确 - Docker socket 是否已挂载到容器 - 容器是否有权限访问 Docker API - 项目工作目录是否正确挂载 ### 端口被占用 使用 `--port` 参数指定其他端口: ```bash cargo run --bin rcoder -- --port 8087 ``` ### AI 代理连接失败 检查 API 密钥和网络连接,确保相关服务已正确配置。 ### 配置文件错误 检查 YAML 格式和字段名称,确保配置文件语法正确。 **Section sources** - [README.md](file://README.md#L620-L626) ## 结论 RCoder 是一个功能强大的 AI 驱动开发平台,通过模块化设计和现代化技术栈实现了高效的 AI 代理集成。系统具有良好的可扩展性和维护性,适合进一步开发和定制。