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

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除

背景

上篇 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,比如

javascript 复制代码
const body = JSON.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 这里

javascript 复制代码
let body = '';
req.on('data', chunk => body += chunk);
req.on('end', () => { ... });

上面介绍了分块传输的相关内容,下面再看另一个点:箭头函数

javascript 复制代码
chunk => body += chunk

这是 JavaScript 中的一种简洁函数写法,这种写法是下面这种传统写法的简写

javascript 复制代码
let body = '';
req.on('data', function(chunk) {
  body = body + chunk;
});

所以 chunk => body += chunk 就是一个函数,其作用是把收到的数据块 chunk 拼接到 body 后面,下面来详细拆解其中的语法点

  • chunk函数参数名(叫 datapartx 都行,名字不重要) ,当 HTTP 请求发送数据时,Node.js 会分多次调用这个函数,每次调用时,都传入一个数据片断 (也就是这里的 chunk
  • =>:表示这是一个箭头函数,其左边是参数,右边是函数要做的事
  • body += chunk :函数体内容,body = body + chunk 的简写

举个例子

  • 初始:body = ""
  • 第一次收到 chunk = 'Hello'body = 'Hello'
  • 第二次收到 chunk = 'World'body = Hello World

其核心思想在于,每当有新数据到来时,就将其追加到 body 这个变量里 ,这也是 Node.js 的语法特性所要求的,req.on('data',...) 需要开发者传入一个回调函数,这个回调函数告诉 Node.js,当数据到达时,需要执行回调函数里的操作,而这里的箭头函数可以让代码更简洁,更清晰:

  • 冗长写法
javascript 复制代码
req.on('data', function(dataChunk) {
  body = body + dataChunk;
});
  • 简洁写法
javascript 复制代码
req.on('data', chunk => body += chunk);

OK,再举个类似的例子,比如

javascript 复制代码
x => x * 2

等价于

javascript 复制代码
function(x) { return x * 2; }

OK,再回到本地代理的实现部分,下面是 end 事件的处理


OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Agent】【OpenCode】本地代理分析(四)

相关推荐
码农小旋风19 小时前
Codex 直接住进 JetBrains IDE 里:AI Agent 正在接管熟悉的开发入口
ide·人工智能
ʜᴇɴʀʏ19 小时前
AAAI 2025 | DiffCorr:基于可靠伪标签引导的无监督点云形状对应
人工智能·目标检测·计算机视觉
黎阳之光19 小时前
智慧水利堤坝监测:全域实景技术实现河流、水库隐患预警
大数据·人工智能·物联网·安全·数字孪生
云边云科技_云网融合19 小时前
大模型聚合时代:云边云科技 AI 网关轻量化赋能企业落地
大数据·运维·网络·人工智能
love530love19 小时前
ComfyUI:为什么说它是 AIGC 应用层面的集大成者?
人工智能·pytorch·windows·aigc·devops·comfyui·extensions
程序员柒叔19 小时前
OpenCode 一周动态-2026-W20
人工智能·github·copilot·agent·opencode
wuxinyan12319 小时前
工业级大模型学习之路013:RAG零基础入门教程(第九篇):RAG幻觉治理
人工智能·学习·rag
XD74297163619 小时前
科技晚报|2026年5月17日:AI 开始进入国家与企业制度层
人工智能·科技·企业数字化·科技晚报
十贝19 小时前
agentmemory 安装与使用手册
人工智能
青稞社区.19 小时前
直播预告!面向几何与运动理解的流式前馈 3D/4D 重建
人工智能·3d