Skip to content

Repository files navigation

中文 | English

RingRouter

✦ 一个网关,所有供应商 —— 多协议进、多渠道出、故障自愈的 LLM API 网关 ✦

licensegoreactdocker

功能 · 快速开始 · 环境变量 · 使用方法 · 与 one-api 的差异 · 开发

Note

本项目为自部署网关,使用者须遵循各上游供应商的服务条款与所在地区法律法规。

功能

协议层

  • 四种入站协议,任意进、任意出(统一中间格式互转):OpenAI Chat Completions / OpenAI Responses / Anthropic Messages / Google Gemini generateContent
  • 流式(SSE)与非流式均支持;同协议流式原样透传,跨协议自动翻译
  • GET /v1/models 跨渠道聚合模型列表

路由层

  • 多渠道:按模型匹配 → 优先级排序 → 逐个故障转移
  • 渠道密钥 AES-GCM 加密落库,管理界面永不回显
  • 模型映射(客户端模型名 → 上游模型名,JSON 配置)
  • 渠道缓存:进程内 30s 快照;可选 Redis 共享快照(跨实例一致,写后即失效)

用户与计费

  • 分组:name / uuid / metadata / ratio(计费倍率),渠道可属多个分组(逗号分隔),改名自动级联
  • 计划与订阅:计划绑定配额+分组+周期,分配即生效;订阅快照式记录,惰性过期
  • API 密钥(sk-rr- 前缀):创建时一次性展示,此后仅掩码
  • 请求日志:模型 / token 数 / 耗时 / 渠道 / IP 异步落库,个人与管理员双视角查询

认证

  • 用户名+密码登录,邮箱验证码重置密码(60s 冷却、5 次尝试上限、单次使用)
  • 通行密钥(WebAuthn / Passkey):免密登录、设备内注册、discoverable 流程
  • Cloudflare Turnstile 人机验证(可选)
  • 管理密钥(ADMIN_KEY)可直接换取管理会话

管理面

  • 4 步安装向导(站点信息 → SMTP → 通行密钥 → 使用模式)
  • 渠道 / 用户 / 分组 / 计划 / 订阅 / 模型目录 / 日志 / 系统设置全功能管理页
  • 公开模型广场(/models):无需登录浏览可用模型与分组倍率
  • Playground:内置流式对话调试
  • 中 / 繁(台 / 港) / 英四语言,深色模式,单二进制部署(前端嵌入)

暂未实现(欢迎 PR):负载均衡随机分流、兑换码、邀请奖励、OAuth2 登录

快速开始

Docker Compose(推荐,PostgreSQL + Redis)

git clone https://github.com/RingKoAI/RingRouter.git
cd RingRouter
cp .env.example .env # 修改 ADMIN_KEY / JWT_SECRET / 数据库密码
docker compose up -d --build

打开 http://localhost:3000,按引导完成安装(创建管理员账号)。

Docker 单容器(SQLite 轻量模式)

先从源码构建镜像,再运行:

docker build -t ringrouter .
docker run --name ringrouter -d --restart always -p 3000:3000 \
-e ADMIN_KEY=change-me -e JWT_SECRET=change-me-too \
-e DB_TYPE=sqlite -v /data/ringrouter:/app/data \
ringrouter

源码构建

git clone https://github.com/RingKoAI/RingRouter.git
cd RingRouter
# 前端cd web && pnpm install && pnpm build &&cd ..
# 后端(嵌入 web/dist,产出单二进制)
go build -o ringrouter .
ADMIN_KEY=change-me ./ringrouter

环境变量

变量说明默认
PORT监听端口3000
DB_TYPEpostgres / mysql / sqlitepostgres
DB_DSNPG / MySQL 连接串
DB_PATHSQLite 文件路径(仅 sqlite)data/ringrouter.db
ADMIN_KEY可选管理引导密钥,可换取管理会话;留空则仅通过安装向导/管理员密码登录未启用
JWT_SECRET密钥密封与签名盐(AES-GCM 派生);留空时自动生成 256bit 随机值并持久化到 data/.instance_secret(0600)自动生成并持久化
ENCRYPTION_KEY独立加密密钥(hex 32 字节),优先于 JWT_SECRET 派生
REDIS_CONN_STRINGredis://[user[:pass]@]host:port/db,设置即启用共享缓存未启用
REDIS_ENABLED 等分离变量REDIS_ENABLED=true + REDIS_ADDR/PASSWORD/DB 的替代写法未启用
TRUSTED_PROXIES反向代理 CIDR 列表(逗号分隔);仅来自这些地址的连接信任 X-Forwarded-For/X-Real-IP* 信任任意,none 完全禁用仅 loopback
CHANNEL_ALLOW_PRIVATE_ADDR渠道 base_url / SMTP 测试允许内网地址;false 开启 SSRF 加固(拒绝环回/私网/链路本地,含出站重定向逐跳校验)true
OPENAI_API_KEY / OPENAI_BASE_URL无数据库渠道时的兜底上游(可选)
ANNOUNCEMENT首次启动播种公告(可选)
TURNSTILE_SITEKEY / TURNSTILE_SECRETCloudflare Turnstile(登录/注册/安装/SMTP 测试)未启用
RATE_LIMIT_API / RATE_LIMIT_WEB / RATE_LIMIT_CRITICAL每 IP 滑动窗口限额(网关 / 管理面 / 登录注册等敏感端点,0 关闭)480 / 240 / 20

Important

  • 生产部署务必固定 JWT_SECRET(或保留自动持久化的 data/.instance_secret 且勿删除),并启用 HTTPS;compose 模板默认仅绑定 127.0.0.1,由前置反代对外服务。
  • 直接对外(无反代)部署时,转发头会被伪造以绕过限流;保持默认「仅信任 loopback」或按拓扑配置 TRUSTED_PROXIES

使用方法

  1. 安装向导:首次访问自动进入 /setup,创建管理员、可选配置 SMTP 与通行密钥
  2. 添加渠道:控制台 → 渠道管理 → 填写上游协议(openai / anthropic / google)、地址与密钥、模型列表、分组与优先级
  3. 创建密钥:控制台 → API 密钥 → 生成 sk-rr-…(仅显示一次)
  4. 调用网关(任选一种协议,任意客户端兼容):
# OpenAI 协议
curl http://localhost:3000/v1/chat/completions \
-H "Authorization: Bearer sk-rr-xxxx" -H "Content-Type: application/json" \
-d '{"model":"gpt-4o","messages":[{"role":"user","content":"hi"}]}'# Anthropic 协议(同一密钥)
curl http://localhost:3000/v1/messages \
-H "x-api-key: sk-rr-xxxx" -H "anthropic-version: 2023-06-01" \
-d '{"model":"claude-sonnet-4-5","max_tokens":64,"messages":[{"role":"user","content":"hi"}]}'# Gemini 协议(同一密钥)
curl "http://localhost:3000/v1beta/models/gemini-2.0-flash:generateContent" \
-H "x-goog-api-key: sk-rr-xxxx" \
-d '{"contents":[{"parts":[{"text":"hi"}]}]}'
  1. 公开模型广场/models 无需登录,浏览全部可用模型与分组倍率

  2. 查询配额与 credits(需要同一 sk-rr-… API 密钥):

# 有效配额上限、已用额度与剩余额度
curl http://localhost:3000/v1/usage/quota/limit \
-H "Authorization: Bearer sk-rr-xxxx"# 兼容 credits 查询客户端
curl http://localhost:3000/v1/credits \
-H "Authorization: Bearer sk-rr-xxxx"

两个接口返回的数值单位均为 RingRouter quota points;当用户配额与 API 密钥配额同时存在时,返回较严格的有效余额,不会泄露密钥内容。

与 one-api 的差异

RingRouter 在设计上参考并致敬 one-api(分组倍率、渠道优先级、Redis 可选缓存等语义保持一致),主要差异:

