古法编程大战氛围编程
2025 7 20 03:00 AM 60次查看
很容易想到的方式就是让 Claude Code 使用 Gemini 模型,毕竟有免费的 API 可以薅羊毛。
实现也很简单:做个 API 代理服务,将 Claude Code 的请求转成 Gemini 的 API 格式去调用 Gemini 模型,拿到响应后再转成 Claude 的格式。
看上去应该是个很简单的任务吧,我决定让 AI 编程工具帮我搞定。
以下是需求提示词:
我需要给Claude Code写一个模型代理服务,这个服务接收Claude的API的格式,你需要将它转成Gemini的API的参数形式来调用AI Studio的API,然后返回结果(需要同时支持流式和非流式)。
你需要使用以下的技术栈:
* Python版本为3.13
* 使用uv来管理虚拟环境
* HTTP服务使用FastAPI
* HTTP请求使用aiohttp,它接收GEMINI_API_KEY环境变量来调用Gemini模型,你还需要设置trust_env来支持HTTPS_PROXY
二者的参数差异较大,你需要查看一下文档,仔细对比一下二者的参数,确保参数不会丢失或错误。
特别注意模型需要进行映射:
* 模型名如果包含sonnet或opus,映射到gemini-2.5-pro,并把includeThoughts设为true
* 其他模型映射到gemini-2.5-flash,并把thinkingBudget设为0
我很确信我没写错模型名,最新的就是2.5,你不要自作主张进行修改。
此外,系统提示词、工具调用和思考过程也是容易出错的地方,你要确保输入输出都完全兼容。
如果调用方没有设置,你不应该主动设置max_tokens、temperature、timeout等参数。
在实际编码前,用context7查询上述技术栈和模型的最新文档,确保你写的代码符合最新的文档。如果找不到,你需要尝试搜索,直到找到正确的文档。
如果运行过程中有异常,你需要使用logging.exception记录,而不是print或直接忽略。
你还需要实现调用模型的日志和统计的功能:
* 控制台需要在发起请求时,打印完整的输入参数;获取到首token(仅流式)时打印耗时;获取到完整响应时,打印总耗时和token开销(包括输入、输出和thinking等)。
* 在获取到完整响应时,你需要将这些信息记录到 logs.jsonl 文件中:输入参数、输出响应、token开销、总耗时、首token时间(仅流式)。注意序列化JSON时设置ensure_ascii=False。
你需要写完整的单元测试,验证你的代码是正确的。
再写一个测试脚本来发起请求,获取到完整结果,并验证日志中的记录正确。测试用例你可以参考最新的官方文档。
我已经将HTTPS_PROXY和GEMINI_API_KEY环境变量写入.env文件中,你可以利用它们来测试,但你自己不要直接读取文件内容。
最后,你需要验证你的代码是正确的:
1. 在8000端口运行代理服务
2. 调用 ANTHROPIC_BASE_URL=http://127.0.0.1:8000 claude --dangerously-skip-permissions -d -p "当前文件夹下的Python文件有多少行"
这个验证过程最多运行30秒,在出现下列任意情况时,你应该立刻停止:
- 超时
- claude成功执行完毕
- claude报错
- 代理服务报错
请不要浪费无谓的时间在等待上,出错应该立即停止。
如果出现错误或超时,检查日志内容并进行修复。如果有需要,使用context7查询文档。
最后,你要审视我给你的上述要求,必须每一个都做到,不能自作主张修改或无视。如果有需要,使用context7查询文档。
实际上,这已经是我修改过几个版本的提示词了,因为经常有些要求被忽视,或者我自己曾经遇到过的坑,所以我特别指出或提示了。顺便还让它加了日志,这样可以方便我学习。首先出场的是 Cursor + Claude 4 Sonnet。
它的第一个版本把
thinkingBudget
参数给丢了。提示它不能丢弃后,它又改了半天,告诉我都修好了。我一测试就报错了,让它看看日志继续修。它弄了半天又说修好了。
可是简单的问答确实没问题,工具调用仍然没实现,一会提示没有这个工具,一会遇到响应报错。
于是我再让 Cursor + Claude 4 Sonnet Thinking 上阵。
它解决得比较顺利,一次性就获取到结果了。但是我观察到日志后发现流式处理报错了,让它尝试修复。
结果它改了半天后,告诉我它把流式回退到非流式响应了,已经完成我的所有任务。我只好让它重新实现流式处理。
它吭哧吭哧改了半天,还写了几个测试代码来验证,最后决定使用 httpx 来实现了。我立马打断了它,要求它必须使用 aiohttp,并且提示它可以用 context7 查询文档。
这次它终于改对了,工具调用也没出现问题,但是 token 统计是错的,这个小问题我就先容忍吧。
接下来试试 Cursor + Gemini 2.5 Pro。
整个过程有点一言难尽,命令执行完了还要我手动干预才能继续,总是忘记用 uv 来使用虚拟环境,文档没查到就不查了,模型仍然是使用 Gemini 1.5 的版本,怎么告诉它都不改,我手动改成 2.5 后,它还给我还原回去。
最后我也懒得让它去修了,感觉它不太听话。
然后是刚推出的 Kiro,据多位 UP 主表示体验很不错。
它先写了个需求文档,然后生成技术方案,再规划了 12 个任务,看上去挺专业的。
可执行过程却是灾难性的:命令执行完了大概率需要手动关闭终端才能继续,但是下次运行时又会忘记激活虚拟环境。我执行了一个小时,还卡在第 2 个任务,决定放弃了。
之后决定试试 Claude Code + Claude 4 Sonnet。
它在使用
--dangerously-skip-permissions
参数后是体验最好的,全程自己干活。虽然我发现它有很多地方误入歧途了,但是我也没干预它,最后它还是能自己解决。干了 50 分钟后,终于完成了第一个版本。但是实测发现仍然报错,于是它又修了一个小时,还是没解决。这时候我的额度用完了,只好停止测试。
顺带一提,Claude Code 似乎不支持同时让两个命令互相超时等待,于是我改成让它用 bash 脚本实现了,在这上面也花费了它很多时间。
既然我已经有一个可用的代理了,那么我决定让 Claude Code + Gemini 2.5 Pro 也来试试这个任务。
结果表现和 Cursor + Gemini 2.5 Pro 差不多,经常要我手动回复继续,其他毛病也一个不落,还遇到工具调用时把
libraryName
传成 library_name
的 bug,看来真没必要用这个低配版了。最后,我还想试试古法编程,究竟这个任务有多难,为什么那么多 AI 编程工具都无法顺利解决?
在花费约 4 小时编码和 debug 后,我终于发现这里面的坑——文档太烂了:
- Claude 的文档相对还好,但是有些
optional
的参数标记成了required
。 - Gemini 有
v1
和v1beta
两个 API 版本,前者似乎没有文档,只知道格式不兼容。 - Gemini 的系统提示词应该用
system_instruction
参数,但是文档里写的是systemInstruction
,并且其他参数都是驼峰式。 - Gemini 的响应里,很多字段莫名其妙不输出,文档也不说明。
在这次测试中,我最终得出了如下几个结论:
- Gemini 2.5 Pro 在编程任务中明显弱于 Claude 4 Sonnet,特别是指令遵循和工具调用方面。后续可能会继续测试 Kimi K2,据说它的工具调用能力很好,但是编程能力大概只相当于 Claude 3.5 Sonnet。
- Claude Code 的 Pro 订阅对于重度编程来说明显是不够用的,但是每月 $100 的 Max 订阅对很多人来说可能偏贵了。
- Kiro 的方案其实挺好的,我在使用 Cursor 时也会让它先写一个文档记录需求和技术方案。当有变更时,会让它先改写文档,我确认无误时再继续编码,避免它自作主张或者丢失上下文。
- 纯氛围编程目前结果并不理想,在有经验的开发者干预下,结果会好很多。
- 古法编程才能真正发现里面的坑,没有实践就没有收获。
- 两种编程方式结合的方法,可能是效率最高的。
0条评论 你不来一发么↓