# batchai
**Repository Path**: qiangyt/batchai
## Basic Information
- **Project Name**: batchai
- **Description**: 对Copilot和Cursor们的补充:用 AI 批量处理项目代码
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2024-10-12
- **Last Updated**: 2025-01-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# batchai - 对Copilot和Cursor们的补充:用 AI 批量处理项目代码
[English](./README.md)
我已经依赖 ChatGPT 和 GitHub Copilot了,但老是得在Copilot的聊天窗口和打开的代码文件之间复制粘贴还是有点让人厌烦了。我也尝试了 Cursor,虽然解决了第一个问题,但还是要一个个打开文件将它们添加到 AI 的上下文中。
于是就有了`batchai`这么个工具。出发点很简单: 无需再复制粘贴,因为它会遍历指定的目录和文件,而且只在 Git 仓库目录中运行,所以程序员自己需要核对所有 `batchai`做出的更改(因为 AI 也常常犯错)。
目前,`batchai`已经支持批量代码检查(可以看作是本地的 AI 驱动 的SonarQube)和批量生成单元测试代码。打算用在自己的几个个人项目上(包括这个`batchai`),因为一直以来它们就没什么单元测试。其它计划的功能包括代码解释和注释生成、重构等 —— 所有这些都将被批量处理。还有就是,尝试让`batchai`能对项目代码有整体的视角,譬如建立跨文件的代码符号索引,这应该有助于AI工作得更好。
下面是过去几周里我在自己的一些项目测试使用`batchai`后的一些有趣的发现:
- AI常常能发现那些传统工具(譬如SonarQube)会遗漏的问题。
- AI不会一次性报告所有问题,因此我需要多次运行它。
- 由于 LLM 训练数据的过时和幻觉问题,程序员自己核对更改的准确性必不可少- 这就是为什么我让`batchai`只在干净的 Git 仓库目录中工作。
我找了[spring-petclinic(克隆自https://github.com/spring-projects/spring-petclinic)](https://github.com/qiangyt/spring-petclinic)这个Java项目来演示。
下面是一些代码检查结果的例子:
- [添加检查确保生日的值不在未来时间](https://github.com/qiangyt/spring-petclinic/commit/6f42f16a249b3fffa8b95ac625c824210bbb2712#diff-7ba90c8df45063ea6569e3ea29850f6dbd777bc14f76b1115f556ade61441207)
- [重命名方法以遵循 JavaBeans 命名约定](https://github.com/qiangyt/spring-petclinic/commit/6f42f16a249b3fffa8b95ac625c824210bbb2712#diff-4788251011337c19f735f2061cf599b8dbc0394a92ba86447b0db9b386f869cd)
以及一个错误的例子:
- [将 MySQL 版本从 9.0 降级回 8.0(看来gpt4o-mini所知道的 MySQL 最新版本是 8.0)](https://github.com/qiangyt/spring-petclinic/commit/6f42f16a249b3fffa8b95ac625c824210bbb2712#diff-7bc3b8001f97e9913dec25d48040a4a71b2ff4fcf915b49325602b4facad5979)
更多细节:
- [代码检查报告](https://github.com/qiangyt/spring-petclinic/commit/5f2770f2fc0ce4e5d59e2ae348ce0b14c8767e75)
- [依据检查报告生成的修复](https://github.com/qiangyt/spring-petclinic/commit/6f42f16a249b3fffa8b95ac625c824210bbb2712)
## 功能
- [x] 批量检查代码 : 在控制台输出检查报告并保存下来,然后直接修复代码。
- [x] 批量生成单元测试代码。
- [x] 自定义提示词。
- [x] 文件忽略 : 指定忽略的文件,支持`.gitignore`和额外的`.batchai_ignore`文件。
- [x] 指定额外的目标路径: 允许指定 Git 仓库中的部分目录和文件。
- [x] 使用 Go 实现: 生成一个可在 Mac OSX、Linux 和 Windows 上运行的单一可执行文件。
- [x] diff显示 : 在控制台中显示彩色差异。
- [x] LLM 支持 : 支持与 OpenAI 兼容的 LLM,包括 Ollama。
- [x] I18N : 支持国际化注释/解释生成。
## 计划的功能
- 解释、注释生成、测试生成、重构。
- 拒绝更改跟踪 : 跟踪被拒绝的更改以避免重复修改。
- 语言特定提示词 : 针对不同编程语言的不同提示词。
- LLM 使用指标 : 实现 LLM 使用跟踪的指标。
## 开始使用
1. 从[这里](https://github.com/qiangyt/batchai/releases/latest)下载最新的可执行二进制文件并将其添加到您的 $PATH 中。对于 Linux 和 Mac OSX,请记得运行`chmod +x ...`使下载的二进制文件可执行。
2. 克隆演示项目。以下步骤假设克隆的项目目录为 `/data/spring-petclinic`
```shell
cd /data
git clone https://github.com/spring-projects/spring-petclinic
cd spring-petclinic
```
在此目录中,创建一个.env文件。在.env文件中设置OPENAI_API_KEY。以下是一个示例:
```shell
# OpenAI
OPENAI_API_KEY=change-it
#OPENAI_PROXY_URL= 对于国内用户,需要在这里设置代理的URL和用户名密码等等
#OPENAI_PROXY_USER=
#OPENAI_PROXY_PASS=
#BATCHAI_CHECK_MODEL=openai/gpt-4o-mini
# Ali TONGYI qwen
#QWEN_API_KEY=change-it
#BATCHAI_CHECK_MODEL=tongyi/qwen2.5-coder-7b-instruct
# local Ollama
#OLLAMA_BASE_URL=http://localhost:11434/v1/
#BATCHAI_CHECK_MODEL=ollama/qwen2.5-coder:7b-instruct-fp16
```
对于 Ollama,您可以参考我的示例[docker-compose.yml](./docker-compose.yml)
3. CLI 示例:
- 将审核问题报告输出到控制台(也会保存到 `build/batchai`):
```shell
cd /data/spring-petclinic
batchai check . src/main/java/org/springframework/samples/petclinic/vet/Vets.java
```
- 通过`--fix`选项直接修复目标文件:
```shell
cd /data/spring-petclinic
batchai check --fix . src/main/java/org/springframework/samples/petclinic/vet/Vets.java
```
- 仅对 src/main/java 运行 `batchai`:
```shell
cd /data/spring-petclinic
batchai check . src/main/java/
```
- 在整个项目中运行`batchai`:
```shell
cd /data/spring-petclinic
batchai check .
```
## CLI 使用
- 查看全局帮助菜单和可用命令,请运行:
```shell
batchai -h
```
```shell
NAME:
batchai - 用 AI 批量处理项目代码
USAGE:
batchai [global options] command [command options] [target files/directories in the repository]
VERSION:
0.1.2 (5eeb081)
COMMANDS:
check 将问题报告到控制台,也保存到 'build/batchai'
list 列出要处理的文件
explain (TODO) 解释代码,输出结果到控制台或作为注释
comment (TODO) 对代码进行注释
refactor (TODO) 重构代码
help, h 显示命令列表或某个命令的帮助
GLOBAL OPTIONS:
--enable-symbol-reference 启用符号收集以检查整个项目中的代码引用(默认:false)
--force 忽略缓存(默认:false)
--lang value, -l value 生成文本的语言(默认:en_US.UTF-8)[$LANG]
--help, -h print the version
--version, -v 打印版本
```
- 要查看`check`命令的详细帮助,请运行:
```shell
batchai check -h
```
```shell
NAME:
batchai check - 将问题报告到控制台,也保存到 'build/batchai'
USAGE:
batchai check [command options]
OPTIONS:
--fix, -f 替换目标文件(默认:false)
--help, -h show help
```
## 支持的 LLMs
已测试和支持的模型:
- OpenAI 系列:
- `openai/gpt-4o`
- `openai/gpt-4o-mini`
其他OpenAI模型也应该可以正常工作。
- 阿里通义千问系列:
- `qwen2.5-coder-7b-instruct` (也可通过 Ollama 使用)
其他通义千问模型也应该可以正常工作。
要添加更多 LLM,只需按照[res/static/batchai.yaml](res/static/batchai.yaml)中的配置进行操作,只要该 LLM 提供与 OpenAI 兼容的 API 即可。
## 配置
- 可选配置文件:
可以创建1个`${HOME}/batchai/batchai.yaml`。完整示例请参考[res/static/batchai.yaml](res/static/batchai.yaml)
- 环境文件:
你也可以通过目标 Git 仓库目录中的 `.env` 文件来配置 `batchai`。有关所有可用环境变量的参考,请查看 [res/static/batchai.yaml](res/static/batchai.yaml) 和它们的默认值[res/static/batchai.env](res/static/batchai.env)
- 忽略特定文件
`batchai`依据`.gitignore`文件里的规则忽略指定的目录和文件。通常这已经足够,但如果还有额外的不能被git忽略但不必由`batchai`处理的,可以使用`.batchai_ignore`指定,规则写法和`.gitignore`相同。
- 自定义提示词
请查看 [res/static/batchai.yaml]里的`BATCHAI_CHECK_RULE_*`和`MY_CHECK_RULE_*`
## 许可证
MIT
## NA
[](https://github.com/qiangyt/batchai/releases/latest)
[](https://somsubhra.github.io/github-release-stats/?username=qiangyt&repository=batchai)