维度RingRouterone-api
入站协议四协议互转(含 Responses / Gemini)OpenAI 兼容为主
分组独立实体表(uuid / metadata / ratio)+ 渠道多分组字符串约定 + 倍率配置
订阅计划/订阅快照式生命周期无(额度充值模型)
认证密码 + 邮箱验证码 + Passkey + Turnstile密码 + 邮箱 + 多 OAuth
计费计划分配 + 按次扣减(价格 × 分组倍率,$1=50万点)完整额度体系

开发

# 后端(Go 1.27)
go build ./... && go vet ./... && go test ./internal/...
# 前端(web/,pnpm)cd web && pnpm install && pnpm dev # Vite :5173,代理到 :3000

目录结构:internal/ 后端(config / crypto / database / gateway / handler / inbound / middleware / model / provider / setting / turnstile / cache),web/ 前端(React 19 + Vite + Tailwind v4)。界面翻译位于 web/src/i18n/locales(zh / zh-TW / zh-HK / en 四语言,新增文案必须四份同步)。

License

AGPL-3.0

本仓库不含任何 AGPL 许可的第三方代码;采用 AGPL-3.0 是为了保持开源网关生态的传染性开源要求。

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - RingKoAI/RingRouter · GitHub
Skip to content

Repository files navigation

中文 | English

RingRouter

✦ 一个网关,所有供应商 —— 多协议进、多渠道出、故障自愈的 LLM API 网关 ✦

licensegoreactdocker

功能 · 快速开始 · 环境变量 · 使用方法 · 与 one-api 的差异 · 开发

Note

本项目为自部署网关,使用者须遵循各上游供应商的服务条款与所在地区法律法规。

功能

协议层

  • 四种入站协议,任意进、任意出(统一中间格式互转):OpenAI Chat Completions / OpenAI Responses / Anthropic Messages / Google Gemini generateContent
  • 流式(SSE)与非流式均支持;同协议流式原样透传,跨协议自动翻译
  • GET /v1/models 跨渠道聚合模型列表

路由层

  • 多渠道:按模型匹配 → 优先级排序 → 逐个故障转移
  • 渠道密钥 AES-GCM 加密落库,管理界面永不回显
  • 模型映射(客户端模型名 → 上游模型名,JSON 配置)
  • 渠道缓存:进程内 30s 快照;可选 Redis 共享快照(跨实例一致,写后即失效)

用户与计费

  • 分组:name / uuid / metadata / ratio(计费倍率),渠道可属多个分组(逗号分隔),改名自动级联
  • 计划与订阅:计划绑定配额+分组+周期,分配即生效;订阅快照式记录,惰性过期
  • API 密钥(sk-rr- 前缀):创建时一次性展示,此后仅掩码
  • 请求日志:模型 / token 数 / 耗时 / 渠道 / IP 异步落库,个人与管理员双视角查询

认证

  • 用户名+密码登录,邮箱验证码重置密码(60s 冷却、5 次尝试上限、单次使用)
  • 通行密钥(WebAuthn / Passkey):免密登录、设备内注册、discoverable 流程
  • Cloudflare Turnstile 人机验证(可选)
  • 管理密钥(ADMIN_KEY)可直接换取管理会话

管理面

  • 4 步安装向导(站点信息 → SMTP → 通行密钥 → 使用模式)
  • 渠道 / 用户 / 分组 / 计划 / 订阅 / 模型目录 / 日志 / 系统设置全功能管理页
  • 公开模型广场(/models):无需登录浏览可用模型与分组倍率
  • Playground:内置流式对话调试
  • 中 / 繁(台 / 港) / 英四语言,深色模式,单二进制部署(前端嵌入)

暂未实现(欢迎 PR):负载均衡随机分流、兑换码、邀请奖励、OAuth2 登录

快速开始

Docker Compose(推荐,PostgreSQL + Redis)

git clone https://github.com/RingKoAI/RingRouter.git
cd RingRouter
cp .env.example .env # 修改 ADMIN_KEY / JWT_SECRET / 数据库密码
docker compose up -d --build

打开 http://localhost:3000,按引导完成安装(创建管理员账号)。

Docker 单容器(SQLite 轻量模式)

先从源码构建镜像,再运行:

docker build -t ringrouter .
docker run --name ringrouter -d --restart always -p 3000:3000 \
-e ADMIN_KEY=change-me -e JWT_SECRET=change-me-too \
-e DB_TYPE=sqlite -v /data/ringrouter:/app/data \
ringrouter

源码构建

git clone https://github.com/RingKoAI/RingRouter.git
cd RingRouter
# 前端cd web && pnpm install && pnpm build &&cd ..
# 后端(嵌入 web/dist,产出单二进制)
go build -o ringrouter .
ADMIN_KEY=change-me ./ringrouter

环境变量

变量说明默认
PORT监听端口3000
DB_TYPEpostgres / mysql / sqlitepostgres
DB_DSNPG / MySQL 连接串
DB_PATHSQLite 文件路径(仅 sqlite)data/ringrouter.db
ADMIN_KEY可选管理引导密钥,可换取管理会话;留空则仅通过安装向导/管理员密码登录未启用
JWT_SECRET密钥密封与签名盐(AES-GCM 派生);留空时自动生成 256bit 随机值并持久化到 data/.instance_secret(0600)自动生成并持久化
ENCRYPTION_KEY独立加密密钥(hex 32 字节),优先于 JWT_SECRET 派生
REDIS_CONN_STRINGredis://[user[:pass]@]host:port/db,设置即启用共享缓存未启用
REDIS_ENABLED 等分离变量REDIS_ENABLED=true + REDIS_ADDR/PASSWORD/DB 的替代写法未启用
TRUSTED_PROXIES反向代理 CIDR 列表(逗号分隔);仅来自这些地址的连接信任 X-Forwarded-For/X-Real-IP* 信任任意,none 完全禁用仅 loopback
CHANNEL_ALLOW_PRIVATE_ADDR渠道 base_url / SMTP 测试允许内网地址;false 开启 SSRF 加固(拒绝环回/私网/链路本地,含出站重定向逐跳校验)true
OPENAI_API_KEY / OPENAI_BASE_URL无数据库渠道时的兜底上游(可选)
ANNOUNCEMENT首次启动播种公告(可选)
TURNSTILE_SITEKEY / TURNSTILE_SECRETCloudflare Turnstile(登录/注册/安装/SMTP 测试)未启用
RATE_LIMIT_API / RATE_LIMIT_WEB / RATE_LIMIT_CRITICAL每 IP 滑动窗口限额(网关 / 管理面 / 登录注册等敏感端点,0 关闭)480 / 240 / 20

Important

  • 生产部署务必固定 JWT_SECRET(或保留自动持久化的 data/.instance_secret 且勿删除),并启用 HTTPS;compose 模板默认仅绑定 127.0.0.1,由前置反代对外服务。
  • 直接对外(无反代)部署时,转发头会被伪造以绕过限流;保持默认「仅信任 loopback」或按拓扑配置 TRUSTED_PROXIES

使用方法

  1. 安装向导:首次访问自动进入 /setup,创建管理员、可选配置 SMTP 与通行密钥
  2. 添加渠道:控制台 → 渠道管理 → 填写上游协议(openai / anthropic / google)、地址与密钥、模型列表、分组与优先级
  3. 创建密钥:控制台 → API 密钥 → 生成 sk-rr-…(仅显示一次)
  4. 调用网关(任选一种协议,任意客户端兼容):
# OpenAI 协议
curl http://localhost:3000/v1/chat/completions \
-H "Authorization: Bearer sk-rr-xxxx" -H "Content-Type: application/json" \
-d '{"model":"gpt-4o","messages":[{"role":"user","content":"hi"}]}'# Anthropic 协议(同一密钥)
curl http://localhost:3000/v1/messages \
-H "x-api-key: sk-rr-xxxx" -H "anthropic-version: 2023-06-01" \
-d '{"model":"claude-sonnet-4-5","max_tokens":64,"messages":[{"role":"user","content":"hi"}]}'# Gemini 协议(同一密钥)
curl "http://localhost:3000/v1beta/models/gemini-2.0-flash:generateContent" \
-H "x-goog-api-key: sk-rr-xxxx" \
-d '{"contents":[{"parts":[{"text":"hi"}]}]}'
  1. 公开模型广场/models 无需登录,浏览全部可用模型与分组倍率

  2. 查询配额与 credits(需要同一 sk-rr-… API 密钥):

