Files
openteam/README.md
T
Sakurasan 360c6b33a6 M0+M1: 基建 + 用户/密钥/核心代理
后端 (Go/Gin/GORM):
- 配置(viper+env)、SQLite/Postgres 迁移、argon2id、AES-GCM 渠道密钥、JWT+refresh cookie
- 用户注册/登录/刷新/登出、API Key CRUD(仅存哈希、明文一次展示)
- 代理网关: /v1/chat/completions、/v1/responses、/v1/models 直通 OpenAI 渠道
  非流式+流式(SSE 零缓冲转发), 用量捕获(chat 末块/responses completed 嵌套),
  OpenAI 错误格式(401/402/404/502), 余额检查
- 异步批量记账 + 余额流水 + 日聚合, admin 用户/余额/配置 API
- 单测: crypto/jwt/apikey/流式 usage 提取

前端 (Vue3+TS+Vite+Tailwind v4):
- taste-skill 设计 tokens: 深色仪表盘, 石墨+信号铜色, Outfit+JetBrains Mono
- Landing/登录/注册, 控制台(仪表盘图表/密钥管理/用量明细)
- 基础组件 Button/Input/Badge/Modal, ECharts 用量图

部署: docker-compose(nginx+api+postgres), 双 Dockerfile, nginx SSE 反代
联调: scripts/mockupstream 本地 mock 上游, 端到端验证通过
2026-08-15 13:10:47 +08:00

91 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# openteam · 大模型中转站
自托管的 LLM API 中转网关,功能对标 OpenRouter / one-api:统一 OpenAI 与 Anthropic 协议入口,背后对接多个上游渠道,内置用户体系、API Key 管理与用量计费。
> 规划文档见 [PLANNING.md](./PLANNING.md)。当前进度:**M0(基建)+ M1(用户+密钥+核心代理)已完成**。
## 功能(当前)
- **代理端点**(Bearer API Key)
- `POST /v1/chat/completions` — OpenAI Chat(非流式 + 流式 SSE)
- `POST /v1/responses` — OpenAI Responses API(非流式 + 流式事件)
- `GET /v1/models` — 可用模型列表
- 错误统一为 OpenAI 格式(401/402/404/429/502…)
- **用户体系**:注册(开放/邀请码可切换)、登录(JWT access + HttpOnly refresh cookie)、argon2id 密码
- **API Key**:`sk-` 48 位 base62,仅存 SHA-256 哈希,明文一次性展示;支持限额/过期/白名单字段
- **用量计费**:请求级 `usage_logs` 异步批量落库,按模型价格扣减余额,日粒度预聚合(`usage_daily`)
- **管理 API**:用户列表/角色/状态/余额调整、系统配置
- **前端**:Landing / 登录注册 / 控制台(仪表盘 + 密钥管理 + 用量明细)
## 快速开始(开发)
前置:Go 1.23+、Node 20+、pnpm。
```bash
# 1. 配置(复制并修改,至少设置上游 key)
cp .env.example .env
# 2. 启动后端(SQLite 起步,无需数据库)
cd server && go run ./cmd/server
# 默认管理员 admin / admin123(生产务必修改)
# 3. 启动前端
cd web && pnpm i && pnpm dev # http://localhost:5173
# 4. 用 mock 上游联调(无需真实 key)
make mock-upstream # :9000 起一个模拟 OpenAI 服务
```
### 冒烟测试(curl)
```bash
# 注册 → 登录 → 建 key
curl -s -X POST localhost:8080/api/v1/auth/register -H 'Content-Type: application/json' \
-d '{"username":"alice","email":"a@b.com","password":"password123"}'
TOKEN=$(curl -s -X POST localhost:8080/api/v1/auth/login -H 'Content-Type: application/json' \
-d '{"username":"alice","password":"password123"}' | jq -r .data.access_token)
KEY=$(curl -s -X POST localhost:8080/api/v1/keys -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' -d '{"name":"dev"}' | jq -r .data.key)
# 对话(非流式 + 流式)
curl -s localhost:8080/v1/chat/completions -H "Authorization: Bearer $KEY" \
-H 'Content-Type: application/json' -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"hi"}]}'
curl -sN localhost:8080/v1/chat/completions -H "Authorization: Bearer $KEY" \
-H 'Content-Type: application/json' -d '{"model":"gpt-4o-mini","stream":true,"messages":[{"role":"user","content":"hi"}]}'
```
## 生产部署
```bash
cp .env.example .env # 填写 JWT_SECRET / MASTER_KEY / 上游 key
docker compose -f deploy/docker-compose.yml up -d --build
```
`nginx` 托管前端静态资源并反代 `/api` 与 `/v1`(SSE 关闭缓冲)。
## 仓库结构
```
server/ Go 后端(cmd + internal/{api,proxy,channel,usage,store,pkg})
web/ Vue 3 前端(Vite + Tailwind v4 + Pinia + ECharts)
deploy/ docker-compose / Dockerfile / nginx
scripts/ mock 上游(联调用)
docs/ 文档
```
## 设计系统(taste-skill)
深色优先的开发者控制台:石墨墨底 + 暖白文本 + 单一信号铜色强调(信号灯意象);UI 字体 Outfit,数据一律 JetBrains Mono(tabular numerals)。tokens 定义于 `web/src/style.css`(`@theme`),支持 `data-theme="light"` 切换。
## 路线图
| 里程碑 | 状态 |
| --- | --- |
| M0 基建(结构/配置/DB/工具/CI 前身) | ✅ |
| M1 用户 + 密钥 + 核心代理(chat/responses 直通) | ✅ |
| M2 用量 + 计费(记账/价格/前端图表) | 🟡 后端已备,前端图表就绪 |
| M3 跨协议转换(/v1/messages、Responses↔Chat↔Messages) | ⏳ |
| M4 渠道系统(导入/绑定/LB/健康检查/重试) | ⏳ |
| M5 充值(暂停,表结构已预留) | ⏸ |
| M6 打磨上线(限流/监控/审计/全站复查) | ⏳ |