35、【Agent】【OpenCode】本地代理(脚本实现)

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如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 脚本)

相关推荐
龙腾AI白云3 小时前
AI检索增强生成(RAG):解决大模型幻觉的核心落地技术
数据库·人工智能·机器学习·知识图谱
云票4 小时前
企业对接AI合同审查系统的工程实践
人工智能
admin and root4 小时前
「AI安全篇」实战AntiDebug自动化JS逆向加解密MCP
javascript·人工智能·网络安全·自动化·漏洞挖掘·cnvd·src赏金
智能RPA4 小时前
智能体自动化平台与主数据管理平台(MDM)对比评测
人工智能·自动化·agent·rpa
XLYcmy4 小时前
AI 时代,MOM(制造运营管理系统)该如何演进? 下
ai·llm·agent·智能制造·数字孪生·mom·harness
跨境小彭4 小时前
Temu拉美站点铺货实操复盘:手动复制痛点与批量自动化解决方案
服务器·人工智能·搜索引擎·自动化·temu电商运营
封印师请假去地球钓鱼4 小时前
边解边变的问题:从“决策依赖“一词出发
人工智能·算法
Spcarrydoinb5 小时前
【无标题】
ai·agent
AI搅拌机5 小时前
ComfyUI管理大师:安全稳定升级+切换指定版本!
人工智能
浅安的邂逅5 小时前
20929-OpenAI 一天踩三脚急刹:暂停前沿训练、叫停 Astra、披露越权访问澳政府网站
人工智能·大模型·ai编程·行业动态·ai日报