# Easy-AI-CodeReview
**Repository Path**: xyb-luwei/Easy-AI-CodeReview
## Basic Information
- **Project Name**: Easy-AI-CodeReview
- **Description**: copyfrom https://github.com/spherical-up/Easy-AI-CodeReview
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-04-07
- **Last Updated**: 2026-04-07
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README

## 项目简介
本项目是一个基于大模型的自动化代码审查工具,帮助开发团队在代码合并或提交时,快速进行智能化的审查(Code Review),提升代码质量和开发效率。
## 功能
- 🚀 多模型灵活切换
- 全面兼容 **DeepSeek、OpenAI、通义千问** 想用哪个,用哪个!轻松上手,自由切换。
- 📢 消息实时送达
- 审查结果 **一键推送** 到 **钉钉、企业微信、飞书** 及时响应,代码问题无所遁形!
- 📅 自动生成开发日报
- 基于 **GitHub / GitLab / Gitea Commit** 记录,自动梳理每日开发动态:
谁在认真敲代码,谁在划水,一清二楚 😼。
- 🔗 多平台支持
- 全面支持 **GitLab、GitHub、Gitea** 三大主流代码托管平台,一套系统,多平台通用!
- 📊 数据可视化 Dashboard
- 集中展示所有 **Code Review 记录**,提供清晰的:
- 项目整体统计
- 成员贡献分析
- 数据说话,甩锅无门!
- 🎭 多种审查风格,任你挑!
| 风格 | 描述 | 示例 |
|------|------|------|
| 🤵 **专业型** | 严谨细致、正式专业 | *建议优化此函数的命名,以提升可读性。* |
| 😈 **毒舌型** | 毒舌吐槽、直击要害 | *你确定这是人能读的代码?* |
| 🌸 **绅士型** | 温柔委婉、如沐春风 | *或许这里可以再优化一下呢~* |
| 🤪 **幽默型** | 搞笑风趣、快乐改码 | *这段 if-else 比我相亲经历还复杂!* |
## 效果图:
### Push 推送示例

### 代码审查摘要

### GitLab 评论示例

### Gitea 评论示例

### Dashboard 数据看板

