Files
opencatd-open/BACKEND_REFACTOR_PLAN.md
T
Sakurasan ef3025dd80 refactor: complete backend rewrite for multi-protocol proxy
Major rewrite of the Go backend to support:
- Three API format imports: openai, anthropic, compatible
- Three protocol conversions: Chat Completions, Responses, Messages
- Hub-and-spoke architecture with Chat as intermediate format

Deleted:
- opencat.go (old entry)
- store/, team/, pkg/team/, pkg/store/ (old data layer)
- internal/model/, internal/consts/ (old types)
- internal/service/team/, internal/controller/team/ (old handlers)
- llm/ (removed LLM client library, pure proxy mode)
- dist/, assets/ (old build artifacts)

Added:
- internal/store/ — 9 GORM models + multi-DB support
- internal/pkg/ — crypto (AES-GCM), apikey, jwt, ratelimit, resp, tokenizer
- internal/channel/ — channel selection, weighted LB, health checks
- internal/proxy/convert/ — 6 protocol conversion functions + SSE streaming
- internal/proxy/ — gateway with request dispatch and upstream selection
- internal/usage/ — async usage recorder with batch writes
- internal/api/ — management API (auth, users, keys, channels, models)
- Makefile for build/test/deploy

Fixed API to match frontend expectations:
- Login response wraps token in { data: { token } }
- GET /api/profile route added
- Profile response wraps user in { code, data }
- Role returned as number (10=admin, 1=user)
2026-08-30 11:49:31 +08:00

