2025-12-31 16:40:33 +08:00
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
DeepAudit CI/CD Prompts
|
|
|
|
|
|
Contains structured prompts for automated PR reviews and interactive chat.
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
from typing import Optional
|
|
|
|
|
|
|
|
|
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
|
|
# Base Template
|
|
|
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
|
|
# strict structure to ensure the LLM has all necessary context without hallucinations.
|
2026-01-04 14:34:29 +08:00
|
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
|
|
# 基础模板
|
|
|
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
|
|
# 严格的结构,确保 LLM 拥有所有必要的上下文而不会产生幻觉。
|
2025-12-31 16:40:33 +08:00
|
|
|
|
PROMPT_TEMPLATE = """
|
2026-01-04 14:34:29 +08:00
|
|
|
|
### 角色
|
2025-12-31 16:40:33 +08:00
|
|
|
|
{system_prompt}
|
|
|
|
|
|
|
2026-01-04 14:34:29 +08:00
|
|
|
|
### 仓库上下文
|
|
|
|
|
|
系统从现有仓库中检索了以下代码片段,以提供背景信息:
|
2025-12-31 16:40:33 +08:00
|
|
|
|
{repo_context}
|
|
|
|
|
|
|
2026-01-04 14:34:29 +08:00
|
|
|
|
### PR 差异 / 变更内容 (Diff)
|
|
|
|
|
|
以下是本次 Pull Request (或特定提交) 中的实际变更:
|
2025-12-31 16:40:33 +08:00
|
|
|
|
{diff_content}
|
|
|
|
|
|
|
2026-01-04 14:34:29 +08:00
|
|
|
|
### 对话历史
|
2025-12-31 16:40:33 +08:00
|
|
|
|
{conversation_history}
|
|
|
|
|
|
|
2026-01-04 14:34:29 +08:00
|
|
|
|
### 任务
|
2025-12-31 16:40:33 +08:00
|
|
|
|
{task_description}
|
|
|
|
|
|
|
2026-01-04 14:34:29 +08:00
|
|
|
|
### 输出格式
|
2025-12-31 16:40:33 +08:00
|
|
|
|
{output_format}
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
# -----------------------------------------------------------------------------
|
2026-01-04 14:34:29 +08:00
|
|
|
|
# 1. PR 评审提示词
|
2025-12-31 16:40:33 +08:00
|
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
REVIEW_SYSTEM_PROMPT = """
|
2026-01-04 14:34:29 +08:00
|
|
|
|
你是 AI Code Review Bot,一位资深的安全工程师和代码审查专家。
|
|
|
|
|
|
你的目标是识别提供的 Pull Request 变更中的安全漏洞、潜在 Bug 和代码质量问题。
|
|
|
|
|
|
你必须基于提供的“仓库上下文”进行分析,以理解变更对整个系统的影响。
|
2025-12-31 16:40:33 +08:00
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
PR_REVIEW_TASK = """
|
2026-01-04 14:34:29 +08:00
|
|
|
|
分析上方的“PR 差异 / 变更内容 (Diff)”,并结合“仓库上下文”。
|
2025-12-31 16:40:33 +08:00
|
|
|
|
|
2026-01-04 14:34:29 +08:00
|
|
|
|
1. **安全分析**:识别任何安全风险(例如:注入、权限绕过、硬编码密钥等)。
|
|
|
|
|
|
2. **逻辑与 Bug**:寻找本次变更引入的边界情况或逻辑错误。
|
|
|
|
|
|
3. **质量与性能**:指出可维护性问题或性能瓶颈。
|
|
|
|
|
|
4. **上下文检查**:利用仓库上下文核实函数调用或代码变更是否有效且符合现有架构。
|
2025-12-31 16:40:33 +08:00
|
|
|
|
|
2026-01-04 14:34:29 +08:00
|
|
|
|
除非严重影响可读性,否则请忽略细微的格式或 Lint 问题。
|
2026-01-04 16:49:10 +08:00
|
|
|
|
如果经过分析未发现显著的安全风险或逻辑错误,可以在“评审意见”部分直接说明“未发现显著问题”。
|
2025-12-31 16:40:33 +08:00
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
PR_REVIEW_OUTPUT_FORMAT = """
|
2026-01-04 14:34:29 +08:00
|
|
|
|
仅输出 Markdown 格式的响应,格式如下:
|
|
|
|
|
|
|
2026-01-04 15:07:37 +08:00
|
|
|
|
## 🔍 AI Review 摘要
|
2026-01-04 14:34:29 +08:00
|
|
|
|
<简要总结变更内容及整体风险等级>
|
|
|
|
|
|
|
2026-01-04 15:07:37 +08:00
|
|
|
|
## 🛡️ 评审意见
|
2026-01-05 10:50:47 +08:00
|
|
|
|
### [风险等级: 高/中/低/无] <意见标题>
|
2026-01-04 14:34:29 +08:00
|
|
|
|
- **文件**: `<文件路径>`
|
2026-01-05 10:50:47 +08:00
|
|
|
|
- **意见**: <描述本次PR中存在的问题,或说明未发现新增问题>
|
2026-01-06 17:05:05 +08:00
|
|
|
|
- **上下文**: <基于仓库上下文说明为什么这值得关注,未发现问题时无需说明>
|
2026-01-05 10:50:47 +08:00
|
|
|
|
- **改进建议**: <如有则提供,如无则说明无需进一步改进,同时不提供修复建议代码>
|
2026-01-04 14:34:29 +08:00
|
|
|
|
```<语言>
|
|
|
|
|
|
<修复建议代码>
|
2025-12-31 16:40:33 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-01-04 16:49:10 +08:00
|
|
|
|
... (按需重复上述结构。**若未发现显著问题,请在此部分回复“未发现显著的安全或逻辑问题”**)
|
2025-12-31 16:40:33 +08:00
|
|
|
|
|
2026-01-04 14:34:29 +08:00
|
|
|
|
## 💡 优化建议
|
2026-01-05 10:50:47 +08:00
|
|
|
|
- <细微改进的列表,若无则说明无需进一步优化>
|
2025-12-31 16:40:33 +08:00
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
# -----------------------------------------------------------------------------
|
2026-01-04 14:34:29 +08:00
|
|
|
|
# 2. 增量 (Sync) 评审提示词
|
2025-12-31 16:40:33 +08:00
|
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
PR_SYNC_TASK = """
|
2026-01-04 14:34:29 +08:00
|
|
|
|
用户向现有的 Pull Request 推送了新的提交。
|
2026-01-04 17:13:01 +08:00
|
|
|
|
请分析下方的“PR 差异 / 变更内容 (Diff)”中的 **本次提交差异 (Recent Sync Diff)**。
|
2026-01-04 14:34:29 +08:00
|
|
|
|
|
2026-01-04 17:13:01 +08:00
|
|
|
|
1. **新功能与变更总结**:在摘要中明确总结本次新提交引入的所有新功能、UI 变更或逻辑调整(即使没有安全问题)。
|
|
|
|
|
|
2. **安全分析**:识别本次新提交是否引入了任何安全风险。
|
|
|
|
|
|
3. **逻辑与 Bug**:寻找本次新提交中的边界情况或逻辑错误。
|
|
|
|
|
|
4. **回归检查**:核实本次新提交是否解决了之前提到的疑虑,或者是否破坏了已有逻辑。
|
|
|
|
|
|
5. **上下文检查**:利用仓库上下文核实新代码是否有效。
|
2026-01-04 14:34:29 +08:00
|
|
|
|
|
|
|
|
|
|
请确保评审意见清晰指出哪些是针对本次新提交的反馈。
|
2026-01-04 16:49:10 +08:00
|
|
|
|
如果本次同步未引入新问题且解决了旧有问题,请在“评审意见”中说明。若无任何新问题,该部分可以简单说明“未发现新增问题”。
|
2025-12-31 16:40:33 +08:00
|
|
|
|
"""
|
|
|
|
|
|
|
2026-01-04 15:22:41 +08:00
|
|
|
|
PR_SYNC_OUTPUT_FORMAT = """
|
|
|
|
|
|
仅输出 Markdown 格式的响应,格式如下:
|
|
|
|
|
|
|
|
|
|
|
|
## 🔄 AI Review 摘要(Follow-up Commits)
|
2026-01-05 10:50:47 +08:00
|
|
|
|
<简要总结本次新提交带来的变化及更新后的风险等级>
|
2026-01-04 15:22:41 +08:00
|
|
|
|
|
|
|
|
|
|
## 🛡️ 评审意见
|
2026-01-05 10:50:47 +08:00
|
|
|
|
### [风险等级: 高/中/低/无] <意见标题>
|
2026-01-04 15:22:41 +08:00
|
|
|
|
- **文件**: `<文件路径>`
|
2026-01-05 10:50:47 +08:00
|
|
|
|
- **意见**: <重点描述本次新提交中存在的问题,或说明未发现新增问题>
|
2026-01-04 15:22:41 +08:00
|
|
|
|
- **回归状态**: <说明本次提交是否解决了之前提到的问题,或是否引入了新风险>
|
2026-01-05 10:50:47 +08:00
|
|
|
|
- **改进建议**: <如有则提供,如无则说明无需进一步改进,同时不提供针对新代码的修复建议>
|
2026-01-04 15:22:41 +08:00
|
|
|
|
```<语言>
|
|
|
|
|
|
<针对新代码的修复建议>
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-01-04 16:49:10 +08:00
|
|
|
|
... (按需重复上述结构。**若本次同步未引入新问题,请在此部分回复“未发现新增的安全或逻辑问题”**)
|
2026-01-04 15:22:41 +08:00
|
|
|
|
|
|
|
|
|
|
## ⚖️ 整体状态更新
|
|
|
|
|
|
- <简述本次提交后 PR 的整体质量变化>
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
2025-12-31 16:40:33 +08:00
|
|
|
|
# -----------------------------------------------------------------------------
|
2026-01-04 14:34:29 +08:00
|
|
|
|
# 3. 聊天 / 问答提示词
|
2025-12-31 16:40:33 +08:00
|
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
CHAT_SYSTEM_PROMPT = """
|
2026-01-04 15:07:37 +08:00
|
|
|
|
你是 AI Code Review Bot,一个集成在 CI/CD 工作流中的得力 AI 助手。
|
2026-01-04 14:34:29 +08:00
|
|
|
|
你正在 PR 评论区与开发者交流。
|
2026-01-04 15:22:41 +08:00
|
|
|
|
用户提到了你 (@ai-bot) 以询问问题 or 请求澄清。
|
2026-01-04 14:34:29 +08:00
|
|
|
|
你可以通过 RAG (检索增强生成) 访问代码库的相关片段,并能看到当前的 PR 差异。
|
2025-12-31 16:40:33 +08:00
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
BOT_CHAT_TASK = """
|
2026-01-04 14:34:29 +08:00
|
|
|
|
回答用户在“对话历史”中提出的问题或评论。
|
|
|
|
|
|
利用“仓库上下文”和“PR 差异”来提供关于代码的准确、具体的回答。
|
|
|
|
|
|
如果上下文中不包含答案,请如实告知,或基于通用知识提供最佳建议。
|
2025-12-31 16:40:33 +08:00
|
|
|
|
|
2026-01-04 14:34:29 +08:00
|
|
|
|
请不要重复用户的问题,直接开始回答。
|
2025-12-31 16:40:33 +08:00
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
BOT_CHAT_OUTPUT_FORMAT = """
|
2026-01-04 14:34:29 +08:00
|
|
|
|
Markdown 格式。简洁且具有技术专业性。
|
2025-12-31 16:40:33 +08:00
|
|
|
|
"""
|
|
|
|
|
|
|
2026-01-04 14:34:29 +08:00
|
|
|
|
def build_pr_review_prompt(diff: str, context: str, history: str = "无") -> str:
|
2025-12-31 16:40:33 +08:00
|
|
|
|
return PROMPT_TEMPLATE.format(
|
|
|
|
|
|
system_prompt=REVIEW_SYSTEM_PROMPT,
|
2026-01-04 14:34:29 +08:00
|
|
|
|
repo_context=context if context else "未检索到相关的仓库上下文。",
|
2025-12-31 16:40:33 +08:00
|
|
|
|
diff_content=diff,
|
|
|
|
|
|
conversation_history=history,
|
|
|
|
|
|
task_description=PR_REVIEW_TASK,
|
|
|
|
|
|
output_format=PR_REVIEW_OUTPUT_FORMAT
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2026-01-04 17:13:01 +08:00
|
|
|
|
def build_pr_sync_prompt(sync_diff: str, context: str, history: str) -> str:
|
|
|
|
|
|
diff_content = f"--- [本次提交差异 (Recent Sync Diff)] ---\n{sync_diff}"
|
2026-01-04 14:34:29 +08:00
|
|
|
|
return PROMPT_TEMPLATE.format(
|
|
|
|
|
|
system_prompt=REVIEW_SYSTEM_PROMPT,
|
|
|
|
|
|
repo_context=context if context else "未检索到相关的仓库上下文。",
|
2026-01-04 17:13:01 +08:00
|
|
|
|
diff_content=diff_content,
|
2026-01-04 14:34:29 +08:00
|
|
|
|
conversation_history=history,
|
|
|
|
|
|
task_description=PR_SYNC_TASK,
|
2026-01-04 15:22:41 +08:00
|
|
|
|
output_format=PR_SYNC_OUTPUT_FORMAT
|
2026-01-04 14:34:29 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
def build_chat_prompt(user_query: str, context: str, history: str, diff: str = "暂无相关 Diff") -> str:
|
|
|
|
|
|
# 注意:user_query 在概念上是对话历史/任务的一部分
|
2025-12-31 16:40:33 +08:00
|
|
|
|
return PROMPT_TEMPLATE.format(
|
|
|
|
|
|
system_prompt=CHAT_SYSTEM_PROMPT,
|
2026-01-04 14:34:29 +08:00
|
|
|
|
repo_context=context if context else "未检索到相关的仓库上下文。",
|
|
|
|
|
|
diff_content=diff,
|
2025-12-31 16:40:33 +08:00
|
|
|
|
conversation_history=history,
|
2026-01-04 14:34:29 +08:00
|
|
|
|
task_description=BOT_CHAT_TASK + f"\n\n用户问题: {user_query}",
|
2025-12-31 16:40:33 +08:00
|
|
|
|
output_format=BOT_CHAT_OUTPUT_FORMAT
|
|
|
|
|
|
)
|