## 原理
在开发者向 **GitLab / GitHub / Gitea** 提交代码(包括 Merge Request/Pull Request 创建或 Push 操作)时,代码托管平台会根据预设的 Webhook 配置触发回调请求,调用本系统提供的接口。系统接收到事件后,将解析提交内容,并通过集成的第三方大语言模型对代码变更进行静态审查。
审查内容包括但不限于:代码规范检查、潜在错误识别、安全风险分析及可维护性建议。完成审查后,系统会将结果以评论的形式自动回写至对应的 Merge Request/Pull Request 或 Commit 页面(Gitea 还支持创建 Issue 来存储审查结果),确保审查反馈能够实时集成至开发工作流中,从而提升代码质量与团队协作效率。
**流程图**
```mermaid
flowchart TD
A["🎯 GitLab/GitHub/Gitea"] --> B["🌐 Webhook API Call"]
B --> C{"📂 平台识别
Platform = ?"}
C --> C1{"📂 事件类型
Event = ?"}
%% Merge Request 流程
C -- "merge request" --> D["📌 处理合并请求
handle_merge_request"]
D --> E{"⚙️ 操作类型?
action = open / update?"}
E -- "是" --> F["🧾 获取代码变更
obtain code changes"]
F --> G["🤖 大模型 Review
LLM review"]
G --> H1["📤 发送代码审核 IM
Send CR IM message"]
%% Push 流程
C -- "push" --> I["📌 处理 Push 请求
handle_push_request"]
I --> J["📝 记录日志
log push"]
J --> K{"🛠️ 启用 Push Review?
push review enabled?"}
K -- "否" --> L["📤 发送 IM 通知
Send IM notice"]
K -- "是" --> M["🤖 大模型 Review
LLM review"]
M --> H2["📤 发送代码审核 IM
Send CR IM message"]
%% 定时任务流程
Z["⏰ 定时任务触发
Scheduled Timer"] --> P["📂 读取日志
Read logs"]
P --> Q["🧠 大模型总结
LLM summary"]
Q --> H3["📤 发送 IM 日报
Send IM report"]
%% 虚线提示:日志来源
J -.-> P
%% 样式统一应用,避免遗漏
style A fill:#2E86C1,stroke:#1B4F72,stroke-width:3px,color:#FFFFFF,font-weight:bold,font-size:18px
style B fill:#117A65,stroke:#0B5345,stroke-width:3px,color:#FFFFFF,font-weight:bold,font-size:16px
style C fill:#D68910,stroke:#9A6400,stroke-width:3px,color:#FFFFFF,font-weight:bold,font-size:16px
style D fill:#85C1E9,stroke:#2874A6,stroke-width:2px,color:#1B2631,font-weight:bold,font-size:14px
style E fill:#85C1E9,stroke:#2874A6,stroke-width:2px,color:#1B2631,font-weight:bold,font-size:14px
style F fill:#85C1E9,stroke:#2874A6,stroke-width:2px,color:#1B2631,font-weight:bold,font-size:14px
style G fill:#85C1E9,stroke:#2874A6,stroke-width:2px,color:#1B2631,font-weight:bold,font-size:14px
style I fill:#F7DC6F,stroke:#B7950B,stroke-width:2px,color:#5D4037,font-weight:bold,font-size:14px
style J fill:#F7DC6F,stroke:#B7950B,stroke-width:2px,color:#5D4037,font-weight:bold,font-size:14px
style K fill:#F7DC6F,stroke:#B7950B,stroke-width:2px,color:#5D4037,font-weight:bold,font-size:14px
style M fill:#F7DC6F,stroke:#B7950B,stroke-width:2px,color:#5D4037,font-weight:bold,font-size:14px
style P fill:#AED6F1,stroke:#2980B9,stroke-width:2px,color:#1B2631,font-weight:bold,font-size:14px
style Q fill:#AED6F1,stroke:#2980B9,stroke-width:2px,color:#1B2631,font-weight:bold,font-size:14px
style H1 fill:#27AE60,stroke:#145A32,stroke-width:3px,color:#ECF0F1,font-weight:bold,font-size:15px
style H2 fill:#27AE60,stroke:#145A32,stroke-width:3px,color:#ECF0F1,font-weight:bold,font-size:15px
style H3 fill:#27AE60,stroke:#145A32,stroke-width:3px,color:#ECF0F1,font-weight:bold,font-size:15px
style L fill:#E74C3C,stroke:#922B21,stroke-width:2px,color:#FFFFFF,font-weight:bold,font-size:14px
style Z fill:#BB8FCE,stroke:#6C3483,stroke-width:3px,color:#FFFFFF,font-weight:bold,font-size:16px
```
## 部署
### 方案一:Docker 部署
**1. 准备环境文件**
- 克隆项目仓库:
```aiignore
git clone https://github.com/spherical-up/Easy-AI-CodeReview
cd Easy-AI-CodeReview
```
- 创建配置文件:
```aiignore
cp config/.env.dist config/.env
```
- 编辑 config/.env 文件,配置以下关键参数:
```bash
#大模型供应商配置,支持 openai , deepseek 和 qwen
LLM_PROVIDER=deepseek
#DeepSeek
DEEPSEEK_API_KEY={YOUR_DEEPSEEK_API_KEY}
#支持review的文件类型(未配置的文件类型不会被审查)
SUPPORTED_EXTENSIONS=.java,.py,.php,.yml,.vue,.go,.c,.cpp,.h,.js,.css,.md,.sql
#钉钉消息推送: 0不发送钉钉消息,1发送钉钉消息
DINGTALK_ENABLED=0
DINGTALK_WEBHOOK_URL={YOUR_WDINGTALK_WEBHOOK_URL}
#Gitlab配置
GITLAB_ACCESS_TOKEN={YOUR_GITLAB_ACCESS_TOKEN}
```
**2. 启动服务**
```bash
docker-compose up -d
```
**3. 验证部署**
- 主服务验证:
- 访问 http://your-server-ip:5001
- 显示 "The code review server is running." 说明服务启动成功。
- Dashboard 验证:
- 访问 http://your-server-ip:5002
- 看到一个审查日志页面,说明 Dashboard 启动成功。
### 方案二:本地Python环境部署
**1. 获取源码**
```bash
git clone https://github.com/spherical-up/Easy-AI-CodeReview
cd Easy-AI-CodeReview
```
**2. 安装依赖**
使用 Python 环境(建议使用虚拟环境 venv)安装项目依赖(Python 版本:3.10+):
```bash
pip install -r requirements.txt
```
**3. 配置环境变量**
同 Docker 部署方案中的.env 文件配置。
**4. 启动服务**
- 启动API服务:
```bash
python api.py
```
- 启动Dashboard服务:
```bash
python ui_server.py
```
**注意**:Dashboard 前端已从 Streamlit 迁移到基于 HTML + TailwindCSS + JavaScript 的实现,前端文件位于 `web/` 目录中。`ui.py` 已废弃,请使用 `ui_server.py` 启动新的前端服务。
### 配置 Webhook
#### GitLab Webhook 配置
**1. 创建Access Token**
方法一:在 GitLab 个人设置中,创建一个 Personal Access Token。
方法二:在 GitLab 项目设置中,创建Project Access Token
**2. 配置 Webhook**
在 GitLab 项目设置中,配置 Webhook:
- URL:http://your-server-ip:5001/review/webhook
- Trigger Events:勾选 Push Events 和 Merge Request Events (不要勾选其它Event)
- Secret Token:上面配置的 Access Token(可选)
**备注**
1. Token使用优先级
- 系统优先使用 .env 文件中的 `GITLAB_ACCESS_TOKEN`。
- 如果 .env 文件中没有配置 `GITLAB_ACCESS_TOKEN`,则使用 Webhook 传递的Secret Token。
2. 网络访问要求
- 请确保 GitLab 能够访问本系统。
- 若内网环境受限,建议将系统部署在外网服务器上。
#### GitHub Webhook 配置
**1. 创建Access Token**
在 GitHub 个人设置中,创建一个 Personal Access Token,需要 `repo` 权限。
**2. 配置 Webhook**
在 GitHub 项目设置中,进入 Settings → Webhooks → Add webhook:
- URL:http://your-server-ip:5001/review/webhook
- Content type:选择 `application/json`
- Events:选择 `Just the push event` 和 `Pull requests`(或选择 `Send me everything`)
- Secret:可选,用于签名验证
**3. 环境变量配置**
在 `.env` 文件中配置:
```bash
GITHUB_ACCESS_TOKEN=your_github_access_token_here
GITHUB_URL=https://api.github.com
```
#### Gitea Webhook 配置
**1. 创建Access Token**
在 Gitea 个人设置中,创建一个 Access Token,需要 `repo` 权限。
**2. 配置 Webhook**
在 Gitea 项目设置中,进入 Settings → Webhooks → Add Webhook:
- URL:http://your-server-ip:5001/review/webhook
- Content Type:选择 `application/json`
- Events:勾选 `Push` 和 `Pull Request`(或选择 `Send Everything`)
- Secret:可选,用于签名验证
**3. 环境变量配置**
在 `.env` 文件中配置:
```bash
GITEA_ACCESS_TOKEN=your_gitea_access_token_here
GITEA_URL=https://your-gitea-instance.com
# Gitea Issue 模式配置(可选)
# 是否使用 Issue 模式存储审核结果(1=启用,0=禁用,默认启用)
GITEA_USE_ISSUE_MODE=1
# Issue 标签(可选,需要先在 Gitea 中创建标签)
# GITEA_REVIEW_ISSUE_LABELS=ai-review,code-review
```
**Gitea 特殊说明**
- Gitea 支持两种审查结果存储方式:
1. **PR/Comment 模式**:直接在 Pull Request 或 Commit 上添加评论(如果 API 支持)
2. **Issue 模式**:创建或使用现有 Issue 来存储审查结果(推荐,更稳定可靠)
- Issue 模式的优势:
- 可审计、可追踪、可统计
- 支持工单化管理
- 不依赖 Commit Comments API(某些 Gitea 版本可能不支持)
### 配置消息推送
#### 1.配置钉钉推送
- 在钉钉群中添加一个自定义机器人,获取 Webhook URL。
- 更新 .env 中的配置:
```
#钉钉配置
DINGTALK_ENABLED=1 #0不发送钉钉消息,1发送钉钉消息
DINGTALK_WEBHOOK_URL=https://oapi.dingtalk.com/robot/send?access_token=xxx #替换为你的Webhook URL
```
企业微信和飞书推送配置类似,具体参见 [常见问题](docs/FAQ.md)
## 前端 Dashboard 说明
### Web 目录结构
项目的前端 Dashboard 实现位于 `web/` 目录中,采用现代化的前端技术栈:
- **技术栈**:HTML + TailwindCSS + JavaScript (原生 ES6+)
- **文件结构**:
- `web/index.html` - 主页面,包含 Dashboard 的完整 UI 结构
- `web/app.js` - 前端逻辑,包括数据获取、图表渲染、筛选等功能
### 前端服务
Dashboard 由 `ui_server.py` 提供,这是一个基于 Flask 的轻量级服务:
- **默认端口**:5002(可通过 `UI_PORT` 环境变量配置)
- **访问地址**:http://your-server-ip:5002
- **功能特性**:
- 数据表格展示(支持 Merge Request 和 Push 两种类型)
- 统计图表可视化(项目统计、人员统计等)
- 多维度筛选(日期范围、用户名、项目名)
- 实时数据更新
### 新旧前端对比
- **旧实现**(已废弃):`ui.py` - 基于 Streamlit 的实现
- **新实现**(当前使用):`web/` 目录 + `ui_server.py` - 基于 HTML/CSS/JS 的现代化实现
新实现的优势:
- 更轻量级,无需 Streamlit 依赖
- 更快的加载速度
- 更好的用户体验和界面设计
- 更容易自定义和扩展
## 配置说明
### 大模型供应商配置
项目支持多种大模型供应商,通过 `LLM_PROVIDER` 环境变量配置:
**位置**: `src/llm/factory.py`
```python
# 支持的大模型供应商
chat_model_providers = {
'openai': lambda: OpenAIClient(), # OpenAI
'deepseek': lambda: DeepSeekClient(), # DeepSeek
'qwen': lambda: QwenClient(), # 通义千问
}
```
### 各模型API配置
**位置**: `src/llm/client/` 目录下的各客户端文件
每个模型都有对应的API配置环境变量:
| 模型 | API密钥 | API地址 | 模型名称 |
|------|---------|---------|----------|
| **OpenAI** | `OPENAI_API_KEY` | `OPENAI_API_BASE_URL` | `OPENAI_API_MODEL` |
| **DeepSeek** | `DEEPSEEK_API_KEY` | `DEEPSEEK_API_BASE_URL` | `DEEPSEEK_API_MODEL` |
| **通义千问** | `QWEN_API_KEY` | `QWEN_API_BASE_URL` | `QWEN_API_MODEL` |
### 代码审查提示词模板
**位置**: `config/prompt_templates.yml`
这是项目的核心关键词配置,定义了代码审查的标准化提示词:
```yaml
code_review_prompt:
system_prompt: |-
你是一位资深的软件开发工程师,专注于代码的规范性、功能性、安全性和稳定性。
### 代码审查目标:
1. 功能实现的正确性与健壮性(40分):确保代码逻辑正确,能够处理各种边界情况和异常输入
2. 安全性与潜在风险(30分):检查代码是否存在安全漏洞,并评估其潜在风险
3. 是否符合最佳实践(20分):评估代码是否遵循行业最佳实践
4. 性能与资源利用效率(5分):分析代码的性能表现
5. Commits信息的清晰性与准确性(5分):检查提交信息是否清晰、准确
```
### 审查风格配置
**位置**: `src/utils/code_reviewer.py`
通过 `REVIEW_STYLE` 环境变量控制审查风格:
- **`professional`**: 专业严谨风格 - 使用标准的工程术语,保持专业严谨
- **`sarcastic`**: 讽刺性语言风格 - 大胆使用讽刺性语言,但要确保技术指正准确
- **`gentle`**: 温和建议风格 - 多用"建议"、"可以考虑"等温和措辞
- **`humorous`**: 幽默风格 - 在技术点评中加入适当幽默元素和Emoji
### 文件类型过滤配置
**位置**: `src/gitlab/webhook_handler.py`, `src/github/webhook_handler.py`
通过 `SUPPORTED_EXTENSIONS` 环境变量控制哪些文件类型会被审查:
```bash
SUPPORTED_EXTENSIONS=.java,.py,.php,.yml,.vue,.go,.c,.cpp,.h,.js,.css,.md,.sql
```
### Token限制配置
**位置**: `src/utils/code_reviewer.py`
通过 `REVIEW_MAX_TOKENS` 环境变量控制发送给大模型的文本长度:
```python
review_max_tokens = int(os.getenv("REVIEW_MAX_TOKENS", 10000))
```
### 功能开关配置
- **`PUSH_REVIEW_ENABLED`**: 是否启用Push事件审查
- **`MERGE_REVIEW_ONLY_PROTECTED_BRANCHES_ENABLED`**: 是否仅对受保护分支进行审查
### 详细审查模式配置
**位置**: `config/prompt_templates.yml`, `src/utils/code_reviewer.py`
#### 智能语言检测
系统会自动检测代码的主要编程语言,并选择相应的专业审查提示词:
- **Python代码**: 使用 `python_review_prompt`,重点关注PEP 8规范、类型提示、异常处理等
- **JavaScript/TypeScript代码**: 使用 `javascript_review_prompt`,重点关注ES6+特性、类型安全、异步处理等
- **Vue3代码**: 使用 `vue3_review_prompt`,重点关注Composition API、性能优化、TypeScript集成等
- **Java代码**: 使用 `java_review_prompt`,重点关注设计模式、异常处理、线程安全等
- **其他语言**: 使用通用 `code_review_prompt`
#### Vue3专门审查功能
**Vue3检测机制**:
- 自动识别Vue文件(.vue扩展名)
- 检测Vue3特有语法特征(setup()、defineProps、ref()、reactive()等)
- 智能选择Vue3专用审查提示词
**Vue3审查维度**:
1. **Composition API使用**:响应式数据、生命周期钩子、组合函数、响应式解构
2. **模板语法和指令**:v-if vs v-show、v-for优化、事件处理、双向绑定
3. **组件设计**:Props定义、Emits定义、组件通信、组件拆分
4. **性能优化**:响应式优化、计算属性、异步组件、虚拟滚动
5. **TypeScript集成**:类型定义、泛型使用、接口定义
6. **状态管理**:Pinia使用、状态设计、持久化
7. **路由和导航**:路由守卫、路由懒加载、路由参数
8. **错误处理和调试**:错误边界、调试工具、错误日志
9. **样式和UI**:CSS作用域、CSS变量、响应式设计
10. **测试和文档**:单元测试、文档注释、README
#### 详细审查维度
每个审查都会从以下维度进行详细分析:
**代码质量检查**:
- 命名规范:变量、函数、类名是否清晰、有意义、符合语言规范
- 代码结构:函数长度、复杂度、嵌套层级是否合理
- 注释质量:是否有必要的注释,注释是否准确、有用
- 代码重复:是否存在重复代码,是否可以通过重构优化
**安全性检查**:
- 输入验证:是否正确验证和清理用户输入
- SQL注入防护:是否使用参数化查询或ORM
- XSS防护:是否正确转义输出内容
- 权限控制:是否正确检查用户权限
- 敏感信息:是否暴露了敏感信息(密码、密钥等)
**性能优化**:
- 算法效率:是否存在性能瓶颈,时间复杂度是否合理
- 资源管理:是否正确管理内存、数据库连接等资源
- 缓存使用:是否合理使用缓存机制
- 数据库查询:查询是否优化,是否避免N+1问题
**错误处理**:
- 异常处理:是否正确处理异常情况
- 边界条件:是否考虑了各种边界情况
- 错误信息:错误信息是否清晰、有用
- 日志记录:是否记录了必要的日志信息
**可维护性**:
- 模块化:代码是否模块化,职责是否清晰
- 可测试性:代码是否易于测试
- 可扩展性:代码是否易于扩展和修改
- 文档完整性:是否有必要的文档说明
#### 输出格式要求
审查报告会包含以下详细内容:
1. **问题描述和优化建议**: 问题位置、问题描述、影响分析、具体建议、优先级
2. **代码示例**: 修改前代码、修改后代码、修改说明
3. **评分明细**: 具体分数、扣分原因、改进建议
4. **总结**: 主要问题、改进重点、总分
### 专项审查提示词
#### 1. 目录结构审查
**位置**: `src/cmd/functions/directory.py`
审查目录结构的组织逻辑、命名规范性、模块化程度、可维护性等。
#### 2. MySQL数据库审查
**位置**: `src/cmd/functions/mysql.py`
从表结构设计、字段类型、索引设计、表关系建模、性能与容量规划、安全性、可维护性与扩展性等角度进行审查。
#### 3. 分支审查
**位置**: `src/cmd/functions/branch.py`
审查分支命名规范、分支策略合理性、合并策略、分支生命周期等。
### 配置检查机制
**位置**: `src/utils/config_checker.py`
项目包含完整的配置检查机制,确保必要的环境变量都已正确设置。
### 环境变量配置示例
```bash
# 大模型供应商配置
LLM_PROVIDER=deepseek
# DeepSeek配置
DEEPSEEK_API_KEY=your_api_key_here
DEEPSEEK_API_BASE_URL=https://api.deepseek.com
DEEPSEEK_API_MODEL=deepseek-chat
# 审查配置
REVIEW_STYLE=professional
REVIEW_MAX_TOKENS=10000
SUPPORTED_EXTENSIONS=.java,.py,.php,.yml,.vue,.go,.c,.cpp,.h,.js,.css,.md,.sql
# 功能开关
PUSH_REVIEW_ENABLED=1
MERGE_REVIEW_ONLY_PROTECTED_BRANCHES_ENABLED=0
# GitLab配置
GITLAB_ACCESS_TOKEN=your_gitlab_token_here
GITLAB_URL=https://your-gitlab-instance.com
# GitHub配置
GITHUB_ACCESS_TOKEN=your_github_token_here
GITHUB_URL=https://api.github.com
# Gitea配置
GITEA_ACCESS_TOKEN=your_gitea_token_here
GITEA_URL=https://your-gitea-instance.com
GITEA_USE_ISSUE_MODE=1 # 是否使用Issue模式存储审查结果
# 消息推送配置
DINGTALK_ENABLED=1
DINGTALK_WEBHOOK_URL=your_dingtalk_webhook_url
```