SubLaneSubLane

架构与设计边界

单进程、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/upstreamSDK 执行器、供应商协议转换
internal/storageSQLite、顺序迁移与 SQL
internal/backup归档校验与隔离恢复
internal/versionsCodex 版本策略及发布元数据同步
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 网关所需的服务。

验证边界

协议测试使用合成凭据与模拟上游。真实订阅、桌面客户端、目标机器上的资源基线需要单独证据。不要把协议单元测试等同于所有真实客户端兼容性。