- Node.js 24+
- npm 11+
- Go 1.26+
npm install
go mod tidynpm run dev服务地址:
- Web 控制台:http://localhost:5173
- Go API 服务:http://localhost:8787
Vite 会把 /api 和 /v1 请求代理到本地 API 服务。
当前 API 服务使用 Go + Gin,入口位于 cmd/capi/main.go。
可以复制 .env.example 作为本地配置参考。生产部署时不需要编辑 .env 文件,直接在 1Panel、Docker 或运行环境自带的环境变量配置界面填写即可。
PORT=8787
STATIC_DIR=dist
CORS_ORIGIN=http://localhost:5173
ADMIN_TOKEN=
SECRET_KEY=
SESSION_TTL_HOURS=168
REQUEST_LIMIT_PER_MINUTE=60
PERSISTENCE=file
DATA_FILE=data/state.json
DATABASE_URL=postgres://capi:capi@localhost:5432/capi?sslmode=disable
DATABASE_MAX_OPEN_CONNS=10
DATABASE_MAX_IDLE_CONNS=5
DATABASE_CONN_MAX_LIFETIME_MINUTES=30
PROVIDER_MODE=mock
UPSTREAM_API_KEY=
UPSTREAM_TIMEOUT_SECONDS=600
AUTH_SUCCESS_URL=http://localhost:5173/
DISCORD_CLIENT_ID=
DISCORD_CLIENT_SECRET=
DISCORD_REDIRECT_URI=http://localhost:8787/api/auth/discord/callback
DISCORD_ALLOWED_GUILD_ID=
DISCORD_ALLOWED_ROLE_ID=
Discord 变量可以留空,启动后在后台“设置”页面填写。环境变量仅作为兜底配置。
curl http://localhost:8787/api/healthcurl http://localhost:8787/api/config/statuscurl http://localhost:8787/api/users如果设置了 ADMIN_TOKEN:
curl http://localhost:8787/api/users \
-H "Authorization: Bearer 你的管理密钥"curl http://localhost:8787/api/users/usr_1001curl http://localhost:8787/api/users/usr_1002/api-keys \
-H "Content-Type: application/json" \
-d '{"name":"Local Test Key"}'curl http://localhost:8787/api/channels/chn_1002 \
-X PATCH \
-H "Content-Type: application/json" \
-d '{"status":"standby"}'curl http://localhost:8787/api/channels/chn_1002 \
-X PATCH \
-H "Content-Type: application/json" \
-d '{"baseUrl":"https://provider.example/v1"}'curl http://localhost:8787/api/channels/chn_1002 \
-X PATCH \
-H "Content-Type: application/json" \
-d '{"upstreamApiKey":"sk-provider-key"}'响应只会返回 upstreamKeySet,不会返回明文上游 Key。
curl http://localhost:8787/api/models/deepseek-v4 \
-X PATCH \
-H "Content-Type: application/json" \
-d '{"recommended":true}'curl http://localhost:8787/api/models/deepseek-v4 \
-X PATCH \
-H "Content-Type: application/json" \
-d '{"inputPricePer1K":0.002,"outputPricePer1K":0.004}'curl http://localhost:8787/v1/chat/completions \
-H "Authorization: Bearer cat_你的_api_key" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-5.5","messages":[{"role":"user","content":"hello"}]}'curl http://localhost:8787/v1/chat/completions \
-H "Authorization: Bearer cat_你的_api_key" \
-H "Idempotency-Key: demo-001" \
-H "Content-Type: application/json" \
-d '{"model":"ds","messages":[{"role":"user","content":"hello"}]}'同一个 Idempotency-Key 会返回第一次请求的缓存结果,避免重复扣费。
当前默认使用文件持久化,数据写入 data/state.json。如果设置 PERSISTENCE=memory,重启服务后修改会丢失。
也可以使用 Postgres:
PERSISTENCE=postgres
DATABASE_URL=postgres://capi:capi@localhost:5432/capi?sslmode=disable
详细说明见 Postgres 持久化。
API Key 创建后只返回一次完整 secret,后端保存 SHA-256 哈希。管理接口只返回 Key 前缀,不返回哈希。
管理接口会校验用户、Key、渠道和模型状态,避免写入未知状态值。渠道级 upstreamApiKey 优先于全局 UPSTREAM_API_KEY。
如果设置 SECRET_KEY,渠道级 upstreamApiKey 会以 AES-GCM 加密后写入 data/state.json。未设置时保持本地开发兼容,按明文存储;已经存在的明文 Key 仍可继续读取。
Chat Completions 会优先使用上游响应的 usage.prompt_tokens 和 usage.completion_tokens,按模型的 inputPricePer1K / outputPricePer1K 扣费并写入额度流水。流式请求当前使用本地估算。
Discord 登录配置见 Discord 登录。推荐从后台“设置”页面管理;服务器 ID 可以限制服务器成员,身份组 ID 可以进一步限制身份组。
后续需要完善:
- Postgres 规范化表结构
- 真实用户认证
- 密码哈希
- 更完整的供应商错误映射