API网关
一般我们使用AI的时候,需要一个API地址,和一个API KEY,然后才能使用AI的API服务.那么New API就是负责创建并管理各种AI渠道和API KEY的发放,以及额度控制和用户管理的.使用New API的好处之一就是,比如我们使用很多的AI官方服务,比如DeepSeek, OpenAI, Grok, Google Gemini等,如果没有这种整合,那么我就需要在每个用来聊天的AI客户端里,依次添加每个渠道的API地址和API KEY,太麻烦了.那么我们就可以把这些渠道整合在New API里,对外只需要一个域名,一个Key,就可以直接访问这些所有的渠道,非常方便.并且也不用担心KEY的泄露,毕竟不是你的官Key泄露,只需要在New API里删除重新创建一个就行了,而且有完善的日志管理和额度控制,有可疑的地方,翻一翻也能找出问题在哪.还有个好处就是,只要你搭建New API的服务器能正常访问ChatGPT, Claude等,你又能正常访问你的New API这台服务器,那么等于你不用dai--li也能正常访问ChatGPT, Claude.不会暴露你的本机IP.并且New API也可以配置访问dai--li,用配置的dai--li(比如WARP)来访问这些官方的API服务,非常地隐私友好.
mcp
MCP全称Model Context Protocol,模型上下文协议,简单理解就是你可以使用它来获取需要让AI知道的内容,然后喂给AI.比如时间MCP,它会获取本机的时间,然后将返回结果的JSON喂给AI,AI就知道现在是什么时候了,从而给出更符合当前情境的答案.有很多实用的MCP服务器都是stdio类型的,需要在本机运行.但是有一些MCP比如代码运行之类的工具,在本机运行的话可能有风险(比如跑了个删除文件的代码给你电脑文件删了).还有就是如果手机端要用,基本上stdio类的MCP是用不了的,一般只能用SSE或者Streamable HTTP类型的,可以理解为MCP在远程服务器运行,你只需要调用它提供的SSE或者Streamable HTTP的API
key轮循
API KEY的轮询项目(可选),用途是有大量的API KEY的时候,可以轮询使用,用完1次下次就换下1个KEY,避免频率限制等问题(主要是针对大量的,免费的Gemini KEY).因我不喜欢用New API自带的轮询,我喜欢用GPT-Load


简单介绍完,那么就开始搭建步骤
New API:
新建一个new-api目录
- mkdir new-api && cd new-api
复制代码 配置环境变量(文本编辑工具爱用哪个用哪个,我喜欢用nano)
输入以下内容(自己用SQLite就够了,MYSQL等数据库可以去参照官方文档部署)
- REDIS_CONN_STRING=redis://new-api-redis
- MEMORY_CACHE_ENABLED=true
- TZ=Asia/Shanghai
- ERROR_LOG_ENABLED=true
复制代码 创建docker-compose.yml文件
输入以下内容,这里映射的端口是用来SSH隧道访问演示用的,实际使用是和Cloudflared容器组一个自定义网络,然后直接通过CF Tunnel后台配置的域名访问New API容器的,其他容器也如此.你可以自行换成其他方式,比如映射到宿主机端口,或者用nginx容器反代也行.
- name: new-api
- services:
- new-api:
- image: calciumion/new-api:latest
- container_name: new-api
- restart: unless-stopped
- env_file:
- - .env
- command: --log-dir /app/logs
- volumes:
- - ./data:/data
- - ./logs:/app/logs
- depends_on:
- new-api-redis:
- condition: service_healthy
- healthcheck:
- test: ["CMD-SHELL", "wget -q -O - http://localhost:3000/api/status | grep -o '"success":\\s*true' | awk -F: '{print $$2}'"]
- interval: 30s
- timeout: 10s
- retries: 3
- networks:
- internal:
- cf_tunnel:
- ipv4_address: 192.168.0.2
- expose:
- - 3000
- ports: # 用于SSH隧道访问,可以创建完管理员账号以后删除
- - 127.0.0.1:3000:3000 # 用于SSH隧道访问,可以创建完管理员账号以后删除
- new-api-redis:
- image: redis:alpine
- container_name: new-api-redis
- restart: unless-stopped
- healthcheck:
- test: ["CMD", "redis-cli", "ping"]
- interval: 10s
- timeout: 5s
- retries: 3
- networks:
- - internal
- networks:
- internal:
- internal: true
- cf_tunnel:
- external: true
复制代码 创建自定义网络(用来和Cloudflared容器共享网络,走Cloudflare Tunnel从公网访问)
- docker network create --driver bridge --subnet 192.168.0.0/24 --gateway 192.168.0.254 --ipv6 cf_tunnel
复制代码运行容器 查看日志是否正常运行
- ssh -N -L 127.0.0.1:3000:127.0.0.1:3000 -p <port_number> <user>@<your_vps_ip>
复制代码 我们前面在compose配置文件里已经做好了数据持久化,所以下一步

