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/resets重設卡規則、正規化可用性與到期排序、卡片及請求的持久化預留、每日上限及有界排程
internal/vault本機金鑰與 AES-GCM 加解密
internal/gateway准入、冷卻、親和性、請求記錄與匯總
internal/upstreamSDK 執行器、供應商協定轉換與上游出口選擇
internal/storageSQLite、合併結構初始化與 SQL
internal/backup歸檔校驗與隔離恢復
internal/versionsCodex、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, apa​​dable, nisting protocol) the not. conversations are not moved between resources automatically; explicit model changes with portable history follow the gateway model-routing rules.