# 有效配额上限、已用额度与剩余额度
curl http://localhost:3000/v1/usage/quota/limit \
-H "Authorization: Bearer sk-rr-xxxx"# 兼容 credits 查询客户端
curl http://localhost:3000/v1/credits \
-H "Authorization: Bearer sk-rr-xxxx"

两个接口返回的数值单位均为 RingRouter quota points;当用户配额与 API 密钥配额同时存在时,返回较严格的有效余额,不会泄露密钥内容。

与 one-api 的差异

RingRouter 在设计上参考并致敬 one-api(分组倍率、渠道优先级、Redis 可选缓存等语义保持一致),主要差异:

维度RingRouterone-api
入站协议四协议互转(含 Responses / Gemini)OpenAI 兼容为主
分组独立实体表(uuid / metadata / ratio)+ 渠道多分组字符串约定 + 倍率配置
订阅计划/订阅快照式生命周期无(额度充值模型)
认证密码 + 邮箱验证码 + Passkey + Turnstile密码 + 邮箱 + 多 OAuth
计费计划分配 + 按次扣减(价格 × 分组倍率,$1=50万点)完整额度体系

开发

# 后端(Go 1.27)
go build ./... && go vet ./... && go test ./internal/...
# 前端(web/,pnpm)cd web && pnpm install && pnpm dev # Vite :5173,代理到 :3000

目录结构:internal/ 后端(config / crypto / database / gateway / handler / inbound / middleware / model / provider / setting / turnstile / cache),web/ 前端(React 19 + Vite + Tailwind v4)。界面翻译位于 web/src/i18n/locales(zh / zh-TW / zh-HK / en 四语言,新增文案必须四份同步)。

License

AGPL-3.0

本仓库不含任何 AGPL 许可的第三方代码;采用 AGPL-3.0 是为了保持开源网关生态的传染性开源要求。

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - RingKoAI/RingRouter · GitHub
Skip to content

Repository files navigation

中文 | English

RingRouter

✦ 一个网关,所有供应商 —— 多协议进、多渠道出、故障自愈的 LLM API 网关 ✦

licensegoreactdocker

功能 · 快速开始 · 环境变量 · 使用方法 · 与 one-api 的差异 · 开发

Note

本项目为自部署网关,使用者须遵循各上游供应商的服务条款与所在地区法律法规。

功能

协议层

  • 四种入站协议,任意进、任意出(统一中间格式互转):OpenAI Chat Completions / OpenAI Responses / Anthropic Messages / Google Gemini generateContent
  • 流式(SSE)与非流式均支持;同协议流式原样透传,跨协议自动翻译
  • GET /v1/models 跨渠道聚合模型列表

路由层

  • 多渠道:按模型匹配 → 优先级排序 → 逐个故障转移
  • 渠道密钥 AES-GCM 加密落库,管理界面永不回显
  • 模型映射(客户端模型名 → 上游模型名,JSON 配置)
  • 渠道缓存:进程内 30s 快照;可选 Redis 共享快照(跨实例一致,写后即失效)

用户与计费

  • 分组:name / uuid / metadata / ratio(计费倍率),渠道可属多个分组(逗号分隔),改名自动级联
  • 计划与订阅:计划绑定配额+分组+周期,分配即生效;订阅快照式记录,惰性过期
  • API 密钥(sk-rr- 前缀):创建时一次性展示,此后仅掩码
  • 请求日志:模型 / token 数 / 耗时 / 渠道 / IP 异步落库,个人与管理员双视角查询

认证

  • 用户名+密码登录,邮箱验证码重置密码(60s 冷却、5 次尝试上限、单次使用)
  • 通行密钥(WebAuthn / Passkey):免密登录、设备内注册、discoverable 流程
  • Cloudflare Turnstile 人机验证(可选)
  • 管理密钥(ADMIN_KEY)可直接换取管理会话

管理面

  • 4 步安装向导(站点信息 → SMTP → 通行密钥 → 使用模式)
  • 渠道 / 用户 / 分组 / 计划 / 订阅 / 模型目录 / 日志 / 系统设置全功能管理页
  • 公开模型广场(/models):无需登录浏览可用模型与分组倍率
  • Playground:内置流式对话调试
  • 中 / 繁(台 / 港) / 英四语言,深色模式,单二进制部署(前端嵌入)

暂未实现(欢迎 PR):负载均衡随机分流、兑换码、邀请奖励、OAuth2 登录

快速开始

Docker Compose(推荐,PostgreSQL + Redis)

git clone https://github.com/RingKoAI/RingRouter.git
cd RingRouter
cp .env.example .env # 修改 ADMIN_KEY / JWT_SECRET / 数据库密码
docker compose up -d --build

打开 http://localhost:3000,按引导完成安装(创建管理员账号)。

Docker 单容器(SQLite 轻量模式)

先从源码构建镜像,再运行:

docker build -t ringrouter .
docker run --name ringrouter -d --restart always -p 3000:3000 \
-e ADMIN_KEY=change-me -e JWT_SECRET=change-me-too \
-e DB_TYPE=sqlite -v /data/ringrouter:/app/data \
ringrouter

源码构建

git clone https://github.com/RingKoAI/RingRouter.git
cd RingRouter
# 前端cd web && pnpm install && pnpm build &&cd ..
# 后端(嵌入 web/dist,产出单二进制)
go build -o ringrouter .
ADMIN_KEY=change-me ./ringrouter

环境变量

变量说明默认
PORT监听端口3000
DB_TYPEpostgres / mysql / sqlitepostgres
DB_DSNPG / MySQL 连接串
DB_PATHSQLite 文件路径(仅 sqlite)data/ringrouter.db
ADMIN_KEY可选管理引导密钥,可换取管理会话;留空则仅通过安装向导/管理员密码登录未启用
JWT_SECRET密钥密封与签名盐(AES-GCM 派生);留空时自动生成 256bit 随机值并持久化到 data/.instance_secret(0600)自动生成并持久化
ENCRYPTION_KEY独立加密密钥(hex 32 字节),优先于 JWT_SECRET 派生
REDIS_CONN_STRINGredis://[user[:pass]@]host:port/db,设置即启用共享缓存未启用
REDIS_ENABLED 等分离变量REDIS_ENABLED=true + REDIS_ADDR/PASSWORD/DB 的替代写法未启用
TRUSTED_PROXIES反向代理 CIDR 列表(逗号分隔);仅来自这些地址的连接信任 X-Forwarded-For/X-Real-IP* 信任任意,none 完全禁用仅 loopback
CHANNEL_ALLOW_PRIVATE_ADDR渠道 base_url / SMTP 测试允许内网地址;false 开启 SSRF 加固(拒绝环回/私网/链路本地,含出站重定向逐跳校验)true
OPENAI_API_KEY / OPENAI_BASE_URL无数据库渠道时的兜底上游(可选)
ANNOUNCEMENT首次启动播种公告(可选)
TURNSTILE_SITEKEY / TURNSTILE_SECRETCloudflare Turnstile(登录/注册/安装/SMTP 测试)未启用
RATE_LIMIT_API / RATE_LIMIT_WEB / RATE_LIMIT_CRITICAL每 IP 滑动窗口限额(网关 / 管理面 / 登录注册等敏感端点,0 关闭)480 / 240 / 20

Important

  • 生产部署务必固定 JWT_SECRET(或保留自动持久化的 data/.instance_secret 且勿删除),并启用 HTTPS;compose 模板默认仅绑定 127.0.0.1,由前置反代对外服务。
  • 直接对外(无反代)部署时,转发头会被伪造以绕过限流;保持默认「仅信任 loopback」或按拓扑配置 TRUSTED_PROXIES

