# codepilot
**Repository Path**: ai-workstation_1/codepilot
## Basic Information
- **Project Name**: codepilot
- **Description**: CodePilot - Java 智能编程助手 AI Agent
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-03-24
- **Last Updated**: 2026-03-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
CodePilot
Java 智能编程助手 AI Agent
基于 Spring Boot 3 + Spring AI 构建,支持多模型切换、工具调用、长上下文优化的 AI 编程助手
核心功能 •
模型支持 •
快速开始 •
项目结构 •
开发指南 •
部署文档
---
## ✨ 核心功能
### 🤖 智能对话
- 多轮对话支持,精准理解编程上下文
- 流式响应,实时输出代码与解释
- 会话记忆管理,支持长上下文自动压缩优化
### 🔀 多模型支持
- 内置 **OpenAI / DeepSeek / Claude / Kimi** 等多模型适配
- 请求级别动态切换模型,支持在同一会话中使用不同模型
- `@AIProviderType` 注解 + 自动发现机制,**新增模型仅需 30 行代码**
- 兼容所有 OpenAI 协议的第三方服务(Azure、Ollama、通义千问、智谱等)
### 📝 代码生成
- 根据自然语言描述生成 Java 代码
- 支持 Controller、Service、Entity、DTO 等多种类型
- 自动生成单元测试
### 🔍 代码审查
- Bug 检测与安全漏洞扫描
- 性能问题分析
- 代码风格与最佳实践检查
### 🛠️ 工具调用(Tool Use)
| 工具 | 功能 |
|:-----|:-----|
| `read_file` | 读取项目文件内容 |
| `write_file` | 创建或修改文件 |
| `search_code` | 在项目中搜索代码 |
| `run_maven` | 执行 Maven 构建命令 |
| `analyze_class` | 分析 Java 类结构(方法、字段、继承关系) |
| `execute_command` | 执行白名单内的系统命令 |
### 🧠 长上下文优化
专为编程场景设计的三阶段上下文管理:
- **Token 预算制**:根据不同模型的上下文窗口自动分配预算
- **智能截断**:工具输出保留头尾关键部分、代码块保留前 150 行 + 后 50 行
- **摘要注入**:被压缩的历史消息提取关键决策注入 system prompt,避免丢失上下文
---
## 🤖 支持的 AI 模型
| 提供商 | 模型示例 | 上下文窗口 | 接入方式 | 配置条件 |
|:------|:--------|:----------|:---------|:---------|
| **OpenAI** | gpt-4o, gpt-4-turbo, gpt-3.5-turbo | 128K / 16K | Spring AI 原生集成 | `OPENAI_API_KEY` |
| **DeepSeek** | deepseek-chat, deepseek-coder | 64K | WebClient HTTP 调用 | `DEEPSEEK_API_KEY` |
| **Claude** | claude-3-5-sonnet, claude-3-opus | 200K | OpenAI 兼容协议代理 | `CLAUDE_API_KEY` |
| **Kimi** | moonshot-v1-8k/32k/128k | 8K~128K | OpenAI 兼容协议 | `KIMI_API_KEY` |
| **通义千问** | qwen-plus, qwen-max | 128K | OpenAI 兼容协议 | 需自行扩展 |
| **智谱 GLM** | glm-4, glm-4-flash | 128K | OpenAI 兼容协议 | 需自行扩展 |
> 💡 所有标记"需自行扩展"的模型,只需继承 `AbstractOpenAICompatibleService` 并添加约 30 行代码即可完成接入。详见 [开发指南 - 添加新模型](#添加新-ai-模型)。
---
## 🚀 快速开始
### 环境要求
- JDK 17+
- Maven 3.9+
- Redis 7.0+
- MySQL 8.0+(可选)
### 本地运行
```bash
# 1. 克隆项目
git clone codepilot
cd codepilot
# 2. 配置环境变量
cp .env.example .env
# 编辑 .env,至少填入 OPENAI_API_KEY
# 3. 编译项目
mvn clean package -DskipTests
# 4. 启动服务
java -jar codepilot-trigger/target/codepilot-trigger-1.0.0-SNAPSHOT.jar
# 5. 访问 API 文档
# http://localhost:8080/doc.html
```
### Docker 一键部署
```bash
cp .env.example .env
# 编辑 .env,填入 API Key
docker compose up -d
docker compose logs -f codepilot
```
> 📖 详细部署说明(包括生产环境配置、JVM 调优、高可用架构等),请查阅 **[DEPLOYMENT.md](DEPLOYMENT.md)**
---
## 📁 项目结构
```text
codepilot/
│
├── codepilot-types/ # 基础类型层
│ ├── enums/
│ │ ├── AIProvider.java # AI 提供商枚举(OpenAI/DeepSeek/Claude/Kimi/...)
│ │ ├── ResponseCode.java # 响应码
│ │ ├── MessageRole.java # 消息角色
│ │ └── ToolStatus.java # 工具状态
│ ├── exception/ # 业务异常(CodePilotException, AIServiceException)
│ ├── model/ # 通用模型(ToolCall, ToolResult)
│ └── common/ # 常量、通用 Result 封装
│
├── codepilot-domain/ # 领域层(核心)
│ ├── agent/
│ │ ├── model/ # Agent 会话、消息、请求、响应模型
│ │ ├── service/ # IAgentService, IAIModelService 接口
│ │ └── repository/ # ISessionRepository 接口
│ ├── context/
│ │ ├── ContextWindowManager.java # ⭐ 上下文窗口管理器(长上下文优化核心)
│ │ └── TokenEstimator.java # Token 估算工具
│ ├── memory/
│ │ └── IMemoryManager.java # 记忆管理器接口
│ ├── tool/
│ │ ├── Tool.java # 工具接口
│ │ ├── ToolRegistry.java # 工具注册中心
│ │ ├── executor/ToolExecutor.java # 工具执行器
│ │ └── impl/ # 6 个内置工具实现
│ └── knowledge/ # 知识库接口(RAG 扩展预留)
│
├── codepilot-infrastructure/ # 基础设施层
│ ├── ai/
│ │ ├── AIModelServiceRouter.java # ⭐ 多模型路由工厂(自动发现 + 动态路由)
│ │ ├── @AIProviderType # 提供商类型注解
│ │ ├── AbstractOpenAICompatible... # ⭐ 通用 OpenAI 兼容适配器(扩展基类)
│ │ ├── OpenAIModelService.java # OpenAI 实现(Spring AI 原生)
│ │ ├── DeepSeekModelService.java # DeepSeek 实现(WebClient)
│ │ ├── ClaudeModelService.java # Claude 实现(继承通用适配器)
│ │ ├── KimiModelService.java # Kimi 实现(继承通用适配器)
│ │ └── openai/OpenAIService.java # OpenAI 高级服务(含 Agent 循环)
│ └── persistence/redis/
│ ├── RedisSessionRepository.java # 会话持久化
│ └── RedisMemoryManager.java # 对话记忆管理
│
├── codepilot-app/ # 应用服务层
│ └── service/
│ ├── AgentService.java # ⭐ Agent 核心编排(含上下文优化集成)
│ ├── AgentAppService.java # 应用层门面
│ ├── CodeGenerationService.java # 代码生成服务
│ └── CodeReviewService.java # 代码审查服务
│
├── codepilot-api/ # API 定义层
│ └── dto/ # 请求/响应 DTO
│
├── codepilot-trigger/ # 触发器层(HTTP 入口)
│ ├── CodePilotApplication.java # 🚀 启动类
│ ├── http/ # ChatController, ToolController, CodeController
│ ├── config/ # GlobalExceptionHandler, SwaggerConfig
│ └── resources/
│ ├── application.yml # 主配置文件
│ └── application-prod.yml # 生产环境配置
│
├── docker/ # Docker 中间件配置
├── Dockerfile # 应用镜像构建
├── docker-compose.yml # 完整部署编排
├── DEPLOYMENT.md # 📖 部署指导文档
└── pom.xml # Maven 父 POM
```
---
## 🔧 配置说明
### 环境变量一览
| 变量 | 说明 | 默认值 | 必需 |
|:-----|:-----|:------|:-----|
| `OPENAI_API_KEY` | OpenAI API Key | - | ✅ 至少配一个 |
| `OPENAI_BASE_URL` | OpenAI API 地址 | `https://api.openai.com` | ❌ |
| `DEEPSEEK_API_KEY` | DeepSeek API Key | - | ❌ |
| `CLAUDE_API_KEY` | Claude API Key(通过代理) | - | ❌ |
| `CLAUDE_BASE_URL` | Claude 代理地址 | `https://openrouter.ai/api/v1` | ❌ |
| `KIMI_API_KEY` | Kimi (Moonshot) API Key | - | ❌ |
| `REDIS_HOST` | Redis 地址 | `localhost` | ✅ |
| `REDIS_PORT` | Redis 端口 | `6379` | ❌ |
| `MYSQL_HOST` | MySQL 地址 | `localhost` | ❌ |
| `MYSQL_PORT` | MySQL 端口 | `3306` | ❌ |
### 模型配置
```yaml
# application.yml
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY:sk-xxx}
base-url: ${OPENAI_BASE_URL:https://api.openai.com}
deepseek:
api:
key: ${DEEPSEEK_API_KEY:}
url: https://api.deepseek.com/v1
claude:
api:
key: ${CLAUDE_API_KEY:}
url: ${CLAUDE_BASE_URL:https://openrouter.ai/api/v1}
kimi:
api:
key: ${KIMI_API_KEY:}
url: https://api.moonshot.cn/v1
```
---
## 📡 API 接口
### 聊天接口
**创建会话**
```http
POST /api/v1/chat/session
```
**流式聊天**
```http
POST /api/v1/chat/completions
Content-Type: application/json
{
"sessionId": "xxx",
"message": "帮我生成一个用户注册的 Service 类",
"model": "gpt-4o",
"stream": true
}
```
> `model` 字段支持传入提供商标识(`openai` / `deepseek` / `claude` / `kimi`)或具体模型名(`gpt-4o` / `deepseek-chat` / `claude-3-5-sonnet`),系统自动路由到对应服务。
**同步聊天**
```http
POST /api/v1/chat/completions/sync
Content-Type: application/json
{
"message": "分析这段代码有什么问题",
"model": "deepseek",
"projectPath": "/path/to/project"
}
```
### 代码接口
**生成代码**
```http
POST /api/v1/code/generate
Content-Type: application/json
{
"type": "service",
"packageName": "com.example.user",
"className": "UserService",
"description": "用户注册服务,包含邮箱验证"
}
```
**代码审查**
```http
POST /api/v1/code/review
Content-Type: application/json
{
"code": "public class UserService { ... }",
"reviewTypes": ["bug", "security", "performance"]
}
```
### 工具接口
```http
GET /api/v1/tools # 获取工具列表
POST /api/v1/tools/{toolName}/execute # 执行指定工具
```
---
## 📖 开发指南
### 添加新工具
在 `codepilot-domain/tool/impl/` 下创建工具类,实现 `Tool` 接口并添加 `@Component` 注解:
```java
@Slf4j
@Component
public class MyNewTool implements Tool {
@Override
public String getName() { return "my_tool"; }
@Override
public String getDescription() { return "工具描述"; }
@Override
public String getParametersSchema() {
return """
{
"type": "object",
"properties": {
"param1": {"type": "string", "description": "参数说明"}
},
"required": ["param1"]
}
""";
}
@Override
public ToolResult execute(Map parameters) {
String param1 = (String) parameters.get("param1");
// 实现工具逻辑
return ToolResult.success("tool_call_id", "my_tool", "执行结果");
}
}
```
### 添加新 AI 模型
只需 **3 步**,无需修改任何已有代码:
**① 在 `AIProvider` 枚举中添加新值**(如果还没有):
```java
// codepilot-types/.../AIProvider.java
QWEN("qwen", "Alibaba Qwen", "qwen-plus"),
```
**② 创建实现类**(继承通用适配器,约 30 行):
```java
@Slf4j
@Service
@AIProviderType(AIProvider.QWEN) // 标注提供商类型
@ConditionalOnProperty(prefix = "qwen.api", name = "key") // 仅在配了 key 时启用
public class QwenModelService extends AbstractOpenAICompatibleService {
@Value("${qwen.api.key:}") private String apiKey;
@Value("${qwen.api.url:https://dashscope.aliyuncs.com/compatible-mode/v1}")
private String apiUrl;
@Value("${qwen.model:qwen-plus}") private String model;
@Override protected String getApiKey() { return apiKey; }
@Override protected String getApiUrl() { return apiUrl; }
@Override protected String getModel() { return model; }
@Override protected String getProviderName() { return "Qwen"; }
}
```
**③ 在 `application.yml` 中添加配置**:
```yaml
qwen:
api:
key: ${QWEN_API_KEY:}
url: https://dashscope.aliyuncs.com/compatible-mode/v1
model: qwen-plus
```
完成后,用户即可通过 `"model": "qwen"` 或 `"model": "qwen-plus"` 使用新模型。
### 模型扩展架构图
```text
┌──────────────────┐
│ ChatRequest │
│ model: "kimi" │
└────────┬─────────┘
│
┌──────────────▼──────────────┐
│ AIModelServiceRouter │
│ 自动发现 @AIProviderType │
└──────────────┬──────────────┘
│
┌──────────┬───────────┬───┴────┬──────────┬──────────┐
▼ ▼ ▼ ▼ ▼ ▼
┌─────────┐┌─────────┐┌────────┐┌───────┐┌────────┐┌────────┐
│ OpenAI ││DeepSeek ││ Claude ││ Kimi ││ Qwen ││ Zhipu │
│ @Primary││@Service ││@Cond.. ││@Cond..││ 自行 ││ 自行 │
└─────────┘└─────────┘└────────┘└───────┘│ 扩展 ││ 扩展 │
└────────┘└────────┘
```
---
## 📄 技术栈
| 分类 | 技术 | 版本 |
|:-----|:-----|:-----|
| 语言 | Java | 17 |
| 框架 | Spring Boot | 3.2.3 |
| AI 集成 | Spring AI | 1.0.0-M6 |
| ORM | MyBatis Plus | 3.5.5 |
| 缓存 | Redis (Lettuce) | 7.x |
| 数据库 | MySQL | 8.0 |
| 连接池 | Druid | 1.2.21 |
| API 文档 | Knife4j (OpenAPI 3) | 4.4.0 |
| JSON | FastJSON2 | 2.0.47 |
| 工具库 | Hutool, Guava | 5.8.25, 33.0.0 |
| 代码简化 | Lombok, MapStruct | 1.18.30, 1.5.5 |
| 容器化 | Docker + Compose | - |
---
## 📄 许可证
本项目采用 Apache 2.0 许可证,详见 [LICENSE](LICENSE) 文件。
## 👤 联系方式
- 作者:邓康斌
- 邮箱:1349926002@qq.com
---
CodePilot — 让编程更智能 🚀