py修改
All checks were successful
API接口参数变更检测 / api-param-check (push) Successful in 16s

This commit is contained in:
2026-06-04 09:53:36 +08:00
parent a8cde16c17
commit 1b19e8366e
4 changed files with 245 additions and 205 deletions

View File

@@ -1,6 +1,6 @@
"""
豆包 LLM 接口参数变更审核模块。
仅审核 Controller 层接口参数的增删改,不对 Java 源码做通用代码审查
LLM 仅输出简短的兼容性提示,详细变更由 AST + Markdown 通知展示
"""
import json
@@ -10,14 +10,17 @@ import requests
from comparator import EndpointChangeReport
# 写入 prompt不在通知中展示
FRAMEWORK_IGNORE_HINT = """
以下参数类型/名称属于 Spring MVC 框架自动注入,不是 API 调用方入参,审核时必须忽略,不要在结果中提及:
HttpServletRequest、HttpServletResponse、HttpSession、ServletRequest、ServletResponse、
WebRequest、NativeWebRequest、Model、ModelMap、RedirectAttributes、BindingResult、
Authentication、Principal 等。
"""
def is_llm_enabled(config: Dict[str, Any]) -> bool:
"""
判断大模型总开关是否开启。
:param config: 完整配置字典
:return: True=启用 LLM 审核
"""
"""判断大模型总开关是否开启。"""
return config.get("llm", {}).get("enabled", True)
@@ -26,14 +29,7 @@ def call_doubao_api(
prompt: str,
config: Dict[str, Any],
) -> Optional[str]:
"""
调用火山引擎豆包 Chat Completions API。
:param api_key: API Key
:param prompt: 用户提示词
:param config: 完整配置
:return: LLM 回复文本;失败返回 None
"""
"""调用豆包 API。"""
if not api_key or api_key == "YOUR_DOUBAO_API_KEY":
print("[警告] 未配置豆包 API Key跳过 LLM 审核。")
return None
@@ -41,7 +37,7 @@ def call_doubao_api(
llm_cfg = config.get("llm", {})
model = llm_cfg.get("model") or llm_cfg.get("endpoint_id", "")
if not model:
print("[警告] 未配置 llm.model 或 llm.endpoint_id,跳过 LLM 审核。")
print("[警告] 未配置 llm.model跳过 LLM 审核。")
return None
api_url = llm_cfg.get(
@@ -59,9 +55,9 @@ def call_doubao_api(
{
"role": "system",
"content": (
"你是 Java Spring Boot Controller 接口参数变更分析专家。"
"的职责是识别并整理 Controller 层接口参数的增、删、改、重命名,"
"确认 AST 解析结果是否准确,并指出对调用方的兼容性影响。"
"你是 Java Spring Boot API 变更分析专家。"
"只负责输出简短的兼容性风险提示,不重复罗列接口参数明细。"
+ FRAMEWORK_IGNORE_HINT
),
},
{"role": "user", "content": prompt},
@@ -73,13 +69,11 @@ def call_doubao_api(
kwargs = {"headers": headers, "json": payload}
if timeout is not None:
kwargs["timeout"] = timeout
resp = requests.post(api_url, **kwargs)
resp.raise_for_status()
data = resp.json()
if "choices" in data and data["choices"]:
return data["choices"][0]["message"]["content"]
print("[错误] AI 返回格式异常")
return None
except requests.RequestException as exc:
print(f"[错误] 豆包 API 调用失败: {exc}")
@@ -92,66 +86,49 @@ def build_parameter_change_prompt(
git_diff: str = "",
) -> str:
"""
构造接口参数变更审核提示词(对齐第一版需求:识别 Controller 参数增删改)
:param reports: AST 解析对比结果
:param changed_files: 本次变更的 Controller 文件列表
:param git_diff: 相关文件的 Git diff 内容
:return: 完整 prompt
构造 LLM 提示词:只要求输出兼容性摘要,不要求重复参数列表
"""
ast_report = []
for r in reports:
ast_report.append(
{
"uri": f"{r.http_method} {r.uri}",
"controller": r.controller_class,
"method": r.method_name,
"is_new_endpoint": r.is_new_endpoint,
"is_removed_endpoint": r.is_removed_endpoint,
"parameter_changes": [
"is_new": r.is_new_endpoint,
"is_removed": r.is_removed_endpoint,
"changes": [
{
"type": c.change_type.value,
"name": c.param_name,
"java_type": c.param_type,
"old_name": c.old_name,
"old_type": c.old_type,
"required": c.required,
"detail": c.detail,
}
for c in r.parameter_changes
],
}
)
diff_block = git_diff.strip() if git_diff.strip() else "(无 diff 内容"
if len(diff_block) > 8000:
diff_block = diff_block[:8000] + "\n... [diff 过长,已截断]"
diff_block = git_diff.strip()[:6000] if git_diff.strip() else "(无)"
return f"""审核以下 Controller 接口参数变更,整理并确认变更结果。
return f"""根据以下 Controller 接口参数变更,**仅输出「兼容性提示」**,要求:
## 变更的 Controller 文件
{FRAMEWORK_IGNORE_HINT}
## 输出格式(严格遵守)
- 只输出 36 行 Markdown不要输出「整体说明」「接口变更详情」等标题
- 不要逐条重复 URI 和参数列表(通知里已有)
- 不要提及「排除框架注入」相关字样
- 重点说明:是否有破坏性变更、哪些必填参数调用方必须传入
- 全新 Controller 说明「均为新接口,对现有调用方无破坏」即可
- 语气简洁,可用 <font color="warning">...</font> 标注风险项
## 变更文件
{json.dumps(changed_files, ensure_ascii=False)}
## AST 自动解析的参数变更报告
## AST 变更摘要
{json.dumps(ast_report, ensure_ascii=False, indent=2)}
## Git DiffController 相关)
```diff
## Git Diff
{diff_block}
```
## 审核要求
1. 逐条确认 AST 报告的参数变更是否准确(增/删/改/重命名)
2. 若 AST 有遗漏,补充遗漏的接口参数变更
3. 若 AST 有误报,指出并修正
4. 按以下格式整理每个接口的变更(与通知模板一致):
URI: GET /api/xxx
参数变更:
- 删除: Boolean userType
- 新增: Boolean includeDisabled (是否必填false)
- 重命名: String userName -> String accountName
5. 简要说明是否存在破坏性变更(影响前端/调用方)
6. 用中文回复,简洁清晰
"""
@@ -161,20 +138,8 @@ def review_parameter_changes(
changed_files: List[str],
git_diff: str = "",
) -> Optional[str]:
"""
使用 LLM 审核 Controller 接口参数变更AST 结果的二次确认与整理)。
:param reports: AST 对比报告
:param config: 完整配置
:param changed_files: 变更的 Controller 文件
:param git_diff: Git diff 文本
:return: LLM 整理后的审核结论;未启用或无报告时返回 None
"""
if not is_llm_enabled(config):
print("[LLM] 大模型开关已关闭,跳过接口参数变更审核。")
return None
if not reports:
"""LLM 审核,返回简短兼容性提示。"""
if not is_llm_enabled(config) or not reports:
return None
llm_cfg = config.get("llm", {})