From 313e317e99500f97e99f5d9b9c134352d49f1127 Mon Sep 17 00:00:00 2001 From: baozaotumao Date: Sat, 6 Jun 2026 08:46:27 -0700 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=80=82=E9=85=8D=20maxmodel=20?= =?UTF-8?q?=E4=B8=AD=E8=BD=AC=E7=AB=99=E7=9A=84=20AI=20Code=20Review?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ai-review.yml | 100 ++++++++------------------------- 1 file changed, 24 insertions(+), 76 deletions(-) diff --git a/.gitea/workflows/ai-review.yml b/.gitea/workflows/ai-review.yml index d9e03db..01cda5d 100644 --- a/.gitea/workflows/ai-review.yml +++ b/.gitea/workflows/ai-review.yml @@ -1,92 +1,40 @@ -name: "AI Code Review" +name: AI Code Review -# 当有人发起 Pull Request (PR) 或者向 PR 提交新代码时,触发此工作流 +# 触发条件:当向 main 分支发起 PR,或者 PR 有新代码提交时触发 on: pull_request: types: [opened, synchronize] + branches: + - main jobs: - review_with_skill: + code-review: runs-on: ubuntu-latest steps: - # 1. 把你仓库里的代码(包括 .claude 里的规则文件)下载到运行服务器上 - - name: Checkout Code & Skills - uses: actions/checkout@v4 + # 1. 拉取代码 + - name: Checkout Repository + uses: actions/checkout@v3 with: - fetch-depth: 0 + fetch-depth: 0 # 必须设置为 0,获取完整提交历史,以便 AI 对比代码差异 - # 2. 运行 AI 审查脚本 - - name: Run Review Engine + # 2. 运行 AI 代码审查 + - name: Run AI Code Review + uses: anc95/ChatGPT-CodeReview@main env: - # 引入我们在第二步配置的 API Key - API_KEY: ${{ secrets.LLM_API_KEY }} - # Gitea 自动生成的 Token,用于给机器人发评论权限,无需手动配置 - GITEA_TOKEN: ${{ gitea.token }} - # 传递 Gitea 的相关环境变量给 Python 脚本 - GITEA_SERVER_URL: ${{ gitea.server_url }} - GITEA_REPOSITORY: ${{ gitea.repository }} - GITEA_PR_NUMBER: ${{ gitea.event.number }} - GITEA_BASE_REF: ${{ gitea.base_ref }} - GITEA_HEAD_REF: ${{ gitea.head_ref }} - run: | - # 提取当前 PR 的代码变动并保存到 diff.txt - git diff origin/$GITEA_BASE_REF...origin/$GITEA_HEAD_REF > diff.txt + # Gitea 自带的 Token,用于让机器人能自动在你的 PR 下方发评论(系统自带,无需你手动配置) + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # 使用 Python 执行审查 - python3 -c " - import os, json, urllib.request, urllib.error + # 刚刚你在 Gitea "工作流 -> 密钥" 里配置的中转站 API Key + OPENAI_API_KEY: ${{ secrets.LLM_API_KEY }} - # 1. 读取你提交的 Skill 规则书 - skill_base_path = '.claude/skills/code-review-skill/' - try: - skill_config = open(os.path.join(skill_base_path, 'SKILL.md')).read() - python_rules = open(os.path.join(skill_base_path, 'reference/python.md')).read() - except FileNotFoundError as e: - print(f'未找到规则文件: {e}'); exit(1) + # 你的中转站 API 基础地址(务必保留结尾的 /v1) + OPENAI_API_ENDPOINT: "https://api.maxmodel.com/v1" - # 组合成完整的 AI 提示词(System Prompt) - full_skill_prompt = f'{skill_config}\n\n以下是针对当前语言的补充规范:\n{python_rules}' + # 你想使用的模型名称(请填入你中转站支持的模型,比如 gpt-4o 或 deepseek-chat) + MODEL: "gpt-4o" - # 读取代码变动 - diff_data = open('diff.txt').read() - if not diff_data.strip(): - print('没有检测到代码变更,跳过审查。'); exit(0) - - # 2. 呼叫大模型 (这里以 DeepSeek 为例,已修正为官方标准 API 接口) - api_url = 'https://api.deepseek.com/v1/chat/completions' - headers = { - 'Authorization': f'Bearer {os.getenv(\"API_KEY\")}', - 'Content-Type': 'application/json' - } - payload = { - 'model': 'deepseek-chat', # 或者使用 deepseek-coder - 'messages': [ - {'role': 'system', 'content': full_skill_prompt}, - {'role': 'user', 'content': f'请严格对照上述 Skill 规范,评审以下 FastAPI 代码改动,并用中文输出评审意见:\n\n{diff_data}'} - ], - 'temperature': 0.2 - } + # 设置 AI 评论的语言 + LANGUAGE: "Chinese" - req = urllib.request.Request(api_url, data=json.dumps(payload).encode('utf-8'), headers=headers, method='POST') - try: - with urllib.request.urlopen(req) as response: - res = json.loads(response.read().decode('utf-8')) - comment_body = res['choices'][0]['message']['content'] - except Exception as e: - print(f'请求大模型失败: {e}'); exit(1) - - # 3. 将 AI 审查意见发表到 Gitea 的 Pull Request 评论区 - gitea_url = f'{os.getenv(\"GITEA_SERVER_URL\")}/api/v1/repos/{os.getenv(\"GITEA_REPOSITORY\")}/issues/{os.getenv(\"GITEA_PR_NUMBER\")}/comments' - gitea_headers = { - 'Authorization': f'token {os.getenv(\"GITEA_TOKEN\")}', - 'Content-Type': 'application/json' - } - gitea_payload = {'body': f'### 🤖 AI 自动化审查报告 (基于 Code Review Skill)\n\n{comment_body}'} - - gitea_req = urllib.request.Request(gitea_url, data=json.dumps(gitea_payload).encode('utf-8'), headers=gitea_headers, method='POST') - try: - urllib.request.urlopen(gitea_req) - print('Skill 审查报告已成功发表!') - except Exception as e: - print(f'发表评论失败: {e}'); exit(1) - " + # 给 AI 的设定提示词,让它重点关注你关心的漏洞 + SYSTEM_MESSAGE: "你是一个资深的 Python 架构师。请严格检查代码中的安全隐患(如硬编码密钥)、性能问题(如在 async 中使用同步阻塞 I/O)以及代码健壮性缺失,并提供具体的修复建议和代码示例。" \ No newline at end of file