news 2026/4/29 11:01:48

用Deepseek-v3.1在Trae中构建AI中继程序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用Deepseek-v3.1在Trae中构建AI中继程序

用 Deepseek-v3.1 在 Trae 中构建 AI 中继程序

在本地开发 AI 工具链时,你是否也遇到过这样的困境:明明国产大模型能力强大、响应迅速,但自家的 IDE 插件、自动化代码生成器却“认不出”它?不是报错Invalid API Key,就是卡在流式传输上动弹不得。问题不在于模型不行,而在于——生态协议不兼容

比如百度飞桨 AI Studio 星河社区提供的 ERNIE 大模型,虽然支持类 OpenAI 的 RESTful 接口(/v1/chat/completions),但它的认证逻辑和参数处理方式与标准openai>=1.0客户端存在微妙差异。很多工具如 auto-coder、moonpilot 或 VS Code 插件依赖严格的 header 校验、SSE 流控机制,稍有不符就会中断连接。

更麻烦的是,这些工具通常不允许自定义 CA 证书或跳过 HTTPS 验证,导致本地代理难以介入。

于是,我尝试了一种“轻量破局”方案:借助Trae + Deepseek-v3.1,让 AI 自己写一个中继网关,把“说不同语言”的两方拉到同一个频道上来。

整个过程令人惊讶地顺畅——从需求描述到可运行服务,仅用几分钟,且几乎无需手动调试。最终成果是一个基于 FastAPI 的本地代理层,能将任何符合 OpenAI 规范的请求无缝转发至星河社区的大模型接口,并自动完成密钥注入、格式转换与流式适配。


这个中继服务的核心价值,其实不在“转发”,而在“翻译”。

我们来看几个典型痛点:

  • 星河 API 不验证客户端传入的Authorization: Bearer xxx,但大多数 openai 客户端会强制发送;
  • 某些字段如stream_options被识别为非法参数,低版本 SDK 直接抛异常;
  • 模型名映射混乱,gpt-3.5-turbo应该对应哪个 ERNIE 版本?
  • SSE 响应头缺失text/event-stream类型,前端接收失败。

如果每个项目都去改插件源码,成本太高。不如建一层统一出口:所有请求先打到本地中继,由它来处理兼容性问题。

这就像给老房子装了个智能网关——不用拆墙换线,也能接入现代智能家居系统。


所用模型部署于飞桨 AI Studio 星河社区,例如ERNIE-4.5-21B-A3B-Paddle,基于 PaddlePaddle 框架训练,在中文理解、代码生成、文档摘要等任务上表现优异。PaddlePaddle 作为国产全场景深度学习平台,不仅提供动态图编程体验,还拥有 PaddleOCR、PaddleDetection、PaddleNLP 等工业级工具库,非常适合企业级落地。

而我们的目标很明确:让这些高性能模型,能像调用 GPT 一样简单地集成进现有工作流。


在 Trae 编辑器中输入提示词:

“请帮我写一个 FastAPI 实现的 AI 中继服务,将标准 OpenAI 格式的/v1/chat/completions请求转发到百度星河社区的大模型 API。要求支持 JSON 和 SSE 流式响应,自动注入 API Key,并允许 CORS。”

几秒后,Deepseek-v3.1 输出了完整代码。稍作调整后如下:

中继程序代码(main.py)

from fastapi import FastAPI, Request, HTTPException from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import StreamingResponse import httpx import os app = FastAPI(title="PaddlePaddle 星河大模型中继服务", version="1.0.0") # 允许跨域请求(便于前端工具调用) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 从环境变量读取星河 API 配置(安全起见不要硬编码) XINGHE_BASE_URL = os.getenv("XINGHE_BASE_URL", "https://api-r9z6e7xbe854gbi0.aistudio-app.com/v1") XINGHE_API_KEY = os.getenv("XINGHE_API_KEY", "") if not XINGHE_API_KEY: raise RuntimeError("请设置环境变量 XINGHE_API_KEY") @app.post("/v1/chat/completions") async def proxy_chat_completions(request: Request): try: # 1. 解析客户端发来的 OpenAI 格式请求 data = await request.json() messages = data.get("messages") if not messages: raise HTTPException(status_code=400, detail="Missing 'messages' in request body") # 提取关键参数 model = data.get("model", "default") temperature = data.get("temperature", 0.7) stream = data.get("stream", False) # 构造符合星河 API 的 payload payload = { "model": model, "messages": [ {"role": msg["role"], "content": msg["content"]} for msg in messages ], "temperature": temperature, "stream": stream } # 2. 向星河社区发起异步请求 async with httpx.AsyncClient(timeout=30.0) as client: response = await client.post( f"{XINGHE_BASE_URL}/chat/completions", headers={ "Content-Type": "application/json", "Authorization": f"Bearer {XINGHE_API_KEY}" }, json=payload ) # 3. 处理返回结果 if response.status_code != 200: raise HTTPException( status_code=response.status_code, detail=f"Upstream error: {response.text}" ) if stream: # 流式响应:直接转发 SSE 数据流 return StreamingResponse( response.aiter_bytes(), media_type="text/event-stream", headers={ "Cache-Control": "no-cache", "Connection": "keep-alive" } ) else: # 非流式:返回 JSON 响应 return response.json() except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @app.get("/") async def index(): return { "service": "PaddlePaddle 星河大模型中继", "status": "running", "endpoint": "/v1/chat/completions", "docs": "/docs" } @app.get("/health") async def health_check(): return {"status": "healthy"} # 启动命令:uvicorn main:app --host 0.0.0.0 --port 8000 if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)