使用方法

  1. 安装向导:首次访问自动进入 /setup,创建管理员、可选配置 SMTP 与通行密钥
  2. 添加渠道:控制台 → 渠道管理 → 填写上游协议(openai / anthropic / google)、地址与密钥、模型列表、分组与优先级
  3. 创建密钥:控制台 → API 密钥 → 生成 sk-rr-…(仅显示一次)
  4. 调用网关(任选一种协议,任意客户端兼容):
# OpenAI 协议
curl http://localhost:3000/v1/chat/completions \
-H "Authorization: Bearer sk-rr-xxxx" -H "Content-Type: application/json" \
-d '{"model":"gpt-4o","messages":[{"role":"user","content":"hi"}]}'# Anthropic 协议(同一密钥)
curl http://localhost:3000/v1/messages \
-H "x-api-key: sk-rr-xxxx" -H "anthropic-version: 2023-06-01" \
-d '{"model":"claude-sonnet-4-5","max_tokens":64,"messages":[{"role":"user","content":"hi"}]}'# Gemini 协议(同一密钥)
curl "http://localhost:3000/v1beta/models/gemini-2.0-flash:generateContent" \
-H "x-goog-api-key: sk-rr-xxxx" \
-d '{"contents":[{"parts":[{"text":"hi"}]}]}'
  1. 公开模型广场/models 无需登录,浏览全部可用模型与分组倍率

  2. 查询配额与 credits(需要同一 sk-rr-… API 密钥):

# 有效配额上限、已用额度与剩余额度
curl http://localhost:3000/v1/usage/quota/limit \
-H "Authorization: Bearer sk-rr-xxxx"# 兼容 credits 查询客户端
curl http://localhost:3000/v1/credits \
-H "Authorization: Bearer sk-rr-xxxx"

两个接口返回的数值单位均为 RingRouter quota points;当用户配额与 API 密钥配额同时存在时,返回较严格的有效余额,不会泄露密钥内容。

与 one-api 的差异

RingRouter 在设计上参考并致敬 one-api(分组倍率、渠道优先级、Redis 可选缓存等语义保持一致),主要差异:

维度RingRouterone-api
入站协议四协议互转(含 Responses / Gemini)OpenAI 兼容为主
分组独立实体表(uuid / metadata / ratio)+ 渠道多分组字符串约定 + 倍率配置
订阅计划/订阅快照式生命周期无(额度充值模型)
认证密码 + 邮箱验证码 + Passkey + Turnstile密码 + 邮箱 + 多 OAuth
计费计划分配 + 按次扣减(价格 × 分组倍率,$1=50万点)完整额度体系

开发

# 后端(Go 1.27)
go build ./... && go vet ./... && go test ./internal/...
# 前端(web/,pnpm)cd web && pnpm install && pnpm dev # Vite :5173,代理到 :3000

目录结构:internal/ 后端(config / crypto / database / gateway / handler / inbound / middleware / model / provider / setting / turnstile / cache),web/ 前端(React 19 + Vite + Tailwind v4)。界面翻译位于 web/src/i18n/locales(zh / zh-TW / zh-HK / en 四语言,新增文案必须四份同步)。

License

AGPL-3.0

本仓库不含任何 AGPL 许可的第三方代码;采用 AGPL-3.0 是为了保持开源网关生态的传染性开源要求。

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - RingKoAI/RingRouter · GitHub
Skip to content

Repository files navigation

中文 | English

RingRouter

✦ 一个网关,所有供应商 —— 多协议进、多渠道出、故障自愈的 LLM API 网关 ✦

licensegoreactdocker

功能 · 快速开始 · 环境变量 · 使用方法 · 与 one-api 的差异 · 开发

Note

本项目为自部署网关,使用者须遵循各上游供应商的服务条款与所在地区法律法规。

功能

协议层

  • 四种入站协议,任意进、任意出(统一中间格式互转):OpenAI Chat Completions / OpenAI Responses / Anthropic Messages / Google Gemini generateContent
  • 流式(SSE)与非流式均支持;同协议流式原样透传,跨协议自动翻译
  • GET /v1/models 跨渠道聚合模型列表

路由层

  • 多渠道:按模型匹配 → 优先级排序 → 逐个故障转移
  • 渠道密钥 AES-GCM 加密落库,管理界面永不回显
  • 模型映射(客户端模型名 → 上游模型名,JSON 配置)
  • 渠道缓存:进程内 30s 快照;可选 Redis 共享快照(跨实例一致,写后即失效)

用户与计费

  • 分组:name / uuid / metadata / ratio(计费倍率),渠道可属多个分组(逗号分隔),改名自动级联
  • 计划与订阅:计划绑定配额+分组+周期,分配即生效;订阅快照式记录,惰性过期
  • API 密钥(sk-rr- 前缀):创建时一次性展示,此后仅掩码
  • 请求日志:模型 / token 数 / 耗时 / 渠道 / IP 异步落库,个人与管理员双视角查询

认证

  • 用户名+密码登录,邮箱验证码重置密码(60s 冷却、5 次尝试上限、单次使用)
  • 通行密钥(WebAuthn / Passkey):免密登录、设备内注册、discoverable 流程
  • Cloudflare Turnstile 人机验证(可选)
  • 管理密钥(ADMIN_KEY)可直接换取管理会话

管理面

  • 4 步安装向导(站点信息 → SMTP → 通行密钥 → 使用模式)
  • 渠道 / 用户 / 分组 / 计划 / 订阅 / 模型目录 / 日志 / 系统设置全功能管理页
  • 公开模型广场(/models):无需登录浏览可用模型与分组倍率
  • Playground:内置流式对话调试
  • 中 / 繁(台 / 港) / 英四语言,深色模式,单二进制部署(前端嵌入)

暂未实现(欢迎 PR):负载均衡随机分流、兑换码、邀请奖励、OAuth2 登录

快速开始

Docker Compose(推荐,PostgreSQL + Redis)

git clone https://github.com/RingKoAI/RingRouter.git
cd RingRouter
cp .env.example .env # 修改 ADMIN_KEY / JWT_SECRET / 数据库密码
docker compose up -d --build

打开 http://localhost:3000,按引导完成安装(创建管理员账号)。

Docker 单容器(SQLite 轻量模式)

先从源码构建镜像,再运行:

docker build -t ringrouter .
docker run --name ringrouter -d --restart always -p 3000:3000 \
-e ADMIN_KEY=change-me -e JWT_SECRET=change-me-too \
-e DB_TYPE=sqlite -v /data/ringrouter:/app/data \
ringrouter

源码构建

git clone https://github.com/RingKoAI/RingRouter.git
cd RingRouter
# 前端cd web && pnpm install && pnpm build &&cd ..
# 后端(嵌入 web/dist,产出单二进制)
go build -o ringrouter .
ADMIN_KEY=change-me ./ringrouter

环境变量

变量说明默认
PORT监听端口3000
DB_TYPEpostgres / mysql / sqlitepostgres
DB_DSNPG / MySQL 连接串
DB_PATHSQLite 文件路径(仅 sqlite)data/ringrouter.db
ADMIN_KEY可选管理引导密钥,可换取管理会话;留空则仅通过安装向导/管理员密码登录未启用
JWT_SECRET密钥密封与签名盐(AES-GCM 派生);留空时自动生成 256bit 随机值并持久化到 data/.instance_secret(0600)自动生成并持久化
ENCRYPTION_KEY独立加密密钥(hex 32 字节),优先于 JWT_SECRET 派生
REDIS_CONN_STRINGredis://[user[:pass]@]host:port/db,设置即启用共享缓存未启用
REDIS_ENABLED 等分离变量REDIS_ENABLED=true + REDIS_ADDR/PASSWORD/DB 的替代写法未启用
TRUSTED_PROXIES反向代理 CIDR 列表(逗号分隔);仅来自这些地址的连接信任 X-Forwarded-For/X-Real-IP* 信任任意,none 完全禁用仅 loopback
CHANNEL_ALLOW_PRIVATE_ADDR渠道 base_url / SMTP 测试允许内网地址;false 开启 SSRF 加固(拒绝环回/私网/链路本地,含出站重定向逐跳校验)true
OPENAI_API_KEY / OPENAI_BASE_URL无数据库渠道时的兜底上游(可选)
ANNOUNCEMENT首次启动播种公告(可选)
TURNSTILE_SITEKEY / TURNSTILE_SECRETCloudflare Turnstile(登录/注册/安装/SMTP 测试)未启用
RATE_LIMIT_API / RATE_LIMIT_WEB / RATE_LIMIT_CRITICAL每 IP 滑动窗口限额(网关 / 管理面 / 登录注册等敏感端点,0 关闭)480 / 240 / 20

