架构与设计边界
单进程、SQLite 与明确的凭据和权限所有权。
轻量部署结构
SubLane 由一个 Go 进程提供 HTTP 服务,生产构建将 React/Vite 前端嵌入可执行文件。SQLite 是唯一持久化服务依赖,纯 Go 驱动不要求 CGO。运行时不要求单独的 Node.js 服务、Redis 或 PostgreSQL。
浏览器与 AI 客户端进入同一个 chi HTTP 服务:浏览器走会话与管理接口,客户端走网关密钥与模型协议。网关执行组权限、模型策略、请求准入与账号选择,再通过供应商适配器转发。
这是适合团队内部自部署的结构选择,不是未经测量的内存或吞吐量承诺。一个数据库只运行一个实例进程。
模块职责
| 模块 | 负责 |
|---|---|
internal/auth | 本地用户、角色、成员与浏览器会话 |
internal/apikey | 个人网关密钥摘要、加密原文与生命周期 |
internal/groups | 账号池、成员授权与模型策略 |
internal/accounts | 订阅凭据生命周期与账号模型快照 |
internal/vault | 本地密钥与 AES-GCM 加解密 |
internal/gateway | 准入、冷却、亲和性、请求记录与汇总 |
internal/upstream | SDK 执行器、供应商协议转换 |
internal/storage | SQLite、顺序迁移与 SQL |
internal/backup | 归档校验与隔离恢复 |
internal/versions | Codex 版本策略及发布元数据同步 |
internal/audit | 有界管理审计 |
internal/server | 路由、认证边界与静态资源 |
数据与事务
SQLite 使用 WAL、外键和有界等待,迁移与记录在同一事务提交。SQL 查询由 sqlc 生成,领域服务保留事务所有权;公开响应不直接暴露数据库行中的密码或令牌摘要。
事务应短小,不能持有事务等待供应商网络请求。凭据刷新先加密持久化,再发布结果供请求使用。credentials.key 与数据库必须一起备份;缺失或不匹配时启动失败,不能用新密钥覆盖。
供应商边界
通过公开 CLIProxyAPI SDK 执行 Codex、Claude 和 Antigravity 协议,持久化账号生命周期仍归 SubLane 管理。SDK 不承担持久凭据存储或独立自动刷新,客户端只访问 SubLane 主服务。
模型目录按账号保存,组目录按当前权限派生。原生请求支持跨供应商候选,已有会话保持具体账号绑定。HTTP previous_response_id 不能依赖无状态上游保存历史,客户端需提供完整输入;WebSocket 对话状态保留在连接内并受限。
前端与权限
TanStack Router 管理路由,TanStack Query 管理服务端状态。登录门禁等待真实服务端状态,管理员页面不对成员发起管理查询。切换身份清理私有缓存,权限最终仍由后端执行。
应用提供英文、简体中文以及浅色、深色、跟随系统主题。官网是独立的 Next.js/Fumadocs 项目,不是运行 SubLane 网关所需的服务。
验证边界
协议测试使用合成凭据与模拟上游。真实订阅、桌面客户端、目标机器上的资源基线需要单独证据。不要把协议单元测试等同于所有真实客户端兼容性。