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 脚本)

相关推荐
测试员周周2 小时前
【Appium 系列】第16节-WebView-H5上下文切换 — 混合应用的自动化难点
运维·开发语言·人工智能·功能测试·appium·自动化·测试用例
K姐研究社4 小时前
怎么用AI制作电商口播视频,开拍APP一键生成
人工智能·音视频
LaughingZhu4 小时前
Product Hunt 每日热榜 | 2026-05-21
前端·人工智能·经验分享·chatgpt·html
传说故事5 小时前
【论文阅读】MotuBrain: An Advanced World Action Model for Robot Control
论文阅读·人工智能·具身智能·wam
魏杨杨5 小时前
一个程序员眼中的 AI 核心概念,讲透 LLM 、Agent 、MCP 、Skill 、RAG...
ai·.net·agent·claude code
北京耐用通信5 小时前
全域适配工业场景耐达讯自动化Modbus TCP 转 PROFIBUS 网关轻松实现以太网与现场总线互通
网络·人工智能·网络协议·自动化·信息与通信
火山引擎开发者社区5 小时前
TRAE × 火山引擎 Supabase:为你的 AI 应用装上“数据引擎”
人工智能
小a彤6 小时前
GE 在 CANN 五层架构中的位置
人工智能·深度学习·transformer
前端若水6 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
Upsy-Daisy6 小时前
AI Agent 项目学习笔记(八):Tool Calling 工具调用机制总览
人工智能·笔记·学习