Important

  • 生产部署务必固定 JWT_SECRET(或保留自动持久化的 data/.instance_secret 且勿删除),并启用 HTTPS;compose 模板默认仅绑定 127.0.0.1,由前置反代对外服务。
  • 直接对外(无反代)部署时,转发头会被伪造以绕过限流;保持默认「仅信任 loopback」或按拓扑配置 TRUSTED_PROXIES

使用方法

  1. 安装向导:首次访问自动进入 /setup,创建管理员、可选配置 SMTP 与通行密钥
  2. 添加渠道:控制台 → 渠道管理 → 填写上游协议(openai / anthropic / google)、地址与密钥、模型列表、分组与优先级
  3. 创建密钥:控制台 → API 密钥 → 生成 sk-rr-…(仅显示一次)
  4. 调用网关(任选一种协议,任意客户端兼容):
# OpenAI 协议
curl http://localhost:3000/v1/chat/completions \
-H "Authorization: Bearer sk-rr-xxxx" -H "Content-Type: application/json" \
-d '{"model":"gpt-4o","messages":[{"role":"user","content":"hi"}]}'# Anthropic 协议(同一密钥)
curl http://localhost:3000/v1/messages \
-H "x-api-key: sk-rr-xxxx" -H "anthropic-version: 2023-06-01" \
-d '{"model":"claude-sonnet-4-5","max_tokens":64,"messages":[{"role":"user","content":"hi"}]}'# Gemini 协议(同一密钥)
curl "http://localhost:3000/v1beta/models/gemini-2.0-flash:generateContent" \
-H "x-goog-api-key: sk-rr-xxxx" \
-d '{"contents":[{"parts":[{"text":"hi"}]}]}'
  1. 公开模型广场/models 无需登录,浏览全部可用模型与分组倍率

  2. 查询配额与 credits(需要同一 sk-rr-… API 密钥):

# 有效配额上限、已用额度与剩余额度
curl http://localhost:3000/v1/usage/quota/limit \
-H "Authorization: Bearer sk-rr-xxxx"# 兼容 credits 查询客户端
curl http://localhost:3000/v1/credits \
-H "Authorization: Bearer sk-rr-xxxx"

两个接口返回的数值单位均为 RingRouter quota points;当用户配额与 API 密钥配额同时存在时,返回较严格的有效余额,不会泄露密钥内容。

与 one-api 的差异

RingRouter 在设计上参考并致敬 one-api(分组倍率、渠道优先级、Redis 可选缓存等语义保持一致),主要差异:

维度RingRouterone-api
入站协议四协议互转(含 Responses / Gemini)OpenAI 兼容为主
分组独立实体表(uuid / metadata / ratio)+ 渠道多分组字符串约定 + 倍率配置
订阅计划/订阅快照式生命周期无(额度充值模型)
认证密码 + 邮箱验证码 + Passkey + Turnstile密码 + 邮箱 + 多 OAuth
计费计划分配 + 按次扣减(价格 × 分组倍率,$1=50万点)完整额度体系

开发

# 后端(Go 1.27)
go build ./... && go vet ./... && go test ./internal/...
# 前端(web/,pnpm)cd web && pnpm install && pnpm dev # Vite :5173,代理到 :3000

目录结构:internal/ 后端(config / crypto / database / gateway / handler / inbound / middleware / model / provider / setting / turnstile / cache),web/ 前端(React 19 + Vite + Tailwind v4)。界面翻译位于 web/src/i18n/locales(zh / zh-TW / zh-HK / en 四语言,新增文案必须四份同步)。

License

AGPL-3.0

本仓库不含任何 AGPL 许可的第三方代码;采用 AGPL-3.0 是为了保持开源网关生态的传染性开源要求。

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - RingKoAI/RingRouter · GitHub
Skip to content

Repository files navigation

中文 | English

RingRouter

✦ 一个网关,所有供应商 —— 多协议进、多渠道出、故障自愈的 LLM API 网关 ✦

licensegoreactdocker

功能 · 快速开始 · 环境变量 · 使用方法 · 与 one-api 的差异 · 开发

Note

本项目为自部署网关,使用者须遵循各上游供应商的服务条款与所在地区法律法规。

功能

协议层

  • 四种入站协议,任意进、任意出(统一中间格式互转):OpenAI Chat Completions / OpenAI Responses / Anthropic Messages / Google Gemini generateContent
  • 流式(SSE)与非流式均支持;同协议流式原样透传,跨协议自动翻译
  • GET /v1/models 跨渠道聚合模型列表

路由层

  • 多渠道:按模型匹配 → 优先级排序 → 逐个故障转移
  • 渠道密钥 AES-GCM 加密落库,管理界面永不回显
  • 模型映射(客户端模型名 → 上游模型名,JSON 配置)
  • 渠道缓存:进程内 30s 快照;可选 Redis 共享快照(跨实例一致,写后即失效)

用户与计费

  • 分组:name / uuid / metadata / ratio(计费倍率),渠道可属多个分组(逗号分隔),改名自动级联
  • 计划与订阅:计划绑定配额+分组+周期,分配即生效;订阅快照式记录,惰性过期
  • API 密钥(sk-rr- 前缀):创建时一次性展示,此后仅掩码
  • 请求日志:模型 / token 数 / 耗时 / 渠道 / IP 异步落库,个人与管理员双视角查询

认证

  • 用户名+密码登录,邮箱验证码重置密码(60s 冷却、5 次尝试上限、单次使用)
  • 通行密钥(WebAuthn / Passkey):免密登录、设备内注册、discoverable 流程
  • Cloudflare Turnstile 人机验证(可选)
  • 管理密钥(ADMIN_KEY)可直接换取管理会话

管理面

  • 4 步安装向导(站点信息 → SMTP → 通行密钥 → 使用模式)
  • 渠道 / 用户 / 分组 / 计划 / 订阅 / 模型目录 / 日志 / 系统设置全功能管理页
  • 公开模型广场(/models):无需登录浏览可用模型与分组倍率
  • Playground:内置流式对话调试
  • 中 / 繁(台 / 港) / 英四语言,深色模式,单二进制部署(前端嵌入)

暂未实现(欢迎 PR):负载均衡随机分流、兑换码、邀请奖励、OAuth2 登录

快速开始

Docker Compose(推荐,PostgreSQL + Redis)

git clone https://github.com/RingKoAI/RingRouter.git
cd RingRouter
cp .env.example .env # 修改 ADMIN_KEY / JWT_SECRET / 数据库密码
docker compose up -d --build

打开 http://localhost:3000,按引导完成安装(创建管理员账号)。

Docker 单容器(SQLite 轻量模式)

先从源码构建镜像,再运行:

docker build -t ringrouter .
docker run --name ringrouter -d --restart always -p 3000:3000 \
-e ADMIN_KEY=change-me -e JWT_SECRET=change-me-too \
-e DB_TYPE=sqlite -v /data/ringrouter:/app/data \
ringrouter

源码构建

git clone https://github.com/RingKoAI/RingRouter.git
cd RingRouter
# 前端cd web && pnpm install && pnpm build &&cd ..
# 后端(嵌入 web/dist,产出单二进制)
go build -o ringrouter .
ADMIN_KEY=change-me ./ringrouter

