39、【Agent】【OpenCode】本地代理分析(三)

张开发
2026/4/6 11:01:23 15 分钟阅读

分享文章

39、【Agent】【OpenCode】本地代理分析(三)
【声明】本博客所有内容均为个人业余时间创作所述技术案例均来自公开开源项目如GithubApache基金会不涉及任何企业机密或未公开技术如有侵权请联系删除背景上篇 blog【Agent】【OpenCode】本地代理分析二分析了 OpenAI 风格的核心特征固定的 endpoint 路径/v1/chat/completions所有的聊天请求都会发到这里请求格式统一统一的认证方式统一的流式响应格式由于 OpenCode 只发送 OpenAI 风格的 endpoint 和格式所以本地代理这里必须监听/v1/chat/completions接收 OpenAI 格式的 JSON再转发给 DashScope然后收到指定请求/v1/chat/completions时开始拼接 request body该本地代理考虑了 HTTP request body 可能是分块传输的形式通过监听 data 事件把所有数据块拼成完整的字符串 body然后介绍了分块传输的概念并提到分块传输时不会同时出现 Content-Length 字段最后介绍了分块传输的适用场景下面继续分析OpenCode上篇 blog 提到了分块传输的适用场景当然HTTP 请求也不一定要分块传输如果提前知道 body 的长度主动设置 Content-Length也是可以的此时请求就不会使用 chunked比如constbodyJSON.stringify({...});req.setHeader(Content-Length,Buffer.byteLength(body));req.write(body);// 一次性发送最后再总结下分块传输Chunked把数据切成多块发送适合一边生成一边传输的场景代理需考虑拼接场景网络传输可能一次只收到一部分一个 chunk也就是分块传输代理应该综合考虑所有可能场景Node.js 的data事件每次收到一个数据库就触发一次data事件需手动拼接Node.js 的end事件所有块接收完成此时可以安全处理完整 request body对开发者透明Node.js 已处理完底层 chunk 格式只需拼接字符串OK回到拼接 request body 这里letbody;req.on(data,chunkbodychunk);req.on(end,(){...});上面介绍了分块传输的相关内容下面再看另一个点箭头函数chunkbodychunk这是 JavaScript 中的一种简洁函数写法这种写法是下面这种传统写法的简写letbody;req.on(data,function(chunk){bodybodychunk;});所以chunk body chunk就是一个函数其作用是把收到的数据块 chunk 拼接到 body 后面下面来详细拆解其中的语法点chunk函数参数名叫datapartx都行名字不重要当 HTTP 请求发送数据时Node.js 会分多次调用这个函数每次调用时都传入一个数据片断也就是这里的chunk表示这是一个箭头函数其左边是参数右边是函数要做的事body chunk函数体内容body body chunk的简写举个例子初始body 第一次收到chunk Hellobody ‘Hello’第二次收到chunk Worldbody Hello World其核心思想在于每当有新数据到来时就将其追加到body这个变量里这也是 Node.js 的语法特性所要求的req.on(‘data’...)需要开发者传入一个回调函数这个回调函数告诉 Node.js当数据到达时需要执行回调函数里的操作而这里的箭头函数可以让代码更简洁更清晰冗长写法req.on(data,function(dataChunk){bodybodydataChunk;});简洁写法req.on(data,chunkbodychunk);OK再举个类似的例子比如xx*2等价于function(x){returnx*2;}OK再回到本地代理的实现部分下面是end事件的处理OK本篇先到这里如有疑问欢迎评论区留言讨论祝各位功力大涨技术更上一层楼更多内容见下篇 blog【Agent】【OpenCode】本地代理分析四

更多文章