# ai-code-review **Repository Path**: leekiaxnn/ai-code-review ## Basic Information - **Project Name**: ai-code-review - **Description**: 基于AI的Gitee代码审查工具 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-16 - **Last Updated**: 2026-09-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AI 代码审查工具 一个面向 Gitee 仓库的 AI 代码审查工具。既支持 **CLI 手动触发**单次审查,也提供一个 **本机持久化看护服务(daemon)**:通过定时轮询 Gitee API 自动发现 PR、调用 AI 进行代码检视、发布评论,并将结果落库以便历史追溯。 ## 功能特性 - ✅ Gitee PR 代码拉取与评论发布 - ✅ 集成 AI 代码审查(OpenAI 兼容 / Anthropic 兼容 Chat Completions API) - ✅ 基于文件路径的 Skill 路由:不同模块(attention、moe、quantization、platform 等)使用专属审查规则 - ✅ `.md` Skill 自动发现:在 `src/skills/` 下放置带 `match_patterns` frontmatter 的 `.md` 文件即自动注册为审查模块 - ✅ 持久化看护服务:定时轮询、去重、并发审查、结果落库(SQLite) - ✅ 可选只读 HTTP 端点:查询健康状态与历史任务 ## 两种运行模式 | 模式 | 入口 | 说明 | |------|------|------| | CLI 单次审查 | `python -m src.cli` | 手动指定 PR / 本地文件 / 目录,审查一次后退出 | | 看护服务 daemon | `python -m src.daemon` | 常驻进程,轮询目标仓库的开放 PR,自动触发审查并落库 | ## 快速开始 ### 安装依赖 ```bash pip install -r requirements.txt ``` ### 配置环境变量 复制 `.env.example` 为 `.env` 并填写配置: ```bash cp .env.example .env ``` 至少需要填入 Gitee 访问令牌(`GITEE_ACCESS_TOKEN`);如需 AI 审查还需配置 `ANTHROPIC_AUTH_TOKEN` 等。详见下文「配置说明」。 ### CLI 用法 ```bash # 审查 PR(会发布评论) python -m src.cli --pr-url https://gitee.com/owner/repo/pulls/123 # 测试模式(只审查,不发布评论) python -m src.cli --pr-url https://gitee.com/owner/repo/pulls/123 --test # 审查本地文件 / 目录 python -m src.cli --file path/to/file.py python -m src.cli --dir path/to/directory/ --pattern "**/*.py" # 查看配置 / 测试连接 python -m src.cli --show-config python -m src.cli --test-connection ``` ### 看护服务用法 ```bash # 前台运行(按 .env 中的 TARGET_REPO / POLL_INTERVAL_SEC 轮询) python -m src.daemon # 干跑模式:照常审查并落库,但不向 Gitee 发布评论 python -m src.daemon --test # 覆盖轮询间隔(秒) python -m src.daemon --interval 300 ``` 启动后服务会立即执行一次轮询,之后每隔 `POLL_INTERVAL_SEC` 轮询一次。`Ctrl+C` 触发优雅退出(未完成的 PR 会在下次启动时重跑)。 > 说明:daemon 的 `--test` 模式使用独立的数据库文件(`review_test.db`),并在每次启动时清空,以保证测试可重复。 ## 项目结构 ``` ai-code-review/ ├── src/ │ ├── cli.py # CLI 入口(单次审查) │ ├── daemon.py # 看护服务主进程(轮询循环、信号处理、可选 HTTP) │ ├── poller.py # PR 轮询器:拉取开放 PR → 去重判断 → 入队 │ ├── review_worker.py # 线程池 Worker:消费队列、调用审查引擎、写库 │ ├── config.py # 配置管理(.env + skills + 默认值,单例) │ ├── models.py # dataclass 数据模型(Issue / PrCheckpoint / DaemonReviewTask 等) │ ├── gitee_client.py # Gitee API 客户端(PR、diff、评论) │ ├── review_engine.py # PR 审查引擎 │ ├── local_review_engine.py # 本地文件 / 目录审查引擎 │ ├── ai_reviewer.py # AI 审查器(AIClient / PromptBuilder / ResponseParser) │ ├── skill_router.py # Skill 路由:按文件路径匹配审查规则 │ ├── codeowners.py # 路径负责人匹配 │ ├── db/ │ │ ├── database.py # SQLite 连接管理 + 建表(WAL,线程局部连接) │ │ └── dao.py # DAO:PrCheckpoint / ReviewTask / ReviewIssue │ ├── skills/ # Skill 规则 │ │ ├── rules.yaml # 纯数据配置(严重程度、输出格式) │ │ ├── _common.md # 通用审查 Skill(type: common) │ │ └── *.md # 各模块 Skill(带 match_patterns frontmatter) │ └── utils/ # 日志等工具 ├── data/ # SQLite 数据库(运行时生成,gitignored) ├── docs/ │ └── webhook-service-design.md # 看护服务设计文档 ├── tests/ ├── requirements.txt └── README.md ``` ## 配置说明 所有配置通过 `.env` 提供,由 `src/config.py` 读取。完整项见 `.env.example`。 ### Gitee 访问令牌 1. 登录 Gitee →「设置」→「安全设置」→「私人令牌」 2. 创建令牌,勾选 `projects`(仓库)、`pull_requests`(PR)、`note`(评论)权限 3. 填入 `.env` 的 `GITEE_ACCESS_TOKEN` ### AI 模型(OpenAI/Anthropic 兼容 Chat Completions) - `ANTHROPIC_AUTH_TOKEN`:API 密钥 - `ANTHROPIC_BASE_URL`:API 基址(默认 `http://api.code-agent.rnd.huawei.com`,请求会拼接 `/v1/chat/completions`) - `ANTHROPIC_MODEL`:模型名(默认 `GLM`) - `AI_REVIEW_ENABLED`:是否启用 AI 审查(默认 `true`) ### 看护服务 - `TARGET_REPO`:监控的仓库,`owner/repo` 形式(默认 `omniai/omni-npu`) - `POLL_INTERVAL_SEC`:轮询间隔秒数(默认 120,下限 60) - `MIN_REVIEW_INTERVAL_SEC`:同一 PR 两次检视的最小间隔(默认 600),用于抑制频繁 push 触发的重复审查 - `MAX_CONCURRENT_REVIEWS`:Worker 线程池大小,即最大并发审查数(默认 10) - `DB_PATH`:SQLite 数据库路径(默认 `./data/review.db`) - `HTTP_ENABLED` / `HTTP_HOST` / `HTTP_PORT`:可选只读 HTTP 端点 ### Skills 配置 - 审查规则以 `.md` 文件形式放在 `src/skills/` 下,文件 frontmatter 中的 `match_patterns` 决定其匹配哪些文件路径;`.md` 正文会作为知识库注入到该模块的 system prompt。 - `_common.md`(`type: common`)定义通用审查 Skill,对所有文件生效。 - `src/skills/rules.yaml` 仅保留纯数据配置(严重程度定义、输出格式)。 - 路由优先级:匹配到的模块按 `priority` 降序选取最高的一个,与 `_common.md` 的提示词合并。 ## HTTP 端点(可选) 设置 `HTTP_ENABLED=true` 后,daemon 会暴露只读接口: - `GET /health` —— 健康状态(uptime、轮询次数、活跃任务、队列长度) - `GET /api/tasks` —— 最近的审查任务列表 - `GET /api/tasks/{id}` —— 单个任务详情及其问题列表 ## 数据持久化 看护服务使用 SQLite(WAL 模式),三张表: - `pr_checkpoint` —— 每个 PR 的最新快照(`head_sha`、`last_review_at`),用于轮询去重 - `review_task` —— 每次审查任务的状态与统计(pending / running / success / failed) - `review_issue` —— 每次审查发现的具体问题 ## 工作流程(看护服务) ``` daemon 主循环 └─ 每隔 POLL_INTERVAL_SEC 调用 Poller.poll() ├─ GiteeClient.list_open_prs() 拉取开放 PR ├─ 对比 pr_checkpoint:新 PR(open) / head_sha 变化(update) → 入队,其余跳过 │ (update 还要满足距上次检视 ≥ MIN_REVIEW_INTERVAL_SEC) └─ 写入 review_task(pending) + 更新 checkpoint └─ ReviewWorker(线程池)消费队列 ├─ ReviewEngine.review_pr() 调用 AI 审查并发布评论 ├─ 写入 review_issue,更新 review_task 状态/统计 └─ 更新 checkpoint.last_review_at ``` ## 许可证 MIT License