【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
上篇 blog
【Agent】【OpenCode】本地代理(收益分析)
继续分析了本地代理的收益,比如流量机制与熔断,可以用代理,将请求缓存起来,加入队列或限流逻辑,避免因突发请求或请求过多导致服务不可用;还有故障降级与多模型切换,用本地代理实现自动切换备用模型或 API 的功能,保障系统鲁棒性;本地开发网络优化,借助云服务器进行快速连接,降低延迟;以及屏蔽不支持的参数,通过代理自动过滤掉无效字段,避免因为参数错误导致 Bad Request,然后介绍了代理的定义(一个中间程序,可以代表客户端向服务器发起请求,并将响应返回给客户端),然后分析了可以在本地部署代理是因为 OpenCode 允许用户自定义 AI 后端地址,下面继续分析
OpenCode
上篇 blog 分析到了 OpenCode 允许用户自定义 AI 后端地址,所以请求可以先发给代理,然后再由代理转发给模型 API

这里涉及到一个点,代理的位置决定协议的类型,如上图,选择的是本地代理,那么此时可以用 HTTP 协议进行代理,HTTP 协议的话请求明文可见,比如可以在代理中
javascript
const server = http.createServer(...);
server.listen(2048, '127.0.0.1');
注意,这里创建的是 HTTP 服务器,不是 HTTPS,这意味着 OpenCode 和本地代理之间用的是 HTTP 明文,虽然最终本地代理到 DashScope 是 HTTPS(加密),但至少 OpenCode 到本地代理这一段是明文 ,而本地代理选择 HTTP 明文也没有任何问题,因为 127.0.0.1 是本机回环地址 localhost,数据根本不会经过网卡或网络,只在操作系统内核内存中传递,外部无法窃听,等同于进程间通信,所以本地 HTTP 代理能看到明文,且是安全的
而如果 OpenCode 用 HTTPS 到代理呢?就需要给本地代理配一个 HTTPS 证书(比如自签名),然后 OpenCode 必须信任这个证书(很麻烦),绝大多数开发场景都不需要,因为本地通信无需加密,无中间人风险,加密反而增加 CPU 开销和调试复杂度,所以本地代理直接用 HTTP 就 OK 了
完整消息链路如下

这里链路的关键点在于
| 链路段 | 协议 | 是否加密 | 能否看到明文 |
|---|---|---|---|
| OpenCode ↔ 本地代理 | HTTP | 否 | 能(安全) |
| 本地代理 ↔ DashScope | HTTPS | 是 | 不能 |
当然,这里说的情况只适用于本地代理,如果是远程代理,比如把代理部署在 https://proxy.example.com,那么 OpenCode 也要配置为 https://my-proxy.example.com,此时就是 HTTPS 代理,代理虽然也能看到内容,但需要持有 HTTPS 证书私钥,得先解密请求,处理后再加密发给 DashScope,这要求用户得管理好证书,并且需要让 OpenCode 信任代理服务器(不要是公共代理,最好自己搭私有的),比较麻烦
OK,下面先给出一版本地代理的脚本(基于 JavaScript)
bash
// dashscope-proxy.js
const http = require('http');
const https = require('https');
const server = http.createServer((req, res) => {
console.log(`📥 Received ${req.method} ${req.url}`);
if (req.method === 'POST' && req.url === '/v1/chat/completions') {
let body = '';
req.on('data', chunk => body += chunk);
req.on('end', () => {
// 从原始请求中获取 Authorization 头
const authHeader = req.headers['authorization'] || '';
const options = {
hostname: 'dashscope.aliyuncs.com',
port: 443,
path: '/compatible-mode/v1/chat/completions',
method: 'POST',
headers: {
'Authorization': authHeader, // 直接透传
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(body)
}
};
const proxyReq = https.request(options, (proxyRes) => {
res.writeHead(proxyRes.statusCode, proxyRes.headers);
proxyRes.pipe(res); // 自动处理流式/非流式 + 自动 end()
});
proxyReq.on('error', (e) => {
console.error('Proxy error:', e.message);
res.writeHead(502);
res.end('Bad Gateway');
});
proxyReq.write(body);
proxyReq.end();
});
return;
}
res.writeHead(404);
res.end('Not Found');
});
server.listen(2048, '127.0.0.1', () => {
console.log('✅ DashScope proxy with full OpenCode & Ollama compatibility running on http://127.0.0.1:2048');
});
当然,本地代理完全可以用任何语言进行实现(Python,Go,Rust,JavaScript 等),这里选择 JavaScript,(Node.js)通常不是技术上的必须,而是基于开发效率,生态适配和使用场景的综合考虑
OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Agent】【OpenCode】本地代理(JavaScript 脚本)