47、【Agent】【OpenCode】本地代理增强版分析(JSON解析)

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

背景

上篇 blog
【Agent】【OpenCode】本地代理增强(日志记录)

为了方便观测 OpenCode 和目标服务器的交互行为,对本地代理进行了日志记录,增强版在可观测性和错误处理做了显著增强,除了能将 OpenCode 客户端发往本地代理的请求透明转发到 DashScope 兼容接口,还可以记录完整请求和响应日志,并对比了和之前基础版的不同点,增强版的最大好处在于全链路可追溯,可以通过日志文件精确复现某次 AI 调用的输入输出,然后开始分析代码内容,首先是日志目录创建,确保日志目录存在,如果不存在就自动创建,下面继续分析

OpenCode

下面继续分析其中的语法点

  • fs.existsSync(LOG_DIR):同步检查 LOG_DIR 路径是否存在,检查目录是否存在
  • fs.mkdirSync(...):同步创建目录(会阻塞代码执行直到完成 ),其中 recursive : true 表示递归创建,意味着如果 logs 的父目录不存在,该命令也会自动一层层创建,避免因父目录缺失而报错,比如第一次运行程序时

这里的整体目的是确保 ./logs 目录一定存在,这样后续写日志文件时,就不会因为目录不存在而失败,这里面要注意的点是 exits 和 mkdir 操作都要加上 Sync,因为服务器启动阶段是初始化过程,初始化逻辑必须是确定性的,顺序执行的,必须确保目录创建完成之后才能开始监听请求,用同步方式逻辑更清晰、无竞态风险。

OK,接下来是解析请求内容,这里可以安全地解析 OpenCode 客户端发来的 JSON 请求内容,并为后续的日志记录准备一个结构化的日志对象,下面来详细分析下

  • 首先,OpenCode 客户端发送的是 HTTP POST 请求,body 是 JSON 格式,比如
javascript 复制代码
{
  "model": "qwen-flash",
  "messages": [{"role": "user", "content": "你好"}],
  "stream": false
}

但在网络传输中,body 是字符串变量,不是 JavaScript 对象,这里用 JSON.parse(body) 可以把字符串转换成 JS 对象,方便后续读取字段 ,比如 parsedBody.stream 就可以判断请求是否是流式传输

  • 另外,这里用了 try-catch,如果客户端发送的不是合法 JSON(比如格式错误,空 body,二进制数据等),JSON.parse() 会抛出异常,导致代理崩溃 ,所以必须捕获错误:console.error 打印错误日志,并通过 res 返回 HTTP 400 错误,并 return 提前退出,不再处理非法请求,这是防御性编程的标准做法

OK,接下来是创建日志条目 logEntry

这里各个变量的作用如下

  • timestamp = Data.now():当前时间戳(毫秒级别),用于唯一表示该次请求,并排序日志
  • request: parsedBody:已解析的请求内容(结构化数据,便于阅读)
  • response: null:占位符,等待 DashScope 返回后再填充
  • error: null:同样是占位符,如果代理过程中出错(比如网络失败),就记录错误信息

这里在请求处理函数中就创建变量 logEntry,是因为后续无论是成功收到 DashScope 响应,还是发生错误,都需要同一个日志对象来记录完整上下文,然后利用 JavaScript 闭包的特性,logEntry 会被后面的回调函数 proxyRes.on('end') 和 proxyReq.on('error') 所共享,最终生成的日志文件内容可能如下

javascript 复制代码
{
  "timestamp": 1712345678901,
  "request": { "model": "qwen-plus", "messages": [...] },
  "response": { "choices": [...] },
  "error": null
}

或出错(假设发生了异常)

javascript 复制代码
{
  "timestamp": 1712345678902,
  "request": { ... },
  "response": null,
  "error": "connect ETIMEDOUT ..."
}

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

相关推荐
深蓝AI3 小时前
英伟达换帅当天,我先跑了一遍 GPU 环境体检:版本矩阵比人事更值得盯
人工智能·gpu
罗西的思考5 小时前
【轻量化复刻大模型 / KIMI K3】AttnRes 模块交互式演示
人工智能·算法·机器学习
stormzhangV5 小时前
涨薪 50% 怎么做到的?
人工智能·面试·aigc
老金带你玩AI6 小时前
如何在5分钟之内创建Grok Bot的超级团队
人工智能
程序员cxuan6 小时前
离谱,AI 大佬顺手搓了个 YouTube ,而我顺手给他搓了个中文插件
人工智能·后端·程序员
zixu_star6 小时前
上下文工程:Prompt、记忆和上下文如何管理?
人工智能·prompt
ZONGYUAN-ROOT6 小时前
【3D仿真数据集】从“能生成”到“能用”:面向工业仿真的3D资产自治自愈流水线全链路落地
人工智能
深蓝AI7 小时前
Gemini Decisions API 来了:一次前向打分取代逐字解码,校准误差 0.0250 才是 agent 分支调用的真门槛
人工智能·后端
深蓝AI7 小时前
Meta 开源用了八年的设计系统 astryx:连坐两天 GitHub 总榜第一,组件库开始写给 agent 的说明书
前端·人工智能
量化分析码农8 小时前
股票API 日线、周线、月线与分钟级返回结构差异:一份统一解析代码
人工智能