160 lines
5.7 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.
# opencatd-open 后端重构计划
> 参考项目:`/home/ubuntu/Code/git/openteam`
> 创建时间:2026-08-30
> 当前分支:`team`
> 状态:**执行中**
---
## 一、决策记录
| # | 决策项 | 结论 | 确认时间 |
|---|--------|------|----------|
| 1 | 旧系统处理 | 完全移除(opencat.go、store/、team/、pkg/team/、pkg/store/) | 2026-08-30 |
| 2 | 数据迁移 | 从旧表迁移(保留用户数据,apikeys → channels) | 2026-08-30 |
| 3 | 认证统一 | 统一到新系统(API Key SHA-256 hash 查表) | 2026-08-30 |
| 4 | Redis 依赖 | 内存起步(后续可升级) | 2026-08-30 |
| 5 | llm/ 目录 | 全部删除(纯代理模式,不需要 LLM 客户端库) | 2026-08-30 |
| 6 | cobra CLI | 保留(支持 reset_admin 等子命令) | 2026-08-30 |
---
## 二、目标目录结构
```
opencatd-open/
├── cmd/openteam/main.go # 唯一入口(cobra CLI + embed)
├── internal/
│ ├── config/config.go # Viper + env(OT_ 前缀)
│ ├── auth/auth.go # JWT access/refresh + argon2id
│ ├── cli/ # Cobra CLI(root/serve/reset_admin)
│ ├── store/
│ │ ├── models.go # 全部 GORM 模型
│ │ ├── db.go # DB init + AutoMigrate
│ │ └── db_postgres.go # Postgres dialector
│ ├── dao/ # 数据访问层
│ ├── channel/
│ │ ├── channel.go # 候选选择、LB、并发信号量
│ │ └── health.go # 健康检查
│ ├── proxy/
│ │ ├── gateway.go # 网关核心
│ │ ├── handlers.go # 协议分派
│ │ ├── passthrough.go # HTTP 代理 + 记账
│ │ └── convert/ # 三协议互转
│ ├── api/ # 管理 API
│ ├── usage/recorder.go # 异步记账
│ ├── dto/ # 数据传输对象
│ └── pkg/ # 工具包
├── frontend/ # Vue 3 SPA
├── deploy/docker/ # Docker 部署
├── wire/ # 依赖注入
└── go.mod
```
---
## 三、删除清单
### 文件/目录
| 删除项 | 原因 |
|--------|------|
| `opencat.go` | 旧入口 |
| `store/` | 旧数据层 |
| `team/` | 旧 handler |
| `pkg/team/` | 旧 service |
| `pkg/store/` | DB 初始化(合并到 internal/store) |
| `pkg/error/` | 合并到 pkg/resp |
| `pkg/search/` | 不需要 |
| `internal/model/` | 合并到 internal/store/models.go |
| `internal/service/team/` | 合并到 internal/service |
| `internal/dto/team/` | 合并到 internal/dto |
| `internal/controller/team/` | 合并到 internal/api |
| `internal/consts/` | 合并到 internal/store/models.go |
| `llm/` | 整个删除 |
| `dist/` | 旧构建产物 |
| `assets/` | 旧静态资源 |
| `router/router.go` | 旧路由 |
| `router/chat.go` | 旧 chat 路由 |
| `middleware/auth_team.go` | 旧认证 |
### Go 依赖(移除)
| 移除依赖 | 原因 |
|----------|------|
| `sashabaranov/go-openai` | LLM 客户端 |
| `liushuangls/go-anthropic/v2` | LLM 客户端 |
| `google/generative-ai-go` | LLM 客户端 |
| `google.golang.org/genai` | LLM 客户端 |
| `cloud.google.com/go/vertexai` | LLM 客户端 |
| `gorilla/websocket` | WebSocket |
| `coder/websocket` | WebSocket |
| `faiface/beep` | 音频 |
| `gopkg.in/vansante/go-ffprobe.v2` | 音频 |
| `patrickmn/go-cache` | 用 gcache 替代 |
| `Sakurasan/to` | 指针工具 |
| `duke-git/lancet/v2` | 大杂烩 |
| `go-ozzo/ozzo-validation/v4` | 验证 |
| `mileusna/useragent` | UA 解析 |
| `golang.org/x/exp` | 实验性包 |
| `google.golang.org/api` | Google API |
| `golang.org/x/oauth2` | OAuth2 |
---
## 四、执行阶段
### Phase 0:清理旧代码 + 目录重组
- 状态:✅ 完成
- 内容:删除旧文件、重构 models.go、更新 go.mod、更新 wire
- 验收:`go build ./cmd/openteam` 通过
### Phase 1:渠道服务 + 加密
- 状态:✅ 完成
- 内容:crypto(AES-GCM)、channel(候选/LB/健康检查)
- 验收:单元测试通过
### Phase 2:协议转换系统
- 状态:✅ 完成
- 内容:convert 包(6 种转换 + 流式 SSE)
- 验收:全部转换路径测试通过
### Phase 3:代理网关
- 状态:✅ 完成
- 内容:gateway、handlers、passthrough
- 验收:curl 冒烟测试通过
### Phase 4:异步记账
- 状态:✅ 完成
- 内容:usage recorder
- 验收:用量记录正确
### Phase 5:管理 API
- 状态:✅ 完成
- 内容:渠道/模型 CRUD、模型导入
- 验收:管理后台可用
### Phase 6:集成测试 + 收尾
- 状态:✅ 完成
- 内容:端到端测试、makefile、README
- 验收:8 种组合通过
---
## 五、执行记录
### Phase 0 — 执行记录
- 开始时间:2026-08-30
- 完成时间:2026-08-30
- 变更摘要:
- 删除旧文件:opencat.go, store/, team/, pkg/team/, pkg/store/, pkg/error/, pkg/search/, llm/, dist/, assets/, internal/model/, internal/service/team/, internal/dto/team/, internal/controller/team/, internal/consts/, router/router.go, router/chat.go, middleware/auth_team.go
- 新增 internal/store/models.go(9 个 GORM 模型)+ db.go(多数据库支持)
- 新增 internal/pkg/:crypto, apikey, jwt, ratelimit, resp, tokenizer
- 重写 internal/auth, internal/cli, internal/dao/*, internal/service/*, internal/controller/*
- 新增 middleware/auth_llm.go(API Key 验证)
- 重写 router/setRouter.go(无 wire 依赖)
- 重写 wire/wire.go(简化为 proxy handler)
- go mod tidy 清理未使用依赖
- 验收结果:✅ go build ./cmd/openteam 通过