google-ai-mode
Provides OpenAI-compatible API, MCP, and CLI for Google AI Mode, with automatic fallback to a real Chrome browser to bypass TLS fingerprint detection.
README
google-ai-mode
本地调用 Google AI Mode(udm=50),提供 OpenAI 兼容 API、MCP 与 CLI。
双层请求引擎:curl_cffi(快速路径)→ 被 TLS 指纹检测拦截时自动回退到真实 Chrome 浏览器(CDP 连接),绕过 Google SG_REL soft-block。
违反 Google ToS,仅供个人研究。上游随时可能改协议。
文档导航
| 文档 | 内容 |
|---|---|
| README.md | 安装、配置、启动、OpenAI 用法 |
| DESIGN.md | 模块划分与数据流 |
| docs/PROTOCOL.md | 抓包路径 / folwr·folif / cookie / 风控(接手必读) |
| docs/REFERENCES.md | 外部参考(精简) |
快速开始
1. 安装
cd google-ai-mode
python -m venv .venv
.venv\Scripts\activate
pip install -e ".[api]"
可选依赖(浏览器回退需要):
pip install playwright
playwright install chromium
2. 配置
copy config.example.json ai-mode.config.json
{
"cookie_file": "cookies.json",
"proxy": "http://127.0.0.1:10808",
"host": "www.google.com",
"bind_host": "127.0.0.1",
"port": 18080,
"verbose": false
}
优先级:环境变量 > 配置文件 > 默认值。
也支持 config.json / .ai-mode.json,或 AI_MODE_CONFIG=路径。
3. 导出 Cookies
Chrome 没有「全选 → Copy as JSON」。用 Cookie-Editor:
- 安装 Cookie-Editor
- 登录 https://www.google.com
- Export → JSON(数组格式即可)
- 放到项目根,命名
cookies.json
加载时只读每条的 name + value,多余字段无妨。
最少需要:
| Cookie | 说明 |
|---|---|
__Secure-1PSID |
长期登录 |
__Secure-1PSIDTS |
短期签名;会尝试 RotateCookies 续 |
只保证 PSID 不过期不够。建议全量导出 SID/HSID/APISID 等。
4. 启动 API
推荐:双击项目根 start-api.bat(先 cd 到根再启,窗口保持开着)。
停止:双击 stop-api.bat(读配置里的 port,结束占用进程;默认 18080)。
ai-mode-api
# 或
.venv\Scripts\ai-mode-api.exe
curl --noproxy "*" http://127.0.0.1:18080/health
Cherry Studio / 任意 OpenAI 客户端:
base_url = http://127.0.0.1:18080/v1
model = google-ai-mode
API Key = 任意非空占位即可
双层请求引擎
请求 → curl_cffi (impersonate=chrome*) ─── 快速路径
│
├─ 200 + AI Mode tokens → 正常返回
│
└─ SG_REL soft-block → 自动回退
│
▼
BrowserBridge (真实 Chrome via CDP)
├─ 启动 Chrome + 代理 + cookies
├─ 预热首页 (关键:直接访搜索页会被 /sorry 拦截)
├─ page.goto() → 搜索页 → 解析 tokens
└─ fetch() → /async/folif → AI 回答
为什么需要浏览器回退?
Google 于 2026 年升级了 TLS/HTTP2 指纹检测。curl_cffi 的所有 impersonate profile(chrome131~146)均被识别为自动化流量,返回 SG_REL soft-block(HTTP 200 但无 AI Mode tokens)。
真实 Chrome 浏览器的 TLS 指纹无法被 Google 拦截(因为就是真实浏览器)。通过 CDP(Chrome DevTools Protocol)连接到 Chrome 进程不会注入 navigator.webdriver 等自动化标志,因此可以绕过检测。
浏览器回退的关键细节
- 预热必须:直接导航到
/search会被重定向到/sorry/index;必须先访问首页再搜索 - Playwright headless 无效:Playwright 控制的浏览器(即使
channel="chrome")仍被检测 - subprocess + CDP 有效:用
subprocess启动 Chrome,再通过 CDP 连接,不注入自动化标志
OpenAI 兼容
curl --noproxy "*" -X POST "http://127.0.0.1:18080/v1/chat/completions" ^
-H "Content-Type: application/json" ^
-d "{\"model\":\"google-ai-mode\",\"stream\":false,\"messages\":[{\"role\":\"user\",\"content\":\"hello\"}]}"
GET /v1/modelsPOST /v1/chat/completions(stream=false|true;流式为真渐进 SSE:chunked HTML → 稳定 MD 前缀 → delta)- 另有:
GET /search、POST /v1/chat、POST /rotate、GET /health
system 消息
上游无 system 角色。role=system 会被忽略,只取最后一条 user 文本发给 Google。
多轮(无需 thread_id)
客户端只传标准 messages 历史即可。服务端用 assistant 正文指纹 + user 问题映射 + .ai_mode_threads.json 落盘自动挂 Google thread。
错误码(OpenAI error 体)
| code | HTTP | 处理 |
|---|---|---|
cookie_expired |
401 | 从 Chrome 重导 cookies.json |
rate_limit |
429 | 冷却 1–5 分钟 |
soft_block |
503 | 引擎已自动回退到浏览器模式;若仍失败,刷新 cookies/换代理 |
blocked |
403 | 换 IP、人工过验证后重导 cookie |
incomplete_answer |
502 | 上游答案结构不完整,服务已自动重试仍失败 |
bootstrap_tokens / upstream_http |
502 | 查网络/host/登录态 |
internal_error |
500 | 看服务端日志 |
核心原理
GET /search?udm=50 → tokens (stkp / garc / xsrf_folif / srtst / ei)
GET /async/folwr → 首答 HTML + mstk (legacy, 已弃用)
GET /async/folif → 首答/续聊 HTML + mstk (当前协议)
HTML → Markdown([[cite](url)] + Images)
Google ~2026-08 移除了 data-lro-token / data-lro-signature,弃用 /async/folwr。新对话也改用 /async/folif。
项目结构
google-ai-mode/
├── ai-mode.config.json # 本地配置(gitignore,从 example 复制)
├── config.example.json
├── cookies.example.json
├── start-api.bat # Windows 推荐启动
├── stop-api.bat # 按配置端口结束 API
├── DESIGN.md
├── docs/
│ ├── PROTOCOL.md # 协议与逆向结论
│ └── REFERENCES.md
├── scripts/
│ ├── build_cookies.py
│ └── extract-cookies.js
├── tests/
│ ├── test_answer_structure.py
│ ├── test_stream_delta.py
│ └── test_thread_store.py
└── src/ai_mode_mcp/
├── config.py
├── cookie_manager.py
├── browser_backend.py # 浏览器回退:真实 Chrome via CDP
├── engine.py # 协议 + 解析 + Markdown + 线程 + 流式
├── models.py
├── cli.py
└── handlers/
├── api_server.py # FastAPI / OpenAI
└── mcp_server.py
MCP / CLI
ai-mode-mcp # stdio:search / chat / rotate_cookies
ai-mode-cli "query" -c cookies.json -v
常见问题
Q: 浏览器回退时 Chrome 窗口会弹出来?
不会。BrowserBridge 使用 --headless 模式(若 Playwright 可用)或 subprocess 启动真实 Chrome(带 --remote-debugging-port),在后台运行。
Q: 浏览器回退很慢?
首次回退需要启动 Chrome(~3 秒)。之后 Chrome 保持运行,后续请求复用。整体比 curl_cffi 慢约 5-10 秒,但能绕过 SG_REL。
Q: PSID 不过期还要重导吗? TS 失效或 soft-block 时仍要重导。RotateCookies 不能解决所有失效。
Q: 和网页答案差很多?
解析依赖 HTML 片段结构;引用已统一为 [[标题](url)]。若缺图/表,开 verbose 对照上游 HTML。
Q: 商业使用? 不建议;违反 ToS,且协议不稳定。
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。