写了个开源小工具 Proxify,帮你统一管理、轻松调用各类大模型 API - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
LemonLeon
0.58D
V2EX    分享创造

写了个开源小工具 Proxify,帮你统一管理、轻松调用各类大模型 API

  •  
  •   LemonLeon 2025 年 10 月 22 日 2474 次点击
    这是一个创建于 123 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我是 Poixe AI 团队的技术负责人。花费近两周时间,我们将平台核心网关模块抽象出来,封装成了一个独立的、轻量的开源项目。

    GitHub 仓库:https://github.com/poixeai/proxify

    演示站点:https://proxify.poixe.com/

    home_zh_bg|690x459

    Proxify 是一个开源、轻量、可以自己部署的 AI 接口反向代理

    背景介绍

    场景 1

    在日常开发 AI 应用过程中,一些项目需要同时接入 OpenAI 、Claude ,偶尔还要测试一下 DeepSeek 或者 Gemini 。

    结果就是,代码里管理着一堆不同的 API_BASE_URLAPI_KEY ,每次切换或者新增服务,都得去改配置文件,还得小心翼翼地处理各种网络问题,尤其是那些“只可意会”的网络限制。

    配置一多,代码就显得乱七'八糟,维护起来也心累。我们就在想,有没有一种更优雅的方式?

    场景 2

    一些 AI 模型厂商提供的 API 针对流式响应,存在卡顿,不丝滑的情况,比如 Azure OpenAI 。

    要实现类似打字机的效果,往往需要在应用层(开发者)花费大量的时间精力来做优化,是否有现成的中间层来实现?

    找了一圈,市面上有一些大而全的网关,但感觉有点“杀鸡用牛刀”,而且配置复杂,资源占用严重。

    于是,我们做了一个决定:将我们自己平台的核心网关模块抽象出来,封装成一个独立的、轻量的开源项目,分享给整个社区。

    功能特性

    1. 统一化的接口,告别杂乱配置

    Proxify 的核心功能就是反向代理。你可以通过一个简单的 JSON 文件,集中管理所有上游 API 。

    routes.json 配置文件示例:

    { "routes": [ { "name": "OpenAI", "path": "/openai", "target": "https://api.openai.com" }, { "name": "Claude", "path": "/claude", "target": "https://api.anthropic.com" } ... ] } 

    配置好之后,你的代码调用方式会变得异常清爽:

    https://proxify.poixe.com 可替换为你部署的 Proxify 程序地址

    所有切换逻辑都在 Proxify 的配置里,你的业务代码无需任何改动。更棒的是,这个配置文件支持热加载 ,修改后无需重启服务,立刻生效。

    2. 平滑如丝的流式输出

    直接转发大模型的 SSE 流,部分 AI 模型厂商体验往往不佳,如 Azure 的成段吐字。我们在 Proxify 中内置了同 Poixe AI 网关的流式平滑输出模块

    它能做什么?

    你可以把它想象成一个智能缓冲区。当上游模型突然“爆发”式地吐出一大段文本时,Proxify 会先把它们接住,然后像打字机一样,以平滑、均匀的速度一点点地流式传输给客户端。提升了用户体验。

    同时,针对流式输出,内置了心跳保活机制,定时发送心跳,有效防止了因网络空闲导致的连接意外中断。

    3. 安全与隐私

    代码完全开源,逻辑透明可审计。可自由二次开发、私有化部署,避免供应商锁定。

    你可以把它部署在任何你自己的服务器上。所有请求数据只在你的客户端和你的服务器之间流转,不经过任何第三方,彻底杜绝隐私泄露的风险。

    部署过程也极其简单,我们提供了 Docker 镜像,只需准备好两个配置文件,一行命令即可启动。整个程序由 Golang 编写,性能高,资源占用低,0.5G 内存的小服务器也能跑起来。

    开始使用

    1. 确定目标服务

    浏览 Proxify 支持的 API 列表,找到您需要使用的服务及其对应的代理前缀。

    2. 替换基础 URL

    在您的代码中,将原始 API 的基础 URL 替换为 Proxify 的代理地址,并附加上一步中确定的服务前缀。

    # 原始地址: https://api.openai.com/v1/chat/completions # 替换为: http://proxify.poixe.com/openai/v1/chat/completions 

    3. 发送请求

    一切准备就绪。使用您原有的 API 密钥和请求参数,像往常一样发起请求即可,无需任何其他更改。

    您的 API 密钥、请求头( Header )和请求体( Body )等所有其他部分都保持不变。

    4. 代码示例

    # cURL example using /openai proxy endpoint curl https://proxify.poixe.com/openai/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer API_KEY" \ -d '{ "model": "gpt-5", "messages": [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Hello!"} ], "stream": false }' 
    // Node.js example using /openai proxy endpoint import OpenAI from "openai"; const openai = new OpenAI({ apiKey: "API_KEY", baseURL: "https://proxify.poixe.com/openai/v1", }); async function main() { const completion = await openai.chat.completions.create({ model: "gpt-5", messages: [ { role: "system", content: "You are a helpful assistant." }, { role: "user", content: "Hello!" } ], }); console.log(completion.choices[0].message.content); } main(); 

    部署教程

    本节仅展示通过 Docker 部署的方式,更多请参考官方 Github 仓库。

    1. 准备工作:配置环境与路由

    Proxify 项目已经内置了 .env.exampleroutes.json.example 示例文件。 您只需复制并稍作修改,即可快速启动。

    2. 开始部署:从 Docker Hub 拉取镜像

    在确认 .envroutes.json 均配置正确后,执行:

    # 1. 从 Docker Hb 拉取最新镜像 docker pull terobox/proxify:latest # 2. 查看镜像列表 docker images # 3. 运行容器,并挂载配置文件 docker run -d \ --name proxify \ -p 7777:7777 \ -v $(pwd)/routes.json:/app/routes.json \ -v $(pwd)/.env:/app/.env \ --restart=always \ poixeai/proxify:latest # 补充:查看日志 docker logs proxify -f # 补充:停止容器 docker stop proxify # 补充:删除容器 docker rm proxify 

    写在最后

    欢迎来 GitHub 仓库给我们一个 Star ,或者随时提出你的想法和建议!

    8 条回复    2025-10-27 18:39:02 +08:00
    xianwei7315
        1
    xianwei7315  
       2025 年 10 月 22 日
    一直在用你们的站,原来在这里宣传呀
    LemonLeon
        2
    LemonLeon  
    OP
       2025 年 10 月 22 日
    @xianwei7315 V2EX 质量很高,大家素质也高:)
    Pony996
        3
    Pony996  
       2025 年 10 月 22 日
    对话模型的中转平台意义不大了,newapi 已经占据了大部分市场了,而且没啥难度,现在缺做视频、音频、图片模型的统一平台,就连 newapi 对这方面都支持都不太好,这块市场太缺了,但是这块适配器来也是真的难,没有统一规范,且调用格式及其不统一,有的一个模型分好几种数据格式调用,谁能把这块做起来谁就是下一个 newapi
    LemonLeon
        4
    LemonLeon  
    OP
       2025 年 10 月 22 日
    @Pony996 是这样的,音频、视频的客户端产品也少。
    Pony996
        5
    Pony996  
       2025 年 10 月 26 日
    @LemonLeon 少就是因为对接太难,有解决方案我立马开干
    xuemian
        6
    xuemian  
       2025 年 10 月 27 日
    所以,是否可以理解在不配置防火墙级别的白名单情况下,会被公网滥用
    LemonLeon
        7
    LemonLeon  
    OP
       2025 年 10 月 27 日
    @xuemian 你注意到了。是的,现在没有鉴权的机制,后面来写一下。
    xuemian
        8
    xuemian  
       2025 年 10 月 27 日   1
    @LemonLeon 嗯,今天审计了一下代码,等你多完善点吧,哈哈 辛苦了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2275 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 04:07 PVG 12:07 LAX 20:07 JFK 23:07
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86