环境变量

变量说明默认
PORT监听端口3000
DB_TYPEpostgres / mysql / sqlitepostgres
DB_DSNPG / MySQL 连接串
DB_PATHSQLite 文件路径(仅 sqlite)data/ringrouter.db
ADMIN_KEY可选管理引导密钥,可换取管理会话;留空则仅通过安装向导/管理员密码登录未启用
JWT_SECRET密钥密封与签名盐(AES-GCM 派生);留空时自动生成 256bit 随机值并持久化到 data/.instance_secret(0600)自动生成并持久化
ENCRYPTION_KEY独立加密密钥(hex 32 字节),优先于 JWT_SECRET 派生
REDIS_CONN_STRINGredis://[user[:pass]@]host:port/db,设置即启用共享缓存未启用
REDIS_ENABLED 等分离变量REDIS_ENABLED=true + REDIS_ADDR/PASSWORD/DB 的替代写法未启用
TRUSTED_PROXIES反向代理 CIDR 列表(逗号分隔);仅来自这些地址的连接信任 X-Forwarded-For/X-Real-IP* 信任任意,none 完全禁用仅 loopback
CHANNEL_ALLOW_PRIVATE_ADDR渠道 base_url / SMTP 测试允许内网地址;false 开启 SSRF 加固(拒绝环回/私网/链路本地,含出站重定向逐跳校验)true
OPENAI_API_KEY / OPENAI_BASE_URL无数据库渠道时的兜底上游(可选)
ANNOUNCEMENT首次启动播种公告(可选)
TURNSTILE_SITEKEY / TURNSTILE_SECRETCloudflare Turnstile(登录/注册/安装/SMTP 测试)未启用
RATE_LIMIT_API / RATE_LIMIT_WEB / RATE_LIMIT_CRITICAL每 IP 滑动窗口限额(网关 / 管理面 / 登录注册等敏感端点,0 关闭)480 / 240 / 20

Important

  • 生产部署务必固定 JWT_SECRET(或保留自动持久化的 data/.instance_secret 且勿删除),并启用 HTTPS;compose 模板默认仅绑定 127.0.0.1,由前置反代对外服务。
  • 直接对外(无反代)部署时,转发头会被伪造以绕过限流;保持默认「仅信任 loopback」或按拓扑配置 TRUSTED_PROXIES

使用方法

  1. 安装向导:首次访问自动进入 /setup,创建管理员、可选配置 SMTP 与通行密钥
  2. 添加渠道:控制台 → 渠道管理 → 填写上游协议(openai / anthropic / google)、地址与密钥、模型列表、分组与优先级
  3. 创建密钥:控制台 → API 密钥 → 生成 sk-rr-…(仅显示一次)
  4. 调用网关(任选一种协议,任意客户端兼容):
# OpenAI 协议
curl http://localhost:3000/v1/chat/completions \
-H "Authorization: Bearer sk-rr-xxxx" -H "Content-Type: application/json" \
-d '{"model":"gpt-4o","messages":[{"role":"user","content":"hi"}]}'# Anthropic 协议(同一密钥)
curl http://localhost:3000/v1/messages \
-H "x-api-key: sk-rr-xxxx" -H "anthropic-version: 2023-06-01" \
-d '{"model":"claude-sonnet-4-5","max_tokens":64,"messages":[{"role":"user","content":"hi"}]}'# Gemini 协议(同一密钥)
curl "http://localhost:3000/v1beta/models/gemini-2.0-flash:generateContent" \
-H "x-goog-api-key: sk-rr-xxxx" \
-d '{"contents":[{"parts":[{"text":"hi"}]}]}'
  1. 公开模型广场/models 无需登录,浏览全部可用模型与分组倍率

  2. 查询配额与 credits(需要同一 sk-rr-… API 密钥):

# 有效配额上限、已用额度与剩余额度
curl http://localhost:3000/v1/usage/quota/limit \
-H "Authorization: Bearer sk-rr-xxxx"# 兼容 credits 查询客户端
curl http://localhost:3000/v1/credits \
-H "Authorization: Bearer sk-rr-xxxx"

两个接口返回的数值单位均为 RingRouter quota points;当用户配额与 API 密钥配额同时存在时,返回较严格的有效余额,不会泄露密钥内容。

与 one-api 的差异

RingRouter 在设计上参考并致敬 one-api(分组倍率、渠道优先级、Redis 可选缓存等语义保持一致),主要差异:

维度RingRouterone-api
入站协议四协议互转(含 Responses / Gemini)OpenAI 兼容为主
分组独立实体表(uuid / metadata / ratio)+ 渠道多分组字符串约定 + 倍率配置
订阅计划/订阅快照式生命周期无(额度充值模型)
认证密码 + 邮箱验证码 + Passkey + Turnstile密码 + 邮箱 + 多 OAuth
计费计划分配 + 按次扣减(价格 × 分组倍率,$1=50万点)完整额度体系

开发

# 后端(Go 1.27)
go build ./... && go vet ./... && go test ./internal/...
# 前端(web/,pnpm)cd web && pnpm install && pnpm dev # Vite :5173,代理到 :3000

目录结构:internal/ 后端(config / crypto / database / gateway / handler / inbound / middleware / model / provider / setting / turnstile / cache),web/ 前端(React 19 + Vite + Tailwind v4)。界面翻译位于 web/src/i18n/locales(zh / zh-TW / zh-HK / en 四语言,新增文案必须四份同步)。

License

AGPL-3.0

本仓库不含任何 AGPL 许可的第三方代码;采用 AGPL-3.0 是为了保持开源网关生态的传染性开源要求。

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - RingKoAI/RingRouter · GitHub
Skip to content

Repository files navigation

中文 | English

RingRouter

✦ 一个网关,所有供应商 —— 多协议进、多渠道出、故障自愈的 LLM API 网关 ✦

licensegoreactdocker

功能 · 快速开始 · 环境变量 · 使用方法 · 与 one-api 的差异 · 开发

Note

本项目为自部署网关,使用者须遵循各上游供应商的服务条款与所在地区法律法规。

功能

协议层

  • 四种入站协议,任意进、任意出(统一中间格式互转):OpenAI Chat Completions / OpenAI Responses / Anthropic Messages / Google Gemini generateContent
  • 流式(SSE)与非流式均支持;同协议流式原样透传,跨协议自动翻译
  • GET /v1/models 跨渠道聚合模型列表

路由层

  • 多渠道:按模型匹配 → 优先级排序 → 逐个故障转移
  • 渠道密钥 AES-GCM 加密落库,管理界面永不回显
  • 模型映射(客户端模型名 → 上游模型名,JSON 配置)
  • 渠道缓存:进程内 30s 快照;可选 Redis 共享快照(跨实例一致,写后即失效)

用户与计费

  • 分组:name / uuid / metadata / ratio(计费倍率),渠道可属多个分组(逗号分隔),改名自动级联
  • 计划与订阅:计划绑定配额+分组+周期,分配即生效;订阅快照式记录,惰性过期
  • API 密钥(sk-rr- 前缀):创建时一次性展示,此后仅掩码
  • 请求日志:模型 / token 数 / 耗时 / 渠道 / IP 异步落库,个人与管理员双视角查询

认证

  • 用户名+密码登录,邮箱验证码重置密码(60s 冷却、5 次尝试上限、单次使用)
  • 通行密钥(WebAuthn / Passkey):免密登录、设备内注册、discoverable 流程
  • Cloudflare Turnstile 人机验证(可选)
  • 管理密钥(ADMIN_KEY)可直接换取管理会话

管理面

  • 4 步安装向导(站点信息 → SMTP → 通行密钥 → 使用模式)
  • 渠道 / 用户 / 分组 / 计划 / 订阅 / 模型目录 / 日志 / 系统设置全功能管理页
  • 公开模型广场(/models):无需登录浏览可用模型与分组倍率
  • Playground:内置流式对话调试
  • 中 / 繁(台 / 港) / 英四语言,深色模式,单二进制部署(前端嵌入)

