Python 构建基于 Claude 3.5 的全栈代码审计 Agent
介绍如何使用 Python 结合 Claude 3.5 Sonnet 和 Gemini 1.5 Pro 构建一个本地化的代码审计 Agent。通过 AST 解析、RAG 架构及 API 聚合网关,实现对遗留代码的自动化分析与重构。文章涵盖文件扫描器设计、大模型客户端交互、流式响应处理等核心模块,并提供了优化 Token 成本、提示词工程及性能调优的建议,旨在帮助开发者利用 AI 提升代码质量与开发效率。

介绍如何使用 Python 结合 Claude 3.5 Sonnet 和 Gemini 1.5 Pro 构建一个本地化的代码审计 Agent。通过 AST 解析、RAG 架构及 API 聚合网关,实现对遗留代码的自动化分析与重构。文章涵盖文件扫描器设计、大模型客户端交互、流式响应处理等核心模块,并提供了优化 Token 成本、提示词工程及性能调优的建议,旨在帮助开发者利用 AI 提升代码质量与开发效率。

在 AI 辅助编程领域,GitHub Copilot 虽然方便,但往往只能针对当前文件进行补全,缺乏对'整个项目结构'的宏观理解。随着 Claude 3.5 Sonnet 在 Coding Benchmarks(编程基准测试)中全面霸榜,以及 Gemini 1.5 Pro 开放百万级上下文窗口,我们完全有能力自己动手,构建一个比 Copilot 更懂业务逻辑的私人编程助手。本文将从 AST(抽象语法树)解析开始,深入讲解如何利用 Python 构建一个 RAG(检索增强生成)架构,并通过 API 聚合网关接入大模型,实现对遗留代码(Legacy Code)的自动化重构与审计。
作为一名每天要写几百行代码的开发者,你是否遇到过以下场景:
Claude 3.5 Sonnet 的出现改变了游戏规则。 它在 HumanEval 和 MBPP 等代码测试集中,展现出了惊人的'一次通过率'。更重要的是,它的逻辑推理能力极其适合处理复杂的系统架构问题。而配合 Gemini 1.5 Pro 的超大上下文,我们甚至可以把整个 Linux 内核的一部分扔给它去分析。
今天,我们就用 Python 来实现一个 CLI(命令行)工具,我给它取名为 Code-Auditor。
要实现一个能读懂项目的 Agent,不能简单地把代码粘贴给 AI。我们需要设计一个 Pipeline:
.gitignore 规则过滤掉无关文件(如 node_modules, __pycache__)。在实战中,直接对接 Anthropic(Claude 的母公司)或 Google 的 API 存在两个工程难题:
因此,本项目采用 OpenAI 兼容协议 的聚合网关方案。这意味着我们可以用标准的 openai Python 库,去调用 Claude 和 Gemini,实现'一套代码,模型随意切'。
在开始 Coding 之前,请确保你的环境满足以下要求。
我们需要安装以下 Python 库:
openai: 虽然我们要调用的不是 GPT,但通过兼容协议,这是最通用的客户端。pathspec: 用于解析 .gitignore 文件,避免把垃圾文件发给 AI。rich: 用于在终端输出漂亮的彩色文本和进度条。pip install openai pathspec rich python-dotenv
为了演示,我们将使用支持 OpenAI 兼容协议的第三方 API 服务。它完美支持 Claude 3.5 Sonnet 和 Gemini 1.5 Pro,且接口格式与 OpenAI 完全一致。
注意:请自行注册并获取对应的 API Key。
Code-Auditor我们将代码分为三个模块:scanner.py(文件处理)、client.py(模型交互)、main.py(主程序)。
scanner.py)这个模块的难点在于:如何像 Git 一样聪明地忽略文件?
import os
import pathspec
class ProjectScanner:
def __init__(self, root_dir):
self.root_dir = root_dir
self.gitignore = self._load_gitignore()
def _load_gitignore(self):
"""加载.gitignore 规则"""
gitignore_path = os.path.join(self.root_dir, ".gitignore")
if os.path.exists(gitignore_path):
with open(gitignore_path, "r", encoding="utf-8") as f:
return pathspec.PathSpec.from_lines("gitwildmatch", f)
return pathspec.PathSpec.from_lines("gitwildmatch", [])
def scan(self):
"""遍历项目,返回所有代码文件的内容"""
file_count = 0
code_context = "" # 初始化变量
default_ignore = {".git", "__pycache__", "node_modules", "venv", ".idea", ".vscode"}
for root, dirs, files in os.walk(self.root_dir):
# 修改 dirs 列表以跳过忽略目录
dirs[:] = [d for d in dirs if d not in default_ignore]
file files:
file_path = os.path.join(root, file)
rel_path = os.path.relpath(file_path, .root_dir)
.gitignore.match_file(rel_path):
file.endswith((, , , , , )):
:
(file_path, , encoding=) f:
content = f.read()
code_context +=
file_count +=
Exception:
code_context, file_count
client.py)这里是魔法发生的地方。注意 base_url 的配置,这是我们能够在一个 SDK 里调用不同模型的关键。
from openai import OpenAI
import os
class AIClient:
def __init__(self, api_key):
# 配置 OpenAI 兼容协议的 API 地址
self.client = OpenAI(
api_key=api_key,
base_url="https://your-api-gateway.com/v1" # 替换为实际网关地址
)
def analyze_code(self, code_context, prompt):
"""
发送请求给 Claude-3.5-Sonnet
"""
system_prompt = """你是一名拥有 20 年经验的资深架构师,精通 Clean Code 原则。
你的任务是分析用户提供的项目代码,找出潜在的 Bug、性能瓶颈,并给出重构建议。
请直接输出 Markdown 格式的报告,不要废话。"""
try:
stream = self.client.chat.completions.create(
# 这里指定模型名称,具体名称请参考平台文档
model="claude-3-5-sonnet",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": f"项目代码如下:\n{code_context}\n\n用户需求:{prompt}"}
],
stream=True,
temperature=0.2 # 代码任务需要低创造性,高准确性
)
return stream
except Exception as e:
print(f"API 调用错误:{e}")
return None
main.py)结合 rich 库,打造极客风的终端界面。
import os
from scanner import ProjectScanner
from client import AIClient
from rich.console import Console
from rich.markdown import Markdown
console = Console()
def main():
# 1. 配置 API Key
api_key = os.getenv("VECTOR_API_KEY")
if not api_key:
console.print("[red] 错误:请设置环境变量 VECTOR_API_KEY[/red]")
return
# 2. 获取目标路径
target_dir = input("请输入要分析的项目路径 (默认当前目录): ").strip() or "."
# 3. 扫描代码
with console.status("[bold green] 正在扫描项目文件...[/bold green]"):
scanner = ProjectScanner(target_dir)
context, count = scanner.scan()
console.print(f"[blue] 扫描完成!共发现 {count} 个代码文件,字符数:{len(context)}[/blue]")
if len(context) > 200000:
console.print("[yellow] 警告:项目过大,建议切换至 gemini-1.5-pro 模型以支持超长上下文[/yellow]")
# 4. 用户交互
while True:
user_query = input("\n请输入你的指令 (例如:'找出代码中的安全漏洞' 或 'q'退出): ")
if user_query.lower() == 'q':
break
ai = AIClient(api_key)
stream = ai.analyze_code(context, user_query)
if stream:
console.()
chunk stream:
chunk.choices[].delta.content:
content = chunk.choices[].delta.content
(content, end=, flush=)
()
__name__ == :
main()
在运行上述代码时,你会发现 Claude 3.5 Sonnet 与 GPT-4o 的一个显著区别:它更懂'人话'。
如果你的项目是一个几十万行的老旧 Java 工程,Token 数量轻松突破 10 万。这时候 Claude 的 200k 上下文可能捉襟见肘。
在 client.py 中,你只需要将 model 参数修改为 gemini-1.5-pro。网关会自动将请求路由到对应模型服务商。Gemini 1.5 Pro 支持高达 100 万甚至 200 万 Token 的上下文。这意味着你可以把整个框架的源码一次性喂给它,问它:'请画出这个项目的 UML 类图'。这种能力在以前是无法想象的。
在开发这个 Agent 的过程中,有几个技术细节需要注意:
虽然是按量付费,但把整个 node_modules 发过去绝对是灾难。
ProjectScanner 中的过滤逻辑。对于 Python 项目,排除 venv;对于前端,排除 dist 和 build。针对代码重构,推荐使用 CO-STAR 框架编写 Prompt:
分析大项目时,模型思考时间可能长达 30 秒。确保你的 HTTP Client 设置了足够的 timeout 时间,或者使用流式(Stream)接收,这样可以避免连接被中间网关切断。
AI 不会取代程序员,但'会用 AI 的程序员'一定会取代'不会用 AI 的程序员'。
从 Copilot 的自动补全,到我们今天构建的全局代码审计 Agent,AI 介入开发的深度正在不断加深。掌握 API 聚合技术,灵活调用 Claude、Gemini 等不同特性的模型,将成为未来全栈开发者的必备技能。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online