这段代码有几个关键设计点值得强调:

  • 使用httpx.AsyncClient实现非阻塞转发,避免高并发下线程堆积;
  • stream=True的请求,直接通过StreamingResponse转发字节流,保持低延迟;
  • 所有敏感配置均来自环境变量,防止密钥意外提交至 Git;
  • 添加健康检查端点/health,方便容器化部署时做探针检测。

特别值得一提的是,星河 API 返回的 SSE 数据结构与 OpenAI 几乎一致,因此无需逐条解析再重组 event stream,极大简化了实现复杂度。


快速部署步骤

1. 保存文件

将上述代码保存为main.py

2. 安装依赖

pip install fastapi uvicorn httpx python-multipart

注意:不需要安装openai包,除非你要做客户端测试。

3. 设置环境变量

Linux/macOS:

export XINGHE_API_KEY="your_actual_api_key_here" export XINGHE_BASE_URL="https://api-r9z6e7xbe854gbi0.aistudio-app.com/v1"

Windows(CMD):

set XINGHE_API_KEY=your_actual_api_key_here set XINGHE_BASE_URL=https://api-r9z6e7xbe854gbi0.aistudio-app.com/v1

API Key 可在 飞桨 AI Studio 的模型部署页面获取。

4. 启动服务

uvicorn main:app --host 0.0.0.0 --port 8000 --reload

启动后访问http://localhost:8000/docs,即可看到自动生成的交互式文档界面,支持在线测试。


接口测试验证

非流式请求测试(curl)

curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ -d '{ "model": "default", "messages": [ {"role": "user", "content": "你好,请用中文写一首关于秋天的诗"} ], "temperature": 0.8, "stream": false }'

预期输出示例:

{ "id": "log-xxxxx", "object": "chat.completion", "created": 1712345678, "model": "default", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "秋风起兮白云飞,草木黄落兮雁南归...\n金菊绽放香满园,枫叶如火映山川。" }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 25, "completion_tokens": 38, "total_tokens": 63 } }

说明:中继已成功完成请求转换并返回完整响应。

流式请求测试(SSE)

curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ -d '{ "model": "default", "messages": [ {"role": "user", "content": "介绍一下 PaddlePaddle 的特点"} ], "stream": true }'

你会看到类似以下输出:

data: {"id":"...","choices":[{"delta":{"content":"PaddlePaddle"}}]} data: {"id":"...","choices":[{"delta":{"content":"是"}}]} data: {"id":"...","choices":[{"delta":{"content":"百度"}}]} ... data: [DONE]

这表明流式传输完全正常,适用于需要实时反馈的场景,如代码补全、对话机器人等。


使用 OpenAI 客户端测试(Python)

为了验证与主流工具链的兼容性,使用官方openai客户端进行测试:

pip install openai -U # 建议 >= 1.10

测试脚本(test_client.py)

from openai import OpenAI # 指向本地中继服务 client = OpenAI( api_key="any_key", # 中继会忽略此值 base_url="http://localhost:8000/v1" ) def test_completion(): print("👉 发起非流式请求...") resp = client.chat.completions.create( model="default", messages=[{"role": "user", "content": "什么是 PaddleOCR?"}], temperature=0.6, stream=False ) print(f"✅ 模型回复:\n{resp.choices[0].message.content}") print(f"📊 使用统计: {resp.usage}") def test_streaming(): print("\n👉 发起流式请求...") stream = client.chat.completions.create( model="default", messages=[{"role": "user", "content": "简述飞桨的三大优势"}], stream=True ) print("🔄 实时输出:") for chunk in stream: if content := chunk.choices[0].delta.content: print(content, end="", flush=True) print("\n✅ 流式响应结束") if __name__ == "__main__": test_completion() test_streaming()

运行结果表明:无论是普通请求还是流式响应,行为与调用原生 OpenAI 接口几乎无异。

这意味着,几乎所有基于openaiSDK 的工具(LangChain、LlamaIndex、AutoGen 等)都可以零改造接入。


与 auto-coder 集成实战

auto-coder 是当前热门的 LLM 辅助编程工具,支持多模型切换。我们来实测其与中继服务的协同效果。

步骤 1:启动 auto-coder

auto-coder chat

步骤 2:添加中继模型配置