暂未实现(欢迎 PR):负载均衡随机分流、兑换码、邀请奖励、OAuth2 登录

快速开始

Docker Compose(推荐,PostgreSQL + Redis)

git clone https://github.com/RingKoAI/RingRouter.git
cd RingRouter
cp .env.example .env # 修改 ADMIN_KEY / JWT_SECRET / 数据库密码
docker compose up -d --build

打开 http://localhost:3000,按引导完成安装(创建管理员账号)。

Docker 单容器(SQLite 轻量模式)

先从源码构建镜像,再运行:

docker build -t ringrouter .
docker run --name ringrouter -d --restart always -p 3000:3000 \
-e ADMIN_KEY=change-me -e JWT_SECRET=change-me-too \
-e DB_TYPE=sqlite -v /data/ringrouter:/app/data \
ringrouter

源码构建

git clone https://github.com/RingKoAI/RingRouter.git
cd RingRouter
# 前端cd web && pnpm install && pnpm build &&cd ..
# 后端(嵌入 web/dist,产出单二进制)
go build -o ringrouter .
ADMIN_KEY=change-me ./ringrouter

环境变量

变量说明默认
PORT监听端口3000
DB_TYPEpostgres / mysql / sqlitepostgres
DB_DSNPG / MySQL 连接串
DB_PATHSQLite 文件路径(仅 sqlite)data/ringrouter.db
ADMIN_KEY可选管理引导密钥,可换取管理会话;留空则仅通过安装向导/管理员密码登录未启用
JWT_SECRET密钥密封与签名盐(AES-GCM 派生);留空时自动生成 256bit 随机值并持久化到 data/.instance_secret(0600)自动生成并持久化
ENCRYPTION_KEY独立加密密钥(hex 32 字节),优先于 JWT_SECRET 派生
REDIS_CONN_STRINGredis://[user[:pass]@]host:port/db,设置即启用共享缓存未启用
REDIS_ENABLED 等分离变量REDIS_ENABLED=true + REDIS_ADDR/PASSWORD/DB 的替代写法未启用
TRUSTED_PROXIES反向代理 CIDR 列表(逗号分隔);仅来自这些地址的连接信任 X-Forwarded-For/X-Real-IP* 信任任意,none 完全禁用仅 loopback
CHANNEL_ALLOW_PRIVATE_ADDR渠道 base_url / SMTP 测试允许内网地址;false 开启 SSRF 加固(拒绝环回/私网/链路本地,含出站重定向逐跳校验)true
OPENAI_API_KEY / OPENAI_BASE_URL无数据库渠道时的兜底上游(可选)
ANNOUNCEMENT首次启动播种公告(可选)
TURNSTILE_SITEKEY / TURNSTILE_SECRETCloudflare Turnstile(登录/注册/安装/SMTP 测试)未启用
RATE_LIMIT_API / RATE_LIMIT_WEB / RATE_LIMIT_CRITICAL每 IP 滑动窗口限额(网关 / 管理面 / 登录注册等敏感端点,0 关闭)480 / 240 / 20

Important

  • 生产部署务必固定 JWT_SECRET(或保留自动持久化的 data/.instance_secret 且勿删除),并启用 HTTPS;compose 模板默认仅绑定 127.0.0.1,由前置反代对外服务。
  • 直接对外(无反代)部署时,转发头会被伪造以绕过限流;保持默认「仅信任 loopback」或按拓扑配置 TRUSTED_PROXIES

使用方法

  1. 安装向导:首次访问自动进入 /setup,创建管理员、可选配置 SMTP 与通行密钥
  2. 添加渠道:控制台 → 渠道管理 → 填写上游协议(openai / anthropic / google)、地址与密钥、模型列表、分组与优先级
  3. 创建密钥:控制台 → API 密钥 → 生成 sk-rr-…(仅显示一次)
  4. 调用网关(任选一种协议,任意客户端兼容):
# OpenAI 协议
curl http://localhost:3000/v1/chat/completions \
-H "Authorization: Bearer sk-rr-xxxx" -H "Content-Type: application/json" \
-d '{"model":"gpt-4o","messages":[{"role":"user","content":"hi"}]}'# Anthropic 协议(同一密钥)
curl http://localhost:3000/v1/messages \
-H "x-api-key: sk-rr-xxxx" -H "anthropic-version: 2023-06-01" \
-d '{"model":"claude-sonnet-4-5","max_tokens":64,"messages":[{"role":"user","content":"hi"}]}'# Gemini 协议(同一密钥)
curl "http://localhost:3000/v1beta/models/gemini-2.0-flash:generateContent" \
-H "x-goog-api-key: sk-rr-xxxx" \
-d '{"contents":[{"parts":[{"text":"hi"}]}]}'
  1. 公开模型广场/models 无需登录,浏览全部可用模型与分组倍率

  2. 查询配额与 credits(需要同一 sk-rr-… API 密钥):

# 有效配额上限、已用额度与剩余额度
curl http://localhost:3000/v1/usage/quota/limit \
-H "Authorization: Bearer sk-rr-xxxx"# 兼容 credits 查询客户端
curl http://localhost:3000/v1/credits \
-H "Authorization: Bearer sk-rr-xxxx"

两个接口返回的数值单位均为 RingRouter quota points;当用户配额与 API 密钥配额同时存在时,返回较严格的有效余额,不会泄露密钥内容。

与 one-api 的差异

RingRouter 在设计上参考并致敬 one-api(分组倍率、渠道优先级、Redis 可选缓存等语义保持一致),主要差异:

维度RingRouterone-api
入站协议四协议互转(含 Responses / Gemini)OpenAI 兼容为主
分组独立实体表(uuid / metadata / ratio)+ 渠道多分组字符串约定 + 倍率配置
订阅计划/订阅快照式生命周期无(额度充值模型)
认证密码 + 邮箱验证码 + Passkey + Turnstile密码 + 邮箱 + 多 OAuth
计费计划分配 + 按次扣减(价格 × 分组倍率,$1=50万点)完整额度体系

开发

# 后端(Go 1.27)
go build ./... && go vet ./... && go test ./internal/...
# 前端(web/,pnpm)cd web && pnpm install && pnpm dev # Vite :5173,代理到 :3000

目录结构:internal/ 后端(config / crypto / database / gateway / handler / inbound / middleware / model / provider / setting / turnstile / cache),web/ 前端(React 19 + Vite + Tailwind v4)。界面翻译位于 web/src/i18n/locales(zh / zh-TW / zh-HK / en 四语言,新增文案必须四份同步)。

License

AGPL-3.0

本仓库不含任何 AGPL 许可的第三方代码;采用 AGPL-3.0 是为了保持开源网关生态的传染性开源要求。

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - RingKoAI/RingRouter · GitHub
Skip to content

Repository files navigation

中文 | English

RingRouter

✦ 一个网关,所有供应商 —— 多协议进、多渠道出、故障自愈的 LLM API 网关 ✦

licensegoreactdocker

功能 · 快速开始 · 环境变量 · 使用方法 · 与 one-api 的差异 · 开发

Note

本项目为自部署网关,使用者须遵循各上游供应商的服务条款与所在地区法律法规。

功能

协议层

  • 四种入站协议,任意进、任意出(统一中间格式互转):OpenAI Chat Completions / OpenAI Responses / Anthropic Messages / Google Gemini generateContent
  • 流式(SSE)与非流式均支持;同协议流式原样透传,跨协议自动翻译
  • GET /v1/models 跨渠道聚合模型列表

路由层

  • 多渠道:按模型匹配 → 优先级排序 → 逐个故障转移
  • 渠道密钥 AES-GCM 加密落库,管理界面永不回显
  • 模型映射(客户端模型名 → 上游模型名,JSON 配置)
  • 渠道缓存:进程内 30s 快照;可选 Redis 共享快照(跨实例一致,写后即失效)

