桌面应用形式的 AI 代码审查工具,BYOK(Bring Your Own Key)模式。在应用内填写自己的大模型 API Key → 选一个文件夹 → 配置排除规则 → 一键扫描,后端并发审查,前端实时显示按文件分组的评论。API Key 存储在系统 keychain 中,不写入任何文件。
- 多 Provider 支持 — Anthropic / OpenAI / DeepSeek / 阿里云百炼 / Moonshot / 火山方舟 / MiniMax / Gemini / OpenRouter / Ollama(本地)
- BYOK 模式 — 在应用 UI 中填写 API Key,自动存入系统 keychain(Windows Credential Manager / macOS Keychain),不写文件、不依赖环境变量
- 并发扫描 — ThreadPoolExecutor 并发审查,前端实时推送进度
- 四维审查 — 通用代码质量 / 安全漏洞 / Bug 逻辑错误 / 项目专属规则
- 排除规则 — 支持 gitignore 格式的排除文件,可自定义
- 自定义规则 — 指定项目专属规则文件,针对性审查
- 多语言 UI — 中文 / English 切换
| 层 | 技术 |
|---|---|
| 后端 | Python 3.13+ · langchain-litellm · langgraph · Pydantic · pathspec |
| 前端 | Vue 3 · TypeScript · Element Plus · Pinia · vue-i18n · Vite |
| 桌面壳 | PyWebView 6+ |
code-review-agent/
├── backend/ Python 后端
│ └── src/reviewer/
│ ├── core/ 核心模块 (llm / engine / scanner / schemas / prompts / providers)
│ ├── rules/ 默认审查规则
│ ├── api.py PyWebView API 桥接层
│ ├── app.py PyWebView 应用入口
│ └── cli.py 命令行入口
├── frontend/ Vue 3 SPA
│ └── src/
│ ├── components/ UI 组件 (8 个)
│ ├── composables/ 组合式函数 (usePyApi / useEventBus)
│ ├── store/ Pinia 状态管理
│ ├── types/ TypeScript 类型定义 (镜像后端 schema)
│ └── locales/ i18n 翻译文件
├── tests/ 测试 fixtures
└── CLAUDE.md Claude 协作指南
cd backend && uv sync
cd ../frontend && npm install需要两个终端:
# 终端 A: 启动 Vite dev server
cd frontend && npm run dev
# 终端 B: 启动 PyWebView 桌面窗口 (加载 dev server 的 URL)
cd backend && uv run reviewer-app --dev应用启动后(无需设置任何环境变量):
- 在 UI 里选 Provider、填模型名和 API Key
- API Key 会自动存到系统 keychain,下次启动自动读出
- 选项目根目录,点 "开始扫描"
生产模式(不需要 HMR):
cd frontend && npm run build # 产出 dist/
cd backend && uv run reviewer-app # 不加 --dev,加载 dist/index.htmlCLI 模式不经过桌面 UI,API Key 需要通过命令行参数或环境变量传入:
cd backend
# 方式一: 环境变量
export ANTHROPIC_API_KEY=sk-ant-... # Linux / Mac / Git Bash
$env:ANTHROPIC_API_KEY="sk-ant-..." # PowerShell
uv run reviewer scan ../frontend/src --model anthropic/claude-sonnet-4-6
# 方式二: 命令行传入
uv run reviewer scan ../frontend/src \
--model anthropic/claude-sonnet-4-6 \
--api-key sk-ant-...# 安装 PyInstaller (如果还没装)
cd backend && uv pip install pyinstaller
# 一键构建 (前端 build + PyInstaller 打包)
cd .. && python build.py
# 产物在 dist/CodeReviewAgent/CodeReviewAgent.exe也可以分步执行:
python build.py --skip-frontend # 只跑 PyInstaller,跳过前端构建
python build.py --onefile # 打成单文件 exe(启动较慢)桌面应用模式下在 UI 中选择 Provider 并填写 API Key 即可,无需设置环境变量。
CLI 模式下 API Key 通过 --api-key 参数或环境变量传入,对应的环境变量名见下表:
| Provider | 模型字符串 | CLI 环境变量 |
|---|---|---|
| Anthropic | anthropic/claude-sonnet-4-6 |
ANTHROPIC_API_KEY |
| OpenAI | openai/gpt-5.5 / openai/gpt-5.5-pro |
OPENAI_API_KEY |
| DeepSeek | deepseek/deepseek-v4-flash / deepseek/deepseek-v4-pro |
DEEPSEEK_API_KEY |
| 阿里云百炼 / Qwen | dashscope/qwen3.7-max / dashscope/qwen3-coder-next |
DASHSCOPE_API_KEY |
| Moonshot / Kimi | moonshot/kimi-k2.6 |
MOONSHOT_API_KEY |
| 火山方舟 / Doubao | volcengine/doubao-seed-2-0-pro-260215 |
VOLCENGINE_API_KEY |
| MiniMax | minimax/MiniMax-M2.7 |
MINIMAX_API_KEY |
| Gemini | gemini/gemini-3-pro |
GEMINI_API_KEY |
| OpenRouter | openrouter/openai/gpt-5.5 |
OPENROUTER_API_KEY |
| Ollama | ollama/qwen3-coder-next |
无 (本地) |
PyWebView Host (Python 主进程)
├── Main Thread: GUI loop (不能阻塞)
└── Worker Thread (start_scan 启动):
scanner.iter_code_files (os.walk + gitignore 排除 + 扩展名白名单)
↓
engine.scan_project (ThreadPoolExecutor 并发)
↓ 每文件调 LLM
get_llm + invoke + PydanticOutputParser
↓ on_file_done 回调
Api._emit (evaluate_js → CustomEvent('py:scan:*'))
↓
Vue 3 SPA (Vite dev / pywebview 内置 HTTP)
├── window.pywebview.api.* 调 Python
└── useEventBus 监听 py:scan:* 事件 → 更新 scanStore (Pinia)
↓
组件树: FolderPicker / ModelConfig / ExcludePatternsEditor / ScanProgress / CommentList / ...
见 CLAUDE.md 中的 Roadmap 表格。
私有项目,暂未确定。