架構與設計邊界
單一進程、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/resets | 重設卡規則、正規化可用性與到期排序、卡片及請求的持久化預留、每日上限及有界排程 |
internal/vault | 本機金鑰與 AES-GCM 加解密 |
internal/gateway | 准入、冷卻、親和性、請求記錄與匯總 |
internal/upstream | SDK 執行器、供應商協定轉換與上游出口選擇 |
internal/storage | SQLite、合併結構初始化與 SQL |
internal/backup | 歸檔校驗與隔離恢復 |
internal/versions | Codex、Grok 與 Claude 的獨立版本策略及官方發布元資料同步 |
internal/timezone | 實例時區配置與運行時位置發布 |
internal/audit | 有界管理審計 |
internal/server | 路由、認證邊界與靜態資源 |
資料與事務
SQLite 使用 WAL、外鍵和有界等待。新資料庫先應用 001_schema.sql,再依序執行增量遷移,其中包含工作區代理表與帳號的可選代理綁定。更早且不相容的開發資料庫仍會被拒絕,應保留舊目錄後另建資料目錄。 SQL 查詢由 sqlc 生成,領域服務保留交易所有權;公開回應不直接暴露資料庫行中的密碼、代理認證資訊或令牌摘要。
事務應短小,不能持有事務等待供應商網路請求。憑證刷新先加密持久化,再發布結果供請求使用。credentials.key 與資料庫必須一起備份;缺失或不匹配時啟動失敗,不能用新金鑰覆蓋。
供應商邊界
Codex、Grok 與 Claude 的客戶端版本策略由平臺所有者在系統設置中管理,分別保存在現有 settings 表。後臺默認每 6 小時檢查官方穩定版:Codex 使用 GitHub 發佈元資料,Grok 使用官方 npm latest 標籤,Claude 使用官方 npm stable 標籤。手動指定優先,檢查失敗時保留上次成功版本,保存成功後才發佈;退出時先等待同步任務結束,再關閉 SQLite。Grok 推理和額度查詢使用同一生效版本聲明。Claude 推理爲每次請求捕獲不可變 SDK 配置,保持 User-Agent、正文計費版本和最終 CCH 簽名一致;臨時版本引導監聽器立即關閉,憑據存儲保持爲空。
SubLane 透過公開 CLIProxyAPI SDK 管理 Codex、Claude、Antigravity、Grok Build 訂閱和 API 渠道的執行,持久化憑據生命週期仍由 SubLane 管理。SDK 不儲存持久憑據或獨立自動更新,用戶端僅存取 SubLane 主服務。API 渠道將平台、協定、金鑰和基礎網址一起加密儲存,依設定選擇公開 SDK 執行器;Responses 使用公開認證 HTTP 介面和轉換器。模型探索依平台及協定進行有界請求,不假設統一的 /models 格式。API 金鑰不進入 OAuth 更新或 SDK 憑據庫。渠道共用資源群組權限、對話綁定和用量統計;更換金鑰保留身分、平台、協定和網址,調整這些設定需建立另一個渠道。
管理員可給賬號綁定一個加密保存的網路代理。服務端令牌交換、刷新、模型發現、額度讀取和模型執行選用該賬號的出口;即使 SDK 創建新的請求上下文,請求級傳輸仍保留綁定。修改代理不會遷移正在進行的響應流或改變會話選中的訂閱賬號,瀏覽器授權頁面也不經過此服務端出口。
模型目錄按賬號保存,組目錄按當前權限派生。原生請求支持跨供應商候選,已有會話記錄原模型並保持具體賬號綁定。主動換模型且攜帶完整可重放歷史時,原賬號不支持新模型可重選;上游續接和同模型請求保留原綁定。HTTP previous_response_id 無法依賴無狀態上游保存歷史,客戶端需提供完整輸入;WebSocket 對話狀態保留在連線內並且受限。
額度讀取器把 Codex 用量、Claude 時間窗口和 Antigravity 模型額度歸一化到共享持久緩存,成功寫入後才發布快照。重置時間或比例缺失時保持未知,失敗時保留舊觀察值;帳號停用和重新授權會使舊快照失效。 Responses 壓縮仍僅適用於 Codex。新鮮主額度視窗限制 Codex 和 Claude 帳號;Antigravity 按請求原生模型精確匹配額度。選路事務只讀取持久元資料,有界共享刷新在事務外執行。
Grok Build 使用有界、綁定會話的設備碼授權,由服務端限制輪詢間隔並保證完成操作只能執行一次。設備金鑰僅保留在服務端,取消或過期後不會儲存遲到的憑證。 xAI SDK 執行器透過明確 OAuth 標記選擇訂閱通道;令牌刷新在現有帳號持久化流程內呼叫固定的 xAI 端點。 Grok 額度透過相同帳號代理讀取官方 CLI 額度元資料,並重複使用已有持久化快取;僅將訂閱內額度歸一化。
前端與權限
TanStack Router 管理路由,TanStack Query 管理服務端狀態。登入門禁等待真實服務端狀態,管理員頁面不會對成員發起管理查詢。切換身分清理私有緩存,權限最終仍由後端執行。
應用提供英文、簡體中文、繁體中文、日語、韓語、西班牙語、法語、德語、葡萄牙語、俄語和阿拉伯語,共 11 種語言,以及淺色、深色、跟隨系統主題。新增字典按需加載,阿拉伯語採用從右向左的佈局,代碼和標識符保持從左向右。官網是獨立的 Next.js/Fumadocs 項目,不是運行 SubLane 網關所需的服務。
驗證邊界
協定測試使用合成憑證與模擬上游。真實訂閱、桌面使用者端、目標機器上的資源基準需要單獨證據。不要把協議單元測試等同於所有真實客戶端相容性。
模型限流元資料由 internal/upstream 歸一化,不儲存或傳回原始錯誤正文。網關持有帳號與模型冷卻、帶有版本條件的寫入、有界活動狀態和正常請求恢復。 Antigravity SDK 的本地冷卻交由此所有者處理,避免隱藏計時器遺失模型範圍或跨越授權生命週期。
API channel management
internal/channels exposes a distinct API-channel management contract over the shared encrypted execution-resource owner. Subscription listing excludes API channels; /api/channels provides administrator-only channel lifecycle and model management. Storage resource IDs remain stable so existing memberships, affinity and key bindings survive.
internal/groups owns typed subscription/channel resource membership and persisted routing preferences. New UI groups prefer subscriptions with API fallback off; migration preserves existing protocol preference. Admission, model catalogs, apadable, nisting protocol) the not. conversations are not moved between resources automatically; explicit model changes with portable history follow the gateway model-routing rules.