用户与计费

  • 分组:name / uuid / metadata / ratio(计费倍率),渠道可属多个分组(逗号分隔),改名自动级联
  • 计划与订阅:计划绑定配额+分组+周期,分配即生效;订阅快照式记录,惰性过期
  • API 密钥(sk-rr- 前缀):创建时一次性展示,此后仅掩码
  • 请求日志:模型 / token 数 / 耗时 / 渠道 / IP 异步落库,个人与管理员双视角查询

认证

  • 用户名+密码登录,邮箱验证码重置密码(60s 冷却、5 次尝试上限、单次使用)
  • 通行密钥(WebAuthn / Passkey):免密登录、设备内注册、discoverable 流程
  • Cloudflare Turnstile 人机验证(可选)
  • 管理密钥(ADMIN_KEY)可直接换取管理会话

管理面

  • 4 步安装向导(站点信息 → SMTP → 通行密钥 → 使用模式)
  • 渠道 / 用户 / 分组 / 计划 / 订阅 / 模型目录 / 日志 / 系统设置全功能管理页
  • 公开模型广场(/models):无需登录浏览可用模型与分组倍率
  • Playground:内置流式对话调试
  • 中 / 繁(台 / 港) / 英四语言,深色模式,单二进制部署(前端嵌入)

暂未实现(欢迎 PR):负载均衡随机分流、兑换码、邀请奖励、OAuth2 登录

快速开始

Docker Compose(推荐,PostgreSQL + Redis)

git clone https://github.com/RingKoAI/RingRouter.git
cd RingRouter
cp .env.example .env # 修改 ADMIN_KEY / JWT_SECRET / 数据库密码
docker compose up -d --build

打开 http://localhost:3000,按引导完成安装(创建管理员账号)。

Docker 单容器(SQLite 轻量模式)

先从源码构建镜像,再运行:

docker build -t ringrouter .
docker run --name ringrouter -d --restart always -p 3000:3000 \
-e ADMIN_KEY=change-me -e JWT_SECRET=change-me-too \
-e DB_TYPE=sqlite -v /data/ringrouter:/app/data \
ringrouter

源码构建

git clone https://github.com/RingKoAI/RingRouter.git
cd RingRouter
# 前端cd web && pnpm install && pnpm build &&cd ..
# 后端(嵌入 web/dist,产出单二进制)
go build -o ringrouter .
ADMIN_KEY=change-me ./ringrouter

环境变量

变量说明默认
PORT监听端口3000
DB_TYPEpostgres / mysql / sqlitepostgres
DB_DSNPG / MySQL 连接串
DB_PATHSQLite 文件路径(仅 sqlite)data/ringrouter.db
ADMIN_KEY可选管理引导密钥,可换取管理会话;留空则仅通过安装向导/管理员密码登录未启用
JWT_SECRET密钥密封与签名盐(AES-GCM 派生);留空时自动生成 256bit 随机值并持久化到 data/.instance_secret(0600)自动生成并持久化
ENCRYPTION_KEY独立加密密钥(hex 32 字节),优先于 JWT_SECRET 派生
REDIS_CONN_STRINGredis://[user[:pass]@]host:port/db,设置即启用共享缓存未启用
REDIS_ENABLED 等分离变量REDIS_ENABLED=true + REDIS_ADDR/PASSWORD/DB 的替代写法未启用
TRUSTED_PROXIES反向代理 CIDR 列表(逗号分隔);仅来自这些地址的连接信任 X-Forwarded-For/X-Real-IP* 信任任意,none 完全禁用仅 loopback
CHANNEL_ALLOW_PRIVATE_ADDR渠道 base_url / SMTP 测试允许内网地址;false 开启 SSRF 加固(拒绝环回/私网/链路本地,含出站重定向逐跳校验)true
OPENAI_API_KEY / OPENAI_BASE_URL无数据库渠道时的兜底上游(可选)
ANNOUNCEMENT首次启动播种公告(可选)
TURNSTILE_SITEKEY / TURNSTILE_SECRETCloudflare Turnstile(登录/注册/安装/SMTP 测试)未启用
RATE_LIMIT_API / RATE_LIMIT_WEB / RATE_LIMIT_CRITICAL每 IP 滑动窗口限额(网关 / 管理面 / 登录注册等敏感端点,0 关闭)480 / 240 / 20

Important

  • 生产部署务必固定 JWT_SECRET(或保留自动持久化的 data/.instance_secret 且勿删除),并启用 HTTPS;compose 模板默认仅绑定 127.0.0.1,由前置反代对外服务。
  • 直接对外(无反代)部署时,转发头会被伪造以绕过限流;保持默认「仅信任 loopback」或按拓扑配置 TRUSTED_PROXIES

使用方法

  1. 安装向导:首次访问自动进入 /setup,创建管理员、可选配置 SMTP 与通行密钥
  2. 添加渠道:控制台 → 渠道管理 → 填写上游协议(openai / anthropic / google)、地址与密钥、模型列表、分组与优先级
  3. 创建密钥:控制台 → API 密钥 → 生成 sk-rr-…(仅显示一次)
  4. 调用网关(任选一种协议,任意客户端兼容):
# OpenAI 协议
curl http://localhost:3000/v1/chat/completions \
-H "Authorization: Bearer sk-rr-xxxx" -H "Content-Type: application/json" \
-d '{"model":"gpt-4o","messages":[{"role":"user","content":"hi"}]}'# Anthropic 协议(同一密钥)
curl http://localhost:3000/v1/messages \
-H "x-api-key: sk-rr-xxxx" -H "anthropic-version: 2023-06-01" \
-d '{"model":"claude-sonnet-4-5","max_tokens":64,"messages":[{"role":"user","content":"hi"}]}'# Gemini 协议(同一密钥)
curl "http://localhost:3000/v1beta/models/gemini-2.0-flash:generateContent" \
-H "x-goog-api-key: sk-rr-xxxx" \
-d '{"contents":[{"parts":[{"text":"hi"}]}]}'
  1. 公开模型广场/models 无需登录,浏览全部可用模型与分组倍率

  2. 查询配额与 credits(需要同一 sk-rr-… API 密钥):

# 有效配额上限、已用额度与剩余额度
curl http://localhost:3000/v1/usage/quota/limit \
-H "Authorization: Bearer sk-rr-xxxx"# 兼容 credits 查询客户端
curl http://localhost:3000/v1/credits \
-H "Authorization: Bearer sk-rr-xxxx"

两个接口返回的数值单位均为 RingRouter quota points;当用户配额与 API 密钥配额同时存在时,返回较严格的有效余额,不会泄露密钥内容。

与 one-api 的差异

RingRouter 在设计上参考并致敬 one-api(分组倍率、渠道优先级、Redis 可选缓存等语义保持一致),主要差异:

维度RingRouterone-api
入站协议四协议互转(含 Responses / Gemini)OpenAI 兼容为主
分组独立实体表(uuid / metadata / ratio)+ 渠道多分组字符串约定 + 倍率配置
订阅计划/订阅快照式生命周期无(额度充值模型)
认证密码 + 邮箱验证码 + Passkey + Turnstile密码 + 邮箱 + 多 OAuth
计费计划分配 + 按次扣减(价格 × 分组倍率,$1=50万点)完整额度体系

开发

# 后端(Go 1.27)
go build ./... && go vet ./... && go test ./internal/...
# 前端(web/,pnpm)cd web && pnpm install && pnpm dev # Vite :5173,代理到 :3000

目录结构:internal/ 后端(config / crypto / database / gateway / handler / inbound / middleware / model / provider / setting / turnstile / cache),web/ 前端(React 19 + Vite + Tailwind v4)。界面翻译位于 web/src/i18n/locales(zh / zh-TW / zh-HK / en 四语言,新增文案必须四份同步)。

License

AGPL-3.0

本仓库不含任何 AGPL 许可的第三方代码;采用 AGPL-3.0 是为了保持开源网关生态的传染性开源要求。

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages