# codecommander **Repository Path**: changstudy/codecommander ## Basic Information - **Project Name**: codecommander - **Description**: 111111111111 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-25 - **Last Updated**: 2026-03-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # CodeCommander 基于 Spring AI + Tool Calling 的智能代码分析系统,支持多项目代码问答、跨项目分析和日志错误追踪。 ## 技术栈 | 层级 | 技术 | |------|------| | 前端 | Vue 3 + TypeScript + Vite + Pinia + Vue Router | | 后端 | Spring Boot 3 + Spring AI 1.0.3 (OpenAI 兼容) + Java 21 | | ORM | MyBatis-Plus 3.5.7 | | 数据库 | MySQL 8.0 | | 搜索引擎 | Elasticsearch 7.17 (双实例:本地代码索引 + 远程日志查询) | | 缓存 | Redis 7 | | 消息队列 | RabbitMQ 3 | | AI 模型 | 通过 OpenAI 兼容 API 接入 (当前: gemini-3-pro-high) | | 容器化 | Docker Compose | ## 系统架构 ``` ┌──────────────┐ SSE Stream ┌──────────────────────────────────┐ │ Vue 3 前端 │ ◄──────────────────► │ Spring Boot 后端 │ │ (Vite Dev) │ POST /api/chat │ │ └──────────────┘ │ ChatController │ │ ├── AgentService (路由) │ │ │ ├── 普通对话 → ChatClient │ │ │ ├── 代码分析 → Tool Calling │ │ │ └── 日志分析 → ErrorAnalysis│ │ └── IntentParseService (意图) │ └──────┬───────┬───────┬───────────┘ │ │ │ ┌──────┘ ┌────┘ ┌────┘ ▼ ▼ ▼ MySQL ES(本地) ES(远程) 符号元数据 代码内容 生产日志 ``` ## 问答流程 ### 1. 代码索引(前置准备) 用户通过前端上传项目(ZIP 或本地路径)→ 后端解析代码文件 → 提取符号(类、方法、接口路径)存入 MySQL `code_symbol` 表 → 代码内容分块存入 Elasticsearch `code_content` 索引。 ### 2. 代码问答(核心流程) ``` 用户输入 "@项目A 这个项目的登录逻辑是什么?" │ ▼ 前端提取 @mention → 解析 projectIds → POST /api/chat/stream │ ▼ IntentParseService 判断意图 ├── 包含 traceId → 日志分析流程 (ErrorAnalysisService) └── 无 traceId → 代码分析流程 (AgentService) │ ▼ AgentService.codeAnalysisWithTools() ├── 构建项目上下文 Map (projectName → projectId + codebasePath) ├── 注入 CodeAnalysisTools ├── 加载 System Prompt (从 sys_config 表读取) └── 创建 ChatClient + Tool Calling 循环 │ ▼ AI 模型自主调用工具(Spring AI 自动管理循环) ├── searchSymbol → MySQL 精确搜索类名/方法名/接口路径 ├── searchCode → Elasticsearch 关键词搜索代码内容 ├── readFile → 读取指定文件的指定行范围 ├── listFiles → 列出目录结构 ├── findReferences → 查找符号引用位置 ├── findImplementations → 查找接口实现类 └── getClassStructure → 获取类结构概览 │ ▼ AI 综合工具返回的代码信息,生成回答 → SSE 流式返回前端 ``` ### 2.1 前端用户“提交问题”详细流程(从点击发送到渲染完成) 以下流程对应 `front/src/components/ChatView.vue` + `front/src/api.ts` + 后端 `ChatController/AgentService` 的联动: 1. **输入校验与会话准备** - 点击发送(或 Enter)后,先判断输入是否为空、是否正在请求中。 - 若当前没有会话 `currentSessionId`,先调用 `POST /api/sessions` 创建新会话。 2. **本地回显用户消息** - 立即把用户消息 push 到 `messages`,让用户先看到自己刚发的问题。 - UI 同步置为 `isLoading = true`,准备展示流式返回。 3. **解析项目上下文(@mention + 已选项目)** - 从输入里用 `@xxx` 正则提取项目名,映射为 `projectIds`。 - 与输入框上方“项目 chips”中的 `selectedProjectIds` 合并去重。 - 发送后清空本轮 `selectedProjectIds`(避免误带到下一轮)。 4. **发起流式请求** - 调用 `POST /api/chat/stream`,请求体:`{ sessionId, userQuery, projectIds }`。 - 如果本轮没有任何项目,则 `projectIds` 不传(`undefined`)。 5. **后端会话更新与项目继承** - `ChatController` 在每轮请求到达时更新会话更新时间。 - 若本轮显式带了 `projectIds`,会把第一个项目写入 `chat_session.project_id` 作为会话默认项目。 - `AgentService` 会做 `effectiveProjectIds` 解析:本轮有项目用本轮;本轮没项目则回退到会话默认项目(单项目继承)。 6. **Agent 路由** - 先做意图识别: - 命中 traceId → 走日志分析流程(可结合继承项目做代码定位)。 - 否则: - 有 `effectiveProjectIds` → 走代码工具分析(Tool Calling)。 - 无项目上下文 → 走普通对话。 7. **SSE 流式消费与前端渲染** - 前端按 SSE 块解析 `event/data`,持续追加到 `streamingBuffer`。 - 通过节流(40ms)把缓冲刷到 `streamingContent`,减少频繁重排。 - 即使已输出部分文本,仍显示“继续分析中...”+ 动画点,避免“看起来卡死”的错觉。 8. **收尾** - 流结束后把完整 assistant 内容固化到 `messages`。 - 刷新会话列表并把当前会话移动到顶部。 - 清理 loading/streaming 状态。 ### 2.2 提交流程图(前端 → 后端 → SSE) ```mermaid sequenceDiagram participant U as 用户 participant FE as 前端 ChatView participant API as 前端 api.ts participant CH as ChatController participant AG as AgentService participant AI as ChatModel/Tools participant DB as MySQL(Session/Memory) U->>FE: 输入问题并发送 FE->>FE: 校验输入/是否在请求中 alt 无 currentSessionId FE->>CH: POST /api/sessions CH->>DB: 新建 session CH-->>FE: sessionId end FE->>FE: 回显用户消息 + isLoading=true FE->>FE: 解析 @mention + selectedProjectIds FE->>API: chatStream(sessionId,userQuery,projectIds?) API->>CH: POST /api/chat/stream (SSE) CH->>DB: 更新 session 更新时间/首轮标题 alt 本轮带 projectIds CH->>DB: 写入 session.project_id(第一个) end CH->>AG: chatStream(sessionId,userQuery,projectIds) AG->>DB: 解析 effectiveProjectIds(含会话继承兜底) alt traceId 日志分析 AG->>AI: ErrorAnalysis (可带代码工具) else 有 effectiveProjectIds AG->>AI: CodeAnalysis + Tool Calling else 普通对话 AG->>AI: Chat only end AI-->>CH: 分片输出 CH-->>API: SSE message/error 事件流 API-->>FE: AsyncGenerator chunk FE->>FE: streamingBuffer -> streamingContent(节流渲染) FE->>FE: 显示“继续分析中...” CH-->>API: [DONE]/流结束 API-->>FE: 结束 FE->>FE: 固化 assistant 消息 + 清理 loading ``` ### 3. 日志错误分析 用户输入包含 traceId(UUID/雪花ID 等格式)时自动触发:查询远程 ES 中的 ERROR 日志 → 构建分析 Prompt → 若关联了项目则启用 Tool Calling 读取源码定位根因。 ### 4. 多项目跨项目分析 前端支持 `@projectA @projectB` 同时选择多个项目。每个工具方法接受 `projectName` 参数,AI 可在不同项目中分别搜索并对比结果。 ## 使用方式 1. **创建项目**:在前端设置页面添加项目,指定本地代码路径或上传 ZIP 2. **构建索引**:项目创建后自动触发代码索引(符号提取 + ES 内容索引) 3. **开始问答**:在聊天界面输入 `@项目名` 选择项目,然后提问 4. **单项目继承**:同一会话内首次指定项目后,后续不指定时会自动继承该项目 5. **多项目分析**:输入多个 `@项目名` 进行跨项目对比分析(当前会话默认继承仍按单项目处理) 6. **日志分析**:直接粘贴 traceId,系统自动识别并查询错误日志 ## 首次启动 ### 环境要求 - Java 21+ - Node.js 20.19+ 或 22.12+ - Docker & Docker Compose - OpenAI 兼容的 AI 模型 API(默认连接 `http://127.0.0.1:8045`) ### 步骤 **1. 启动基础设施** ```bash cd /path/to/codecommander docker compose up -d ``` 这会启动 MySQL 8.0、Redis 7、RabbitMQ 3、Elasticsearch 7.17。 **2. 初始化数据库** ```bash mysql -u root -p12345678 < backend/src/main/resources/db/init-mysql.sql ``` **3. 配置 AI 模型** 编辑 `backend/src/main/resources/application.yml`,修改 `spring.ai.openai` 下的 `base-url` 和 `api-key` 指向你的 AI 模型 API。 **4. 启动后端** ```bash cd backend mvn spring-boot:run ``` 后端启动在 `http://localhost:8080`。 **5. 启动前端** ```bash cd front npm install npm run dev ``` 前端启动在 `http://localhost:5173`,API 请求自动代理到后端。 **6. 开始使用** 浏览器打开 `http://localhost:5173`,在设置页面添加项目,等待索引完成后即可开始代码问答。 ## Docker 生产部署 推荐使用双机部署(应用机 + 数据机),请参考: - `docker-compose.app.yml` - `docker-compose.data.yml` - `/双机Docker部署指南.md`