【声明】本博客所有内容均为个人业余时间创作所述技术案例均来自公开开源项目如GithubApache基金会不涉及任何企业机密或未公开技术如有侵权请联系删除背景上篇 blog【Agent】【OpenCode】本地代理分析三提到了 HTTP 请求也不一定要分块传输如果提前知道 body 的长度主动设置 Content-Length 也是可以的然后总结了下分块传输的几个关键点如拼接data事件end事件等提到 Node.js 已处理完底层 chunk 格式data事件只需拼接字符串即可接着继续分析了另一个点箭头函数提到这是 JavaScript 中简洁函数的写法其作用就是把收到的数据块 chunk 拼接到 body 后面然后详细分析了其中的语法点提到箭头函数可以让代码更简洁更清晰最后对比了箭头函数和传统写法的区别下面继续分析OpenCode下面看end事件的处理这里首先获取 Authorization 头部信息constauthHeaderreq.headers[authorization]||;这里有个 JavaScript 的语法细节代理会尝试从请求头部信息中读取 authorization 字段如果该字段不存在或为假值就用空字符串代替在 JavaScript 中||是逻辑或操作对于表达式a || b如果a是真值truthy返回a否则返回b如下情况会被视为 falsyundefinednull0-0NaNfalse所以req.headers[authorization]||就等价于if(req.headers[authorization]is not falsy){use req.headers[authorization]}else{use}这是种防御性编程技巧如果客户端没有 Authorization 头那么req.headers[authorization]// → undefined如果没有后面的|| 直接写constauthHeaderreq.headers[authorization];那么authHeader就是undefinedOpenCode 通常会设置该字段AuthorizationBearer sk-xxxxxxBearer 含义如下表示 API Key 持有者这里本地代理选择了直接透传Authorization:authHeader,// 直接透传这里的设计意图是让客户端 OpenCode 自己提供 DashScope 真实的 API Key代理不做硬编码只是透传OK下面来详细看下这里的optionsconstoptions{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)}};这个options对象是 Node.js 中使用的内置模块https.request发起 HTTPS 请求时必需的配置参数其中定义了要向哪个服务器用什么方式发送什么样的请求这里的配置将会建立一个到阿里云 DashScope 的 HTTPS 连接hostname: dashscope.aliyuncs.com这里是目标服务器的主机名域名DashScope 是阿里云提供的大模型服务平台其 API 域名就是dashscope.aliyuncs.com注意这里不能写协议比如https://因为https.request已经隐含使用 HTTPSport: 443目标服务器监听的端口号443 是 HTTPS 协议的默认端口所有标准的 HTTPS 网站包括 API都使用 443如果省略porthttps.request默认也会用 443所以这行其实可以省略但显式写出来更清晰path: /compatible-mode/v1/chat/completions请求的 URL 路径注意不包含域名和协议该路径是 DashScope 提供的 OpenAI 兼容模式这样虽然 OpenCode 插件发送的是POST /v1/chat/completions代理只需把路径改成/compatible-mode/v1/chat/completions就可以对接 DashScopemethodPOSTHTTPS 的请求方法因为聊天窗口需要发送消息内容在 request body 中而GET无法携带 body所以必须用 POST或 PUT但行业惯例是 POSTOK本篇先到这里如有疑问欢迎评论区留言讨论祝各位功力大涨技术更上一层楼更多内容见下篇 blog