36、【Agent】【OpenCode】本地代理(JavaScript 脚本)

张开发
2026/4/9 17:17:39 15 分钟阅读

分享文章

36、【Agent】【OpenCode】本地代理(JavaScript 脚本)
【声明】本博客所有内容均为个人业余时间创作所述技术案例均来自公开开源项目如GithubApache基金会不涉及任何企业机密或未公开技术如有侵权请联系删除背景上篇 blog【Agent】【OpenCode】本地代理脚本实现分析提到了代理的位置决定协议的类型比如如果选择的是本地代理则可以用 HTTP 协议进行代理这意味着 OpenCode 和本地代理之间用的是 HTTP 明文虽然最终本地代理到 DashScope 是 HTTPS加密但至少 OpenCode 到本地代理这一段是明文而如果是远程代理可以使用 HTTPS 代理代理需要持有 HTTPS 证书私钥得先解密请求处理后再加密发给 DashScope比较麻烦最后给出了一版本地代理的脚本下面继续分析OpenCode上篇 blog 分析到了这里选择 JavaScirpt 脚本是基于开发效率生态适配和使用场景的综合考虑下面详细分析下其中原因JavaScript 与前端IDE 插件生态天然契合VSCode 本身就是用 ElectronJavaScript/TypeScript构建的很多 AI 插件的开发者都很熟悉 JS/TS比如用户如果已经在写 VSCode 插件那么顺手写个配套代理也是非常自然的JSON 处理极其简单AI 的 API 请求和响应全是 JSON而 JavaScript 的JSON.parse()JSON.stringify()是原生支持 JSON 解析代码极简比如在 Node.js 的代理中修改请求体只需要 3 行就能搞定constbodyJSON.parse(rawBody);body.modelqwen-plus;constnewBodyJSON.stringify(body);注意这里有个细节前两行已经完成了修改 request body 的逻辑body 这个 JavaScript 对象到这里已经是改好的状态但是 HTTP 请求的 body 必须是字符串或 Buffer不能直接发送 JS 对象所以第三行这里需要先把 JSON 对象先转成字符串才能发送 HTTP 请求举个例子假设 OpenCode 发来{model:gpt-3.5-turbo,messages:[...]}代码执行的时候变量转换如下步骤变量值rawBody字符串{model:gpt-3.5-turbo,...}bodyJS 对象{ model: qwen-plus, messages: [...] }newBody字符串{model:qwen-plus,...}只有 newBody 才能作为合法的 HTTP body 发送给 DashScope其实也可以省略变量名直接使用JSON.stringify(body)无需存到 newBody这样写成两行即可letbodyJSON.parse(rawBody);body.modelqwen-plus;proxyReq.write(JSON.stringify(body));OK继续分析本地代理使用 JavaScript 的好处异步 IO 高效处理流式响应大模型 API 通常支持流式输出streaming而 Node.js 的stream和pip()可以轻松透传流数据这些虽然 Go 和 Python 也能做但 Node.js 在这类 IO 密集型任务上启动快内存轻零依赖快速启动一个 20 行的 Proxy.js 脚本不需要编译只需要node proxy.js无外部依赖用内置的http/https模块对比其他语言编程语言依赖表现Go需要编译生成单文件执行Python需确保环境有 requests 等库Rust编译慢适合高性能场景对于临时调试快速原型JS 是最轻量的选择上面介绍了本地代理使用 JavaScript 的优势下面再介绍一些不适合用 JavaScript 的场景场景推荐语言原因高并发生产环境GoRustNode.js 单线程CPU 密集型任务会发生阻塞资源受限设备比如树莓派CRustNode.js 内存炸弄较高~50MB需要复杂计算比如 token 统计加密等PythonRustJS 数值科学计算生态弱企业级部署比如监控日志熔断等场景JavaGoSpring Cloud 等微服务框架成熟可以看到所有主流语言都能实现本地代理选择取决于开发者的熟悉度和需求没有最好的语言只有最合适当前场景的工具如果更熟悉 Python就用 Python如果追求极致性能就用 GoRust如果只是临时调试JS 是最轻量的选择OK本篇先到这里如有疑问欢迎评论区留言讨论祝各位功力大涨技术更上一层楼更多内容见下篇 blog

更多文章