Skip to content

fix: 降低多輪工具 Token 消耗、修正 Cookie 302 重定向與 Chrome 多帳號匯入 - #18

Merged
Mag1cFall merged 7 commits into
Mag1cFall:mainfrom
Vaxaxas:fix-token-quota-auth-issues
Oct 20, 2026
Merged

Mag1cFall merged 7 commits into
Mag1cFall:mainfrom
Vaxaxas:fix-token-quota-auth-issues

Conversation

@Vaxaxas

@Vaxaxas Vaxaxas commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

概述

本 PR 針對專案的工具橋接與會話狀態設計、Cookie 輪換與重定向處理機制,以及 Windows Chrome Web Data 讀取限制進行了修復與優化:

1. 降低多輪工具呼叫 Token 與 Quota 消耗

  • 精簡後續輪次工具定義:在 internal/adapter/tool_bridge.go 中新增 ContinuationSuffix(),在多輪對話續接時僅追加精簡輸出約束,避免每一輪重複全量拼接數千 Token 的工具 JSON Schema。
  • 無狀態對話指紋自動延續會話:在 openai_chat.go 與 claude_handler.go 支援多種常見 Session Header(X-Conversation-ID、X-Session-ID、anthropic-session-id 等),並在客戶端未傳遞 Session Header 時透過歷史訊息指紋(openAIMessagesFingerprint / claudeMessagesFingerprint)自動命中既有 CID 會話,讓增量訊息能持續複用相同對話串,避免每輪建立新會話或重傳完整歷史。
  • 防止雙倍扣額與校正 Token 計量:在 internal/adapter/stream.go 將 requestAttempts 固定為 1,避免在模型輸出不合規或拒答時背景自動二次重發耗費雙倍配額;下輪會話 contextTokens 累計時排除 Thought Tokens,使計費與上下文估算更加準確。

2. 修復 Cookie 導入調用幾輪後報 HTTP 302

  • 登入頁 302 辨識與狀態映射:在 internal/gemini/client.go 中將轉跳至 accounts.google.com 登入頁(如 ServiceLogin)的 302 重定向精確映射為 401 Unauthorized (ErrSignedOut),並納入 isAuthenticationError 判定。
  • 防止純 Cookie 帳號無效 reload:在 internal/gemini/rotate.go 中,當帳號缺乏 accounts.google.com 域 Cookie(!listed)且無 OAuth 續簽材料(c.refresh == nil)時,避免在第 10 分鐘第 2 輪輪換時主動觸發 c.reload() 向首頁發起無授權請求而引爆 302。

3. 修復 Chrome 匯入大機率顯示「Not signed in to Google」

  • 讀取 WAL 緩存:移除 SQLite 連接字串中的 &immutable=1(改為 ?mode=ro),使 Chrome 運行時未刷盤的 Web Data-wal 也能被正常讀取。
  • 支援無 DBSC 綁定帳號匯入:放寬 len(bindingKey) != 0 的硬性限制,允許具備有效 v20 token 的非 DBSC 帳號順利匯入,並在 protocol.go 中加入無 wrappedKey 時的 requestMultilogin 降級呼叫流程。
  • 前端狀態細化:在管理端 ImportPage 與 7 國語言檔中補齊「缺少認證權杖」與「需要重新登入」狀態標籤,避免所有未就緒帳號統一顯示為「未登入 Google」。

🤖 Generated with Claude Code

Vaxaxas and others added 7 commits October 19, 2026 17:04
- 優化多輪工具提示詞:新增 ContinuationSuffix 精簡協議約束,避免每輪重複拼接完整工具 JSON Schema
- 新增對話指紋自動辨識與多種 Session Header 擷取,支援無 Header 客戶端自動延續會話
- 調整 prompt token 計算排除 ThoughtTokens 並防止錯誤重試雙倍扣額
- 將 Google 登入 302 重定向辨識為認證失效,避免純 Cookie 帳號輪換時觸發 reload 引爆 302
- 移除 SQLite immutable=1 參數以支援讀取 WAL,支援無 DBSC 設備綁定之 Chrome 帳號匯入並精細化狀態標籤

Co-Authored-By: Claude Code <noreply@anthropic.com>
- 兼容 string 與 int 形式的 authUser,避免舊版或手工設定的 storage-state.json 報 json unmarshal 錯誤
- 當 Google 將 /u/N/app 重定向回 /app 時識別為 isLoginRedirect,避免拋出原始 HTTP 302 錯誤
- 當 Chrome 正在執行時,直接開啟 Web Data 會報 database is locked (SQLITE_BUSY),導致所有帳號誤判為 missing_token
- 透過拷貝 Web Data 及其 WAL 日志至臨時目錄後再開啟讀取,可完整讀取所有帳號之 v20 token
- 允許無 DBSC 設備綁定密鑰的帳號正常寫入與載入認證狀態檔,支援非 DBSC 帳號順利匯入
- 在 claude_handler.go 與 openai_chat.go 中正規化訊息指紋計算,拆解 bridge.Parse 工具調用並忽略動態 tool_call id 與 thinking 區塊差異,確保多步工具迴圈穩定命中會話續接並消除 slice 底層陣列污染
- 在 conversation.go 中記錄與比對會話工具集雜湊(toolsHash),當續接輪次新增或變更工具定義時自動回退發送完整 PromptSuffix
- 在 platform_windows.go 新增 readProfileTokens 以單一 Profile 為單位複製並讀取一次 Web Data + WAL(不複製 -shm 且移除臨時檔 mode=ro 限制),避免同 Profile 多帳號重複拷貝資料庫
- 在 protocol.go 的 encodeMultiOAuthHeader 中當無 DBSC assertion 時省略 protobuf 第 3 欄位,並在 state.go 補齊 authUser 負數與非法字串校驗
- 复制 Web Data 与 WAL 后以 url.URL 构造的只读 URI 打开,复制失败时报错
- 支持没有设备绑定密钥的账号导入,续签以 MultiBearer 头一次取得明文 Cookie
- 导入页区分 Web Data 读取失败与需在 Chrome 重新登录两种不可导入原因
- 首页 /u/N 重定向到同一主机其他页面时按会话失效处理,有续签材料时续签
- 回传完整历史的客户端按历史续接网页会话,续接时不重复工具定义与 Schema
- 上一轮思考不计入下一轮的上下文 token
- 撤回会话请求头续接、单次尝试、authUser 字符串解析与轮换跳过首页重读
- 同步中英文 README、协议与开发文档
@Mag1cFall
Mag1cFall merged commit c48eb2b into Mag1cFall:main Oct 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants