Fetching metadata from the HF Docker repository... gmn2a / gemini_session.py 29 days ago
-
Persist Gemini cookies and stabilize rotation
30 days ago
-
新增"未闭合代码块"判定,区分上游截断与客户端显示不全;超时可配
背景:用户反馈"代码输出到一半就断掉了"。需要先能确定到底是上游截断还是客户端显示不全。
改动:
- 流式收尾时检查围栏状态:如果流"正常"结束、但正文停在一个没闭合的围栏里,说明上游
其实提前收尾了。这种情况不抛异常,原来的错误分支抓不到。现在会追加
[代码块未闭合,响应疑似在上游被截断,以上内容可能不完整],并把 finish_reason 置为
length;日志里同时打出实际下发的字符数、分片数和 fence_open 状态。
- 正常闭合的围栏不会误报(有对应测试)。
- 错误分支的日志也补上了已下发字符数与围栏状态。
- 新增两个可调环境变量并透传到 GeminiClient.init():
GEMINI_TIMEOUT(默认 300,单次请求超时)
GEMINI_WATCHDOG_TIMEOUT(默认 120,流式静默看门狗,超时未收到数据即判僵尸流并重试)
两者都进 /api/session 的 status,便于确认线上实际生效值。
tests/test_streaming_fidelity.py 增至 20 项:新增未闭合围栏判为截断 + finish_reason=length、
正常闭合不误报 + finish_reason=stop。全套 156 项通过。 -
会话自愈:Cookie 初始化 + 后台持续轮换 __Secure-1PSIDTS
修复常驻服务里 1PSIDTS 会永久停止轮换的问题:gemini-webapi 的 start_auto_refresh / start_activity_watchdog 在账号状态不是 AVAILABLE 时会 break 并把 task 置空,此后没有任何机制拉起它,导致进程一直在跑但 Cookie 依然过期。
新增 gemini_session.py:CookieStore(txt/json 双缓存按 mtime 取较新者);GeminiSessionManager 监督协程(观察轮换落盘、重拉停掉的 refresh/activity 任务、会话失效即重建,带 rearm 冷却防忙循环);HfCookieBackup 可选备份(Dataset 不触发重启 / Secret 回写默认关闭)。
main.py:get_gemini_client 委托 manager 并做返回前健康检查;新增 reinitialize_gemini_client、generate_content(_stream)_with_recovery(仅在 account_status 变为 UNAUTHENTICATED 时重建重试一次)、GET /api/session。
admin.py / admin.html:状态页新增「会话与 __Secure-1PSIDTS 轮换」卡片,展示生效中与缓存中的 1PSIDTS、轮换计数、任务存活状态。
新增 tests/(78 项断言,全部不联网)与 .gitignore(排除 secrets/ 与 Cookie 缓存)。