/models /add_model name=paddle_proxy model_name=default base_url=http://127.0.0.1:8000/v1 /models /add paddle_proxy dummy_key /conf model:paddle_proxy

注:此处dummy_key可为任意字符串,因为中继服务会使用预设的真实密钥。

步骤 3:开始对话

输入指令:

请帮我写一个 Python 函数,使用 PaddleNLP 实现情感分析。

auto-coder 成功调用中继服务,返回了一段结构清晰、语法正确的代码片段,并附带使用说明。整个过程流畅自然,用户完全感知不到背后经过了一层代理。

这正是我们想要的效果:能力透明化接入,开发无感化升级


进阶优化方向

当前中继已可用,但若用于生产环境,建议增加以下功能:

功能实现思路
请求日志记录使用中间件记录 input/output、耗时、token 数,便于排查问题
速率限制引入slowapi或 Redis 实现 per-IP 限流,防滥用
多模型路由根据model字段转发至不同后端(如通义千问、GLM、百川)
缓存机制对确定性请求启用 Redis 缓存,降低重复调用成本
监控面板集成 Prometheus + Grafana 展示 QPS、延迟、错误率

例如,添加一个简单的日志中间件:

from datetime import datetime @app.middleware("http") async def log_requests(request: Request, call_next): start = datetime.now() response = await call_next(request) duration = (datetime.now() - start).total_seconds() print(f"[{start}] {request.method} {request.url.path} → {response.status_code} ({duration:.2f}s)") return response

这类扩展非常灵活,可根据团队实际需求逐步叠加,不必一开始就追求大而全。


这种基于 AI 自动生成的轻量中继架构,本质上是一种“协议翻译器”,正在成为连接开放生态与私有平台的重要桥梁。

它不仅解决了当下工具链兼容性的问题,更为未来的技术演进留足空间——比如多模型 A/B 测试、成本最优调度、私有模型与公有云混合编排等。

更重要的是,整个服务由 Deepseek-v3.1 在 Trae 中自主生成并验证,展示了新一代 AI 编程助手的强大潜力:它们不仅能写函数、修 Bug,还能帮你搭建基础设施。

当你发现某个工具“不支持某模型”时,不妨试试让它自己写个适配层。有时候,最高效的解决方案,就是让 AI 来解决 AI 的问题。

💡 小贴士:如果你也在使用其他国产模型(如通义、GLM、百川),只需更改XINGHE_BASE_URL和认证方式,即可复用本模板,快速实现统一接入。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/26 23:18:26

人活着得意义是什么

今天看到一段话,感觉特别有意思,分享给大家:人生其实就是一场骗局,最主要的任务根本不是买房买车,也不是即时行乐,这其实是欲望,不是真相。”人生就是一个梦,虚无缥缈并不真实。我们…

作者头像 李华
网站建设 2026/4/21 6:21:12

Docker安装TensorRT时启用SELinux安全策略

Docker部署TensorRT时的SELinux安全策略实践 在金融、医疗和政务等对安全性要求严苛的行业,AI推理系统不仅要跑得快,更要运行得稳、守得住。一个常见的矛盾场景是:我们希望用NVIDIA TensorRT将模型推理延迟压到毫秒级,同时又不能牺…

作者头像 李华
网站建设 2026/4/28 9:41:39

TensorFlow-GPU安装全指南:避坑与版本匹配

TensorFlow-GPU 安装实战指南:从踩坑到点亮 GPU 在深度学习的世界里,没有比“ImportError: DLL load failed”更让人崩溃的报错了。尤其是当你满怀期待地运行 tf.config.list_physical_devices(GPU),结果返回一个空列表时——那种无力感&…

作者头像 李华
网站建设 2026/4/21 19:36:23

TensorRT-8显式量化实践与优化详解

TensorRT-8 显式量化实践与优化详解 在现代深度学习部署中,性能和精度的平衡已成为工程落地的关键挑战。尤其是在边缘设备或高并发服务场景下,INT8 量化几乎成了推理加速的“标配”。然而,传统基于校准(PTQ)的方式常因…

作者头像 李华
网站建设 2026/4/27 21:03:26

PyTorch Lightning整合YOLO训练流程

PyTorch Lightning整合YOLO训练流程 在工业视觉系统日益智能化的今天,目标检测模型不仅要跑得快、测得准,更要“训得稳、调得顺”。尤其是在智能制造、自动驾驶等高实时性场景中,开发者面临的挑战早已从“能不能检出目标”转向了“如何高效迭…

作者头像 李华
网站建设 2026/4/20 13:29:56

使用 Docker Compose 部署 LobeChat 服务端

使用 Docker Compose 部署 LobeChat 服务端 在当前 AI 应用快速普及的背景下,越来越多开发者和企业希望拥有一个可私有化部署、安全可控的智能对话平台。LobeChat 正是这样一个现代化的开源解决方案——它基于 Next.js 构建,界面优雅、功能丰富&#xf…

作者头像 李华