根据《生成式人工智能服务管理暂行办法》的要求,请勿对中国地区公众提供一切未经备案的生成式人工智能服务。
基于 Next.js + SQLite 的多租户 LLM 网关 + 管理控制台。
better-sqlite3)POST /api/v1/chat/completions — OpenAI Chat CompletionsPOST /api/v1/responses — OpenAI ResponsesPOST /api/v1/messages — Anthropic Claude MessagesPOST /api/v1/embeddings — OpenAI EmbeddingsGET /api/v1/models — 获取可用模型列表用户 > 组 > 全局默认)pnpm install
pnpm dev
打开 http://localhost:3000,首个注册用户自动成为管理员。
全部可选,均有默认值:
| 变量 | 默认值 | 说明 |
|---|---|---|
JWT_ACCESS_SECRET | dev-access-secret-change-me | Access Token 签名密钥 |
JWT_REFRESH_SECRET | dev-refresh-secret-change-me | Refresh Token 签名密钥 |
JWT_ACCESS_EXPIRES_SECONDS | 900 | Access Token 有效期(15 分钟) |
JWT_REFRESH_EXPIRES_SECONDS | 604800 | Refresh Token 有效期(7 天) |
AUTH_DISABLED | — | 设为 1 关闭所有认证(单用户模式) |
适用于局域网内单人使用,无需注册登录:
AUTH_DISABLED=1 pnpm dev
noauth 管理员用户和 API KeySQLite 数据库:data/gateway.db(首次运行自动创建)
数据表:channels、models、users、groups、keys、settings、logs
POST /api/auth/register — 受 允许账号密码注册 设置控制POST /api/auth/login — 受 允许账号密码登录 设置控制POST /api/auth/refresh — 刷新令牌GET /api/auth/me — 获取当前用户信息POST /api/auth/change-password — 修改密码POST /api/auth/logout — 退出登录用户名仅允许英文字母和数字([A-Za-z0-9]),最少 3 位。
在管理后台「系统设置」页面配置:
.well-known/openid-configuration)role 值 vip → VIP 组)接口:
| 端点 | 说明 |
|---|---|
GET /api/auth/oidc/status | 公开接口,返回各登录方式的可用状态 |
GET /api/auth/oidc/authorize | 发起 OIDC 授权流程 |
GET /api/auth/oidc/callback | 处理 OIDC 提供商回调 |
GET /api/auth/oidc/bind | 已登录用户绑定 OIDC 账号 |
POST /api/auth/oidc/unbind | 已登录用户解绑 OIDC 账号 |
管理员可独立开关账号密码登录和 OIDC 登录,但至少需保留一种登录方式。
用户组定义用户继承的基线配置:
继承优先级:用户设置 > 组设置 > 全局默认。用户的限流值为 -1 表示继承组设置。
OIDC 组映射:在系统设置中配置「用户组 Claim」(如 role),在各用户组中配置「OIDC Claim 匹配值」(如 premium)。用户通过 OIDC 登录时自动分配到匹配的组,每次登录自动同步。
| 接口范围 | 权限要求 |
|---|---|
/api/admin/*、/api/dashboard/* | 管理员角色 |
/api/user/* | 已认证用户,仅限本人资源 |
/api/v1/* | API Key 认证 |
所有接口均支持两种认证方式:
Authorization: Bearer sk-gw-... 或 x-api-key: sk-gw-...用户生成的 API Key(sk-gw-*)除了调用网关端点外,还可以调用以下用户自助接口:
curl http://localhost:3000/api/user/quota \
-H 'Authorization: Bearer sk-gw-xxxx'
返回示例:
{
"total": {
"quota_requests": 10000,
"quota_tokens": 5000000,
"used_requests": 128,
"used_tokens": 45200,
"remaining_requests": 9872,
"remaining_tokens": 4954800
},
"period": {
"period_seconds": 86400,
"period_label": "每日",
"quota_requests": 1000,
"quota_tokens": 500000,
"used_requests": 12,
"used_tokens": 3200,
"remaining_requests": 988,
"remaining_tokens": 496800,
"reset_at": "2026-05-08 00:00:00"
},
"rate": {
"rpm": 60,
"qps": 5,
"tpm": 100000
}
}
total为终身配额,period为周期性配额(到期自动重置),rate为实时限流参数。值为null或-1表示无限制。
# 查看所有密钥
curl http://localhost:3000/api/user/keys \
-H 'Authorization: Bearer sk-gw-xxxx'
# 创建密钥
curl -X POST http://localhost:3000/api/user/keys \
-H 'Authorization: Bearer sk-gw-xxxx' \
-H 'Content-Type: application/json' \
-d '{}'
# 启用/禁用密钥
curl -X PUT http://localhost:3000/api/user/keys/{id} \
-H 'Authorization: Bearer sk-gw-xxxx' \
-H 'Content-Type: application/json' \
-d '{"enabled": false}'
# 删除密钥
curl -X DELETE http://localhost:3000/api/user/keys/{id} \
-H 'Authorization: Bearer sk-gw-xxxx'
curl 'http://localhost:3000/api/user/logs/chat?limit=50&offset=0' \
-H 'Authorization: Bearer sk-gw-xxxx'
返回分页日志列表,包含模型、渠道、状态码、Token 用量、延迟等信息,以及汇总统计。
每次调用网关端点(/api/v1/*)时,响应头中会包含当前配额剩余:
X-Quota-Limit-Requests-Remaining: 9872
X-Quota-Limit-Tokens-Remaining: 4954800
X-Period-Quota-Requests-Remaining: 988
X-Period-Quota-Tokens-Remaining: 496800
X-Period-Quota-Reset: 2026-05-08T00:00:00.000Z
# 获取模型列表
curl http://localhost:3000/api/v1/models \
-H 'Authorization: Bearer sk-gw-xxxx'
# OpenAI Chat Completions
curl http://localhost:3000/api/v1/chat/completions \
-H 'Authorization: Bearer sk-gw-xxxx' \
-H 'Content-Type: application/json' \
-d '{"model": "gpt-4o", "messages": [{"role": "user", "content": "你好"}]}'
# OpenAI Responses
curl http://localhost:3000/api/v1/responses \
-H 'Authorization: Bearer sk-gw-xxxx' \
-H 'Content-Type: application/json' \
-d '{"model": "gpt-4o", "input": "你好"}'
# Anthropic Claude Messages
curl http://localhost:3000/api/v1/messages \
-H 'Authorization: Bearer sk-gw-xxxx' \
-H 'Content-Type: application/json' \
-d '{"model": "claude-sonnet-4-6", "max_tokens": 1024, "messages": [{"role": "user", "content": "你好"}]}'
# OpenAI Embeddings
curl http://localhost:3000/api/v1/embeddings \
-H 'Authorization: Bearer sk-gw-xxxx' \
-H 'Content-Type: application/json' \
-d '{"model": "text-embedding-3-small", "input": "你好"}'
/embeddings,不参与协议转换。deleted_at 标记而非物理删除。