37、【Agent】【OpenCode】本地代理分析(一)
【声明】本博客所有内容均为个人业余时间创作所述技术案例均来自公开开源项目如GithubApache基金会不涉及任何企业机密或未公开技术如有侵权请联系删除背景上篇 blog【Agent】【OpenCode】本地代理JavaScript 脚本详细分析了选择了 JavaScirpt 脚本作为本地代理是基于开发效率生态适配和使用场景的综合考虑比如 JavaScript 与前端IDE 插件生态天然契合JSON 处理极其简单然后解释了JSON.parse()得到的是 JS 对象不能直接用于 HTTP 传输需要先将 JS 对象转成字符串此外还有异步 IO 高效处理流式响应零依赖快速启动等好处所以对于临时调试JS 是最轻量的选择然后列举了下不适合 JavaScript 的场景提到所有主流语言都能实现本地代理选择取决于开发者的熟悉度和需求没有最好的语言只有最合适当前场景的工具下面继续分析OpenCodeOK下面来分析这个本地代理的实现// dashscope-proxy.jsconsthttprequire(http);consthttpsrequire(https);constserverhttp.createServer((req,res){console.log( Received${req.method}${req.url});if(req.methodPOSTreq.url/v1/chat/completions){letbody;req.on(data,chunkbodychunk);req.on(end,(){// 从原始请求中获取 Authorization 头constauthHeaderreq.headers[authorization]||;constoptions{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)}};constproxyReqhttps.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);});该本地 HTTP 代理服务器可以接收来自 OpenCode或其他兼容 OpenAI API 的客户端不仅仅是 OpenCode的请求并将请求转发给阿里云 DashScope 的 API 兼容接口首先是代理的整体结构consthttprequire(http);consthttpsrequire(https);constserverhttp.createServer((req,res){// 处理每个进来的 HTTP 请求});server.listen(2048);// 假设监听在 127.0.0.1:2048这里使用 Node.js 内置模块 http 创建一个本地 HTTP 服务器该服务器监听本地的2048端口所有发往http://127.0.0.1:2048的请求都会进入这个回调函数进入服务器后首先打印记录日志console.log( Received${req.method}${req.url});该日志会打印收到的请求方法比如POST和请求路径比如/v1/chat/completions然后这里只处理特定请求if(req.methodPOSTreq.url/v1/chat/completions){// 处理特定请求}这里只处理 OpenAI 风格的聊天请求该条件/v1/chat/completions是 OpenCode 默认发送的 endpoint其他请求比如/v1/models可以忽略这里提到了 OpenAI 风格和 endpoint它们都是现代 AI 开发的核心概念下面详细解释下首先是 Endpoint端点Endpoint 是模型 API 提供服务的具体 URL 地址客户端通过 endpoint 向服务器发送请求可以类比成餐厅的点菜单餐厅 模型 API 服务商比如 OpenAIDashScope菜单上的每道菜 一个 endpoint用户想点宫保鸡丁就得告诉服务员点这道/menu/kungpao-chicken从技术角度Endpoint 是 HTTP 请求的目标路径URL Path这个路径决定了服务器执行什么操作常见的模型 API Endpoints 如下功能OpenAI EndoiubtDashScope 兼容模型 Endpoint聊天对话POST/v1/chat/completionsPOST/compatible-mode/v1/chat/completions获取模型列表GET/v1/modelsGET/compatible-mode/v1/models文本嵌入POST/v1/embeddingsPOST/compatible-mode/v1/embeddings所以这里的判断条件/v1/chat/completions就是一个 endpoint是专门用于发起聊天请求的入口地址OK然后是 OpenAI 风格是指遵循 OpenAI API 的请求格式相应格式和 endpoint 设计规范的一套标准由于由于 OpenAI 的 API 设计简洁很流行许多其他厂商如阿里云 DashScopeGoogleGeminiOllamaLlama.cpp 等都提供了兼容 OpenAI API 的接口让开发者无需该代码就能切换后端OK本篇先到这里如有疑问欢迎评论区留言讨论祝各位功力大涨技术更上一层楼更多内容见下篇 blog【Agent】【OpenCode】本地代理分析二
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2486396.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!