news 2026/4/16 14:14:34

用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/16 5:39:47

SIP.js终极指南:用Node.js构建实时通信系统的完整解决方案

在当今实时通信技术飞速发展的时代,SIP.js作为专为Node.js环境设计的轻量级SIP协议栈,为您提供了构建企业级语音通信系统的强大工具集。无论您是新手开发者还是经验丰富的工程师,这个基于RFC3261规范的开源库都能让您在JavaScript环境中快速集…

作者头像 李华
网站建设 2026/4/16 5:45:50

Qwen3-VL-8B实战解析PDF图表能力

Qwen3-VL-8B实战解析PDF图表能力:轻量级多模态模型的落地实践 在企业日常运营中,你是否也经历过这样的场景?财务同事发来一份50页的PDF财报,你需要从中找出“过去三年毛利率变化趋势”;客服团队每天收到上百张用户截图…

作者头像 李华
网站建设 2026/4/16 5:38:56

在算家云部署Linly-Talker数字人语音系统

在算家云部署 Linly-Talker 数字人语音系统 在虚拟主播、AI客服和在线教育日益普及的今天,如何快速构建一个能“说话”、会“表情”的数字人,成了不少开发者和内容创作者关心的问题。传统方案往往需要从零搭建环境,配置复杂的深度学习依赖&a…

作者头像 李华
网站建设 2026/4/16 5:39:47

Seed-Coder-8B-Base如何自动生成API实现代码

Seed-Coder-8B-Base如何自动生成API实现代码 在智能家居设备日益复杂的今天,确保无线连接的稳定性已成为一大设计挑战。蓝牙技术作为主流通信协议之一,其版本演进直接影响着用户体验——从早期音频传输断连频发,到如今支持多设备无缝切换&…

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

YOLO模型部署到云服务器完整流程

YOLO模型部署到云服务器完整流程 在智能制造工厂的质检线上,成千上万的产品正以每分钟数百件的速度通过视觉检测工位。传统人工目检早已无法满足这种高节奏、高精度的要求——而此时,云端运行的YOLO模型正在GPU集群中实时分析每一帧图像,毫秒…

作者头像 李华
网站建设 2026/4/16 5:38:41

WinMerge:开源免费的文本与文件对比合并神器

文章目录引言:为什么你需要文件对比工具?一、WinMerge简介二、功能介绍三、下载地址四、高效使用技巧五、WinMerge vs 其他工具六、总结引言:为什么你需要文件对比工具? 在日常编程、文档编写或数据管理工作中,你是否…

作者头像 李华