输入完账号密码,下一步

选择自用模式,下一步

最后一步,点初始化系统

我们点击右上角的登录,用刚才注册的管理员账号登录

先点进系统设置,把新用户注册关了(没配置邮箱貌似没问题,因为根本没有邮件服务,所以注册不了,但是怕后面忘了,好习惯,有需要自己再开)
 
然后我们去添加一个AI渠道,这里演示是DeepSeek

类型选DeepSeek,输入你喜欢的渠道名称,官方的API KEY,下面模型那里如果没显示模型,就点下获取模型列表,然后添加.没问题我们就点提交
 
测试下渠道看看是否有效

然后我们创建一个API KEY,准备开始跟AI聊天

额度,过期时间,用户组什么的随便设置.(顺便提一嘴,你可以用用户分组控制来实现不同分组的用户,允许或限制访问指定的模型,或者不同的倍率,这里就不多说了,可以自己了解下.这里演示默认是default分组,添加的渠道也是默认default分组,所以不需要额外设置)

打开AI聊天客户端,这里演示用Cherry Studio.添加一个提供商

输入你喜欢易记的名称

输入好API地址和API KEY后点击管理(这里因为是SSH隧道转发到本地的,所以这里填的是http://127.0.0.1:3000,后面用Cloudflare Tunnel可以配置域名从公网访问)

添加所有模型
 
新建一个AI助手,点左边的模型设置,再点右上角的模型选择,选择我们刚才添加的模型
   
到这里恭喜你,你有了属于自己的AI API网关

MCP网关
我推荐使用ptbsare大佬的mcp-proxy-server项目
可以聚合MCP服务器,把Stdio, SSE, Streamable HTTP类型的MCP全部集合在这个容器里运行,然后统一对外提供SSE或者Streamable HTTP接口来调用,现在的桌面端AI聊天客户端一般都支持SSE和Streamable HTTP的.手机端的话只有少部分支持Streamable HTTP(比如RikkaHub)
那么开始部署
创建mcp-proxy-server文件夹
- mkdir mcp-proxy-server && cd mcp-proxy-server
复制代码 配置环境变量
输入以下内容:
- PORT=8080
- ALLOWED_KEYS=<建议用长一点的密码,最好不要带$>
- ENABLE_ADMIN_UI=false
- ADMIN_USERNAME=username
- ADMIN_PASSWORD=<建议用长一点的密码,最好不要带$>
- SESSION_SECRET=<建议用长一点的密码,最好不要带$>
- RETRY_SSE_TOOL_CALL=true
- SSE_TOOL_CALL_MAX_RETRIES=4
- SSE_TOOL_CALL_RETRY_DELAY_BASE_MS=300
- RETRY_HTTP_TOOL_CALL=true
- HTTP_TOOL_CALL_MAX_RETRIES=4
- HTTP_TOOL_CALL_RETRY_DELAY_BASE_MS=500
- RETRY_STDIO_TOOL_CALL=true
- STDIO_TOOL_CALL_MAX_RETRIES=5
- STDIO_TOOL_CALL_RETRY_DELAY_BASE_MS=1000
复制代码 输入以下内容:
- {
- "mcpServers": {
- "time": {
- "type": "stdio",
- "name": "Time",
- "active": true,
- "command": "uvx",
- "args": [
- "mcp-server-time",
- "--local-timezone=Asia/Shanghai"
- ]
- }
- }
- }
复制代码 运行容器:
查看运行日志,容器是否正常运行
- docker logs -f mcp-proxy-server
复制代码
开启SSH隧道转发
- ssh -N -L 127.0.0.1:3001:127.0.0.1:3001 -p <port_number> <user>@<your_vps_ip>
复制代码 继续转到Cherry Studio,添加一个MCP服务器

名称随意,类型选择Streamable HTTP, URL填 http://127.0.0.1:3001/mcp ,还是一样,可以从Cloudflare Tunnel配置域名从公网访问.
请求头我们填写X-Api-Key=sk-test,也就是你在环境变量里设置的ALLOWED_KEYS

保存并启用以后,可以看到MCP服务器版本号亮了,并且可用工具的数量也更新了.

实际体验一下,先给AI启用对应的MCP服务器

非常完美,AI终于有了获取当前真实世界时间的能力!
KEY轮询
一般来说,个人用没有这么多KEY,所以一般来说是用不到,但是因为之前别的站流行打野,基本上人手都是几千上万的Gemini KEY,这个项目可以添加海量KEY并轮询,性能非常高,占用特别低,而且我也不喜欢New API自带的轮询(一开始还有BUG,后面慢慢完善了),所以后端我一般就用这个项目
开始部署:
创建gpt-load文件夹
- mkdir gpt-load && cd gpt-load
复制代码配置环境变量
- PORT=3000
- HOST=0.0.0.0
- SERVER_READ_TIMEOUT=60
- SERVER_WRITE_TIMEOUT=600
- SERVER_IDLE_TIMEOUT=120
- SERVER_GRACEFUL_SHUTDOWN_TIMEOUT=10
- IS_SLAVE=false
- TZ=Asia/Shanghai
- AUTH_KEY=sk-test
- REDIS_DSN=redis://gpt-load-redis:6379/0
- MAX_CONCURRENT_REQUESTS=99
- ENCRYPTION_KEY=encrypt_password
- #如果有需要可以自己设置代理,通过代理来访问API
- #HTTP_PROXY=socks5://192.168.1.1:1080
- #HTTPS_PROXY=socks5://192.168.1.1:1080
复制代码创建docker-compose.yml
- name: gpt-load
- services:
- gpt-load:
- image: ghcr.io/tbphp/gpt-load:latest
- container_name: gpt-load
- restart: unless-stopped
- env_file:
- - .env
- volumes:
- - ./data:/app/data
- healthcheck:
- test: wget -q --spider -T 10 -O /dev/null http://localhost:${PORT:-3001}/health
- interval: 30s
- timeout: 10s
- retries: 3
- start_period: 40s
- depends_on:
- gpt-load-redis:
- condition: service_healthy
- restart: true
- networks:
- internal:
- cf_tunnel:
- ipv4_address: 192.168.0.4
- expose:
- - 3000
- ports:
- - 127.0.0.1:3002:3000 # 我这里为了演示就不创建域名了,就用SSH隧道演示下
- gpt-load-redis:
- image: redis:latest
- container_name: gpt-load-redis
- restart: unless-stopped
- healthcheck:
- test: ["CMD", "redis-cli", "ping"]
- interval: 5s
- timeout: 3s
- retries: 3
- networks:
- - internal
- networks:
- internal:
- internal: true
- cf_tunnel:
- external: true
复制代码 启动容器
查看日志,观察容器是否正常运行

开启SSH隧道转发
- ssh -N -L 127.0.0.1:3002:127.0.0.1:3002 -p <port_number> <user>@<your_vps_ip>
复制代码 浏览器访问 http://127.0.0.1:3002 登录后台,密钥就是环境变量里设置的AUTH_KEY

这里会有很多警告,因为我这里演示密码设置的很短很不安全,所以你们实际部署的时候,需要设置比较复杂的密码,推荐64位以上数字加字母大小写,符号也可以,但是docker环境变量的话$是保留字符,所以如果你需要表示$本身的话就需要2个$$来转义,所以之前密码我才不建议带$.

添加一个组

因为演示,我就只添加了DeepSeek官方渠道,实际使用你可以添加任意的OpenAI兼容渠道,Gemini兼容渠道和Anthropic兼容渠道.这里点生成按钮可以生成任意数量的密钥,因为一般是用作New-API的后端,所以生成1个就行了.

给渠道添加任意数量的KEY

测试一下渠道是否有效

那么如何搭配New-API使用呢,因为这2个容器是在同一个网络(cf_tunnel)中的,所以可以在New-API里添加一个渠道,类型选OpenAI, API地址就填http://192.168.0.4:3000/proxy/deepseek ,这里192.168.0.4是GPT-Load容器的IP, 3000是端口, /proxy是固定路径, /deepseek是刚才我们创建分组时填写的名称.所以对外提供服务的链接就是http://192.168.0.4:3000/proxy/deepseek.
模型列表里默认会存在大量OpenAI的模型,我们先点击清除,再点击获取

勾选渠道包含的模型,然后确定
 
测试一下是否有问题

至此API网关+MCP网关+Key轮询就部署完毕了.但是因为这里为了方便,所以用的是SSH隧道的方式访问,下面再讲一下配合Cloudflared(Cloudflare Tunnel)容器实现公网访问.但是需要你自己有域名,并且已经托管到CF

先登录到Cloudflare控制面板,找到Zero Trust

然后 网络 -> Tunnels,创建一个新隧道

类型选Cloudflared

输入你喜欢的隧道名称,然后创建

并不需要安装什么,我们只需要他的密钥,我们点击复制按钮复制安装命令,找个文本编辑器比如VS Code,然后把install后面开始的密钥记录下来,后面要用.

创建cloudflared文件夹
- mkdir cloudflared && cd cloudflared
复制代码
配置环境变量
输入以下内容:
- CLOUDFLARED_TOKEN=<你刚才复制并提取的密钥,ey开头的>
复制代码
编辑docker-compose.yml
输入以下内容:
- <div>services:
- cloudflared:
- image: cloudflare/cloudflared:latest
- container_name: cloudflared
- restart: unless-stopped
- env_file:
- - .env
- command: tunnel --no-autoupdate run --token ${CLOUDFLARED_TOKEN}
- networks:
- cf_tunnel:
- ipv4_address: 192.168.0.1
- networks:
- cf_tunnel:
- external: true</div>
复制代码
拉起容器
观察容器运行日志,判断容器是否正常运行
- docker logs -f cloudflared
复制代码
我们回到Cloudflare控制台,点击我们刚才创建的隧道,然后点击编辑

切到已发布应用程序路由标签,然后我们添加一个应用程序路由

子域名看你自己喜好填写,域名选择你托管的域名,类型HTTP,URL填写New API容器的IP地址和端口

mcp-proxy-server也一样

配置以后可能因为DNS同步的关系,你本地不一定能立即访问,几秒钟到几个小时都是正常的.
确定解析生效了以后我们就可以去Cherry Studio里,将之前演示用的SSH隧道的本地地址,换成域名从公网访问了.
OK,大功告成!至此你已经拥有了属于自己的API网关,MCP网关.你可以把大量的渠道添加进New API或者GPT-Load,然后对外统一一个URL和KEY来访问,喜欢的MCP服务器也可以全部放进mcp-proxy-server这个容器里运行,你的任何AI聊天客户端都只需要访问mcp-proxy-server提供的SSE或者Stremable HTTP接口即可,All in One!而且SSE和Stremable HTTP接口是同时提供,不是只能用一个,你2个同时用都行.避免了很多手机端的AI聊天客户端只支持SSE的尴尬场面,因为有的MCP网关只支持Streamable HTTP.
|
kingkare
05-24 18:01
投入 10 金币 创建存钱罐
玩法规则
添金
80% 概率
1 - 10 金币
扣除用户积分
结算规则
7天无回复自动关闭,关闭后余额随机分配给参与回帖的用户
|