AI 编程 Agent 不是黑箱了:用 ccglass 看清 Claude Code 和 Codex 的真实请求
引言:AI 编程 Agent 的神秘面纱在 AI 辅助编程的浪潮中,Claude Code 和 OpenAI Codex 这类 AI 编程 Agent 已经成为开发者手中的利器。它们能够理解自然语言描述,自动生成代码、修复 bug、甚至重构整个模块。然而,对于许多开发者来说,这些 AI Agent 的内部运作机制仍然像是一个“黑箱”——你输入需求,它输出代码,但中间具体发生了什么?它到底向 API 发送了什么请求?用了什么参数?为什么有时候输出不如预期?今天,我们将通过一个名为ccglass的工具,彻底揭开这个黑箱的面纱。ccglass是一个轻量级的请求监控库,它可以拦截并记录 AI Agent 与后端 API 之间的所有通信。通过它,你可以清晰地看到 Claude Code 和 Codex 的真实请求内容,从而理解它们的工作原理,甚至调试自己的 AI 应用。## 基础概念:理解 AI Agent 的请求结构在深入使用 ccglass 之前,我们先复习一下 AI 编程 Agent 的核心工作流程。以 Codex 为例,当用户输入“用 Python 写一个快速排序函数”时,Agent 会构造一个 HTTP 请求发送到 OpenAI 的 API。这个请求通常包含以下几个关键部分:-model:使用的模型名称,如gpt-4或code-davinci-002。-messages:对话历史,包含用户输入和系统提示。-temperature:控制输出随机性的参数。-max_tokens:生成的最大 token 数量。以下是 Codex 请求的简化示例(使用 Python 的requests库):pythonimport requests# 这是 Codex 请求的典型结构url = "https://api.openai.com/v1/chat/completions"headers = { "Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json"}data = { "model": "gpt-4", "messages": [ {"role": "system", "content": "你是一个编程助手,擅长生成 Python 代码。"}, {"role": "user", "content": "用 Python 写一个快速排序函数。"} ], "temperature": 0.7, "max_tokens": 500}response = requests.post(url, headers=headers, json=data)print(response.json())这段代码展示了 Agent 发送给 API 的原始请求。但实际中,Agent 可能会添加额外的系统提示、格式化指令或上下文管理。ccglass能够捕获这些细节。## 中级用法:使用 ccglass 拦截并分析请求现在,让我们安装并使用ccglass。假设你已经有了一个 Python 环境,可以通过 pip 安装:bashpip install ccglass````ccglass` 的核心功能是作为一个中间件,自动监听 HTTP 请求并记录它们。以下是一个完整示例,演示如何使用 ccglass 监控 Codex 的请求:pythonimport ccglassimport requests# 启动 ccglass 监听器,默认监听 127.0.0.1:8080monitor = ccglass.Monitor(host=“127.0.0.1”, port=8080)# 定义一个回调函数,当检测到请求时打印详细信息def on_request(request): print(“=== 检测到请求 =“) print(f"URL: {request.url}”) print(f"Method: {request.method}“) print(f"Headers: {request.headers}”) print(f"Body: {request.body.decode(‘utf-8’)}“) print(”= 请求结束 =\n")# 注册回调monitor.on_request(on_request)# 模拟一个 Codex 请求(实际中需要替换为你的 API 调用)url = "http://127.0.0.1:8080/v1/chat/completions"headers = { “Authorization”: “Bearer fake-key”, “Content-Type”: “application/json”}data = { “model”: “gpt-4”, “messages”: [ {“role”: “system”, “content”: “你是一个编程助手。”}, {“role”: “user”, “content”: “实现二分查找。”} ]}# 发送请求,ccglass 会自动拦截response = requests.post(url, headers=headers, json=data)print(“响应内容:”, response.json())运行这段代码,你会看到类似下面的输出(取决于实际响应):= 检测到请求 =URL: http://127.0.0.1:8080/v1/chat/completionsMethod: POSTHeaders: {‘Authorization’: ‘Bearer fake-key’, ‘Content-Type’: ‘application/json’}Body: {“model”: “gpt-4”, “messages”: [{“role”: “system”, “content”: “你是一个编程助手。”}, {“role”: “user”, “content”: “实现二分查找。”}], “temperature”: 0.7, “max_tokens”: 500}= 请求结束 ===响应内容: {“id”: “chatcmpl-xxx”, “choices”: […]}通过 ccglass,你可以清楚地看到:- Agent 发送了哪些参数(model、messages、temperature 等)。- 系统提示(system prompt)的具体内容。- 用户输入是如何被格式化的。## 高级用法:分析 Claude Code 的请求与调试Claude Code 和 Codex 的请求结构略有不同。Claude 使用 Anthropic 的 API,其消息格式可能包含 `role` 和 `content` 的分层结构。下面是一个更复杂的示例,展示如何用 ccglass 监控 Claude Code 的请求,并添加过滤功能:pythonimport ccglassimport json# 创建更高级的监控器,支持过滤和统计monitor = ccglass.Monitor(host=“127.0.0.1”, port=9090)# 使用装饰器注册回调,只记录包含 Claude 关键词的请求@monitor.on_request(filter_func=lambda r: “claude” in r.body.decode(‘utf-8’).lower())def log_claude_requests(request): print(”— Claude Code 请求 —“) body = json.loads(request.body) print(f"模型: {body.get(‘model’, ‘unknown’)}”) print(f"消息数: {len(body.get(‘messages’, []))}“) for i, msg in enumerate(body.get(‘messages’, [])): print(f” 消息 {i+1}: role={msg[‘role’]}, 内容长度={len(msg[‘content’])}“) print(f"温度: {body.get(‘temperature’, ‘默认’)}”) print(“— 结束 —\n”)# 模拟一个 Claude Code 请求url = "http://127.0.0.1:9090/v1/messages"headers = { “x-api-key”: “sk-ant-xxx”, “anthropic-version”: “2023-06-01”}data = { “model”: “claude-3-opus-20240229”, “max_tokens”: 1024, “messages”: [ {“role”: “user”, “content”: “请优化以下代码:\ndef factorial(n):\n if n == 0:\n return 1\n else:\n return n * factorial(n-1)”} ], “temperature”: 0.5}response = requests.post(url, headers=headers, json=data)print(“Claude 响应:”, response.json()[:200] + “…”) # 截断输出```这个示例展示了如何:1. 设置过滤条件,只监控 Claude 相关请求。2. 解析请求体,提取关键信息如模型名称、消息数量。3. 对比不同 Agent 的请求差异,比如 Claude 使用anthropic-version头,而 Codex 使用Authorization。通过这种方式,你可以调试为什么同样的提示词在不同 Agent 下产生不同结果——答案往往隐藏在请求参数中。## 总结:从黑箱到透明通过ccglass,我们成功地将 AI 编程 Agent 的请求从“黑箱”变成了“透明”。你可以看到:- Claude Code 和 Codex 发送的完整请求结构。- 系统提示(system prompt)的具体内容,这直接影响代码质量。- 参数如 temperature、max_tokens 如何影响输出。- 不同 API 的认证方式和消息格式差异。这种透明度对于开发者来说至关重要:它帮助你理解 AI 的行为,调试错误的输出,甚至优化自己的提示词。下次当你使用 Claude Code 或 Codex 时,不妨用 ccglass 窥探一下背后的真实请求——你会发现,AI 编程 Agent 其实没那么神秘。