[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-1620":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":14,"stars7d":14,"stars30d":17,"stars90d":16,"forks30d":16,"starsTrendScore":18,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":21,"hasPages":21,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":24,"readmeContent":25,"aiSummary":26,"trendingCount":16,"starSnapshotCount":16,"syncStatus":27,"lastSyncTime":28,"discoverSource":29},1620,"CanvasToAPI","iBUHub\u002FCanvasToAPI","iBUHub","A wrapper that exposes Gemini Canvas as OpenAI, Gemini, and Anthropic compatible APIs.（一个将 Gemini Canvas 封装为兼容 OpenAI \u002F Gemini \u002F Anthropic 风格 API 的工具）","",null,"JavaScript",205,45,1,4,0,20,3,4.99,"Other",false,"main",[],"2026-06-12 02:00:30","> 如果想尝试一体化部署，请使用 [integrated 分支](https:\u002F\u002Fgithub.com\u002FiBUHub\u002FCanvasToAPI\u002Ftree\u002Fintegrated)；另外 Gemini cookie 过期很快。\n\n# Gemini Canvas to API Adapter\n\n中文文档 | [English](README_EN.md)\n\n一个将 Gemini 网页会话封装为兼容 OpenAI API、Gemini API 和 Anthropic API 的工具。服务端负责提供 API 接口和请求调度，实际浏览器会话需要由用户手动打开指定 Gemini 分享页，与服务端建立连接后才能处理请求。\n\n## ✨ 功能特性\n\n- 🔄 **API 兼容性**：同时兼容 OpenAI API、Gemini API 和 Anthropic API 格式\n- 🌐 **模型支持**：支持 Gemini 3 Flash Preview，几乎无上限调用\n- 🔁 **多会话调度**：支持多个浏览器会话同时连接，按轮询或随机策略分配请求\n- 🔧 **支持工具调用**：OpenAI、Gemini 和 Anthropic 接口均支持 Tool Calls (Function Calling)\n- 📊 **可视化控制台**：提供状态页、日志页和在线配置开关，方便观察服务运行状态\n\n## 🚀 快速开始\n\n### 💻 直接运行（Windows \u002F macOS \u002F Linux）\n\n1. 克隆仓库并安装依赖：\n\n   ```bash\n   git clone https:\u002F\u002Fgithub.com\u002FiBUHub\u002FCanvasToAPI.git\n   cd CanvasToAPI\n   npm install\n   ```\n\n2. 配置环境变量：\n\n   ```bash\n   cp .env.example .env\n   ```\n\n   至少建议设置：\n\n   ```env\n   API_KEYS=your-api-key\n   ```\n\n3. 启动服务：\n\n   ```bash\n   npm start\n   ```\n\n4. 打开控制台：\n\n   访问 `http:\u002F\u002Flocalhost:7861`，使用 `API_KEYS`（或你配置的控制台账号密码）登录。\n\n5. 手动建立浏览器会话：\n\n   在需要承载 Gemini 会话的浏览器中打开：[https:\u002F\u002Fgemini.google.com\u002Fshare\u002F0e87cc62be50](https:\u002F\u002Fgemini.google.com\u002Fshare\u002F0e87cc62be50)\n\n   如果分享链接已过期，请直接打开 Gemini 页面，启用 Canvas，然后将 [scripts\u002Fclient\u002Fcanvas.html](scripts\u002Fclient\u002Fcanvas.html) 中的内容粘贴进去新建一个 Canvas。\n\n   打开后请手动填写：\n   - `Server WS Endpoint`：本地部署填写 `ws:\u002F\u002F127.0.0.1:7861\u002Fws`\n   - `API Key`：填写与请求时相同的 `API_KEYS` 中任意一个 key\n   - `Browser Identifier`：浏览器标志，可自定义；留空时页面会自动生成每日标志\n\n   如果你使用 Chrome 作为浏览器端，请先在地址栏输入 `chrome:\u002F\u002Fflags\u002F#local-network-access-check`，将该项改为 `Disabled`，再通过 `ws:\u002F\u002F127.0.0.1:7861\u002Fws` 连接本地服务端。\n\n   填写完成后点击 `保存` 再点击 `连接`。连接成功后，回到状态页确认 `浏览器会话` 中已有在线会话。\n\n6. 开始调用 API：\n\n   至少有一个浏览器会话在线时，服务端才会真正转发并处理请求。\n\n> ⚠ **注意：**\n> 旧版 README 中的 `npm run setup-auth`、`auth-N.json`、VNC 登录和上传 Auth 文件等流程，已不适用于当前版本。\n\n> 💡 **提示：**\n> 如果服务部署在远程机器上，且浏览器连接非本地服务端的话，需要为服务端开启反向代理，才能在浏览器端使用 `wss:\u002F\u002F`。\n\n### 🐋 Docker 部署\n\n#### 🚢 步骤 1：部署容器\n\n##### 🎮️ 方式 1：Docker 命令\n\n```bash\ndocker run -d \\\n  --name canvas-to-api \\\n  -p 7861:7861 \\\n  -e API_KEYS=your-api-key \\\n  -e TZ=Asia\u002FShanghai \\\n  --restart unless-stopped \\\n  ghcr.io\u002Fibuhub\u002Fcanvas-to-api:latest\n```\n\n> 💡 **提示：** 如果 `ghcr.io` 访问较慢，可以使用 Docker Hub 镜像：`ibuhub\u002Fcanvas-to-api:latest`。\n\n参数说明：\n\n- `-p 7861:7861`：HTTP API 与控制台端口\n- `-e API_KEYS`：客户端访问 API 和控制台时使用的密钥\n- `-e TZ=Asia\u002FShanghai`：日志和页面显示时间的时区（可选）\n\n##### 📦 方式 2：Docker Compose\n\n创建 `docker-compose.yml`：\n\n```yaml\nname: canvas-to-api\n\nservices:\n  app:\n    image: ghcr.io\u002Fibuhub\u002Fcanvas-to-api:latest\n    container_name: canvas-to-api\n    ports:\n      - 7861:7861\n    restart: unless-stopped\n    environment:\n      API_KEYS: your-api-key\n      TZ: Asia\u002FShanghai\n```\n\n##### 🛠️ 方式 3：从源码构建\n\n如果你希望自己构建 Docker 镜像，可以使用以下命令：\n\n1. 构建镜像：\n\n   ```bash\n   docker build -t canvas-to-api .\n   ```\n\n2. 运行容器：\n\n   ```bash\n   docker run -d \\\n     --name canvas-to-api \\\n     -p 7861:7861 \\\n     -e API_KEYS=your-api-key \\\n     -e TZ=Asia\u002FShanghai \\\n     --restart unless-stopped \\\n     canvas-to-api\n   ```\n\n#### 🔌 步骤 2：连接浏览器会话\n\n容器启动后，仍然需要手动打开以下页面建立浏览器会话：[https:\u002F\u002Fgemini.google.com\u002Fshare\u002F0e87cc62be50](https:\u002F\u002Fgemini.google.com\u002Fshare\u002F0e87cc62be50)\n\n如果该分享链接已过期，请直接前往 Gemini 页面，开启 Canvas，并将 [scripts\u002Fclient\u002Fcanvas.html](scripts\u002Fclient\u002Fcanvas.html) 中的内容粘贴进去新建一个 Canvas。\n\n页面中需要手动填写浏览器标志（`Browser Identifier`）、API Key，以及服务端 WebSocket 地址（`Server WS Endpoint`，例如 `ws:\u002F\u002F127.0.0.1:7861\u002Fws` 或 `wss:\u002F\u002Fyour-host\u002Fws`）。其中 API Key 请填写与请求时相同的 key。连接建立成功后，状态页会显示在线浏览器会话，之后 API 请求才会被转发。\n\n#### 🌐 步骤 3（可选）：使用 Nginx 反向代理\n\n如果需要通过域名访问服务，或希望放在反向代理之后统一管理，可以使用 Nginx。\n\n> [!IMPORTANT]\n> 如果需要在浏览器端连接非本地服务端，必须为服务器开启 HTTPS 反向代理，并通过 Nginx 提供 `wss:\u002F\u002F` 入口。\n> 同时请确保 Nginx 正确转发 WebSocket 升级请求，至少包含 `proxy_http_version 1.1`、`proxy_set_header Upgrade $http_upgrade` 和 `proxy_set_header Connection \"Upgrade\"`。\n>\n> 📖 详细的 Nginx 配置说明请参阅：[Nginx 反向代理配置文档](docs\u002Fzh\u002Fnginx-setup.md)\n\n## 📗 使用 API\n\n### 🤖 OpenAI 兼容 API\n\n- `GET \u002Fv1\u002Fmodels`：列出模型。\n- `POST \u002Fv1\u002Fchat\u002Fcompletions`：聊天补全和图片生成，支持非流式、真流式和假流式。\n- `POST \u002Fv1\u002Fresponses`：OpenAI Responses API 兼容接口，用于对话生成，不支持图像生成，支持非流式、真流式和假流式。\n\n### ♊ Gemini 原生 API 格式\n\n- `GET \u002Fv1beta\u002Fmodels`：列出可用的 Gemini 模型。\n- `POST \u002Fv1beta\u002Fmodels\u002F{model_name}:generateContent`：生成内容、图片和语音。\n- `POST \u002Fv1beta\u002Fmodels\u002F{model_name}:streamGenerateContent`：流式生成内容、图片和语音，支持真流式和假流式。\n\n### 🧠 Anthropic 兼容 API\n\n- `GET \u002Fv1\u002Fmodels`：列出模型。\n- `POST \u002Fv1\u002Fmessages`：聊天消息补全，支持非流式、真流式和假流式。\n\n> 📖 详细的 API 使用示例请参阅：[API 使用示例文档](docs\u002Fzh\u002Fapi-examples.md)\n\n## 🧰 相关配置\n\n### 🔧 环境变量\n\n#### 📱 应用配置\n\n| 变量名                      | 描述                                                                                                             | 默认值               |\n| :-------------------------- | :--------------------------------------------------------------------------------------------------------------- | :------------------- |\n| `API_KEYS`                  | 用于 API 鉴权的密钥列表，多个值使用逗号分隔；同时也是默认的控制台登录密码来源。                                  | `123456`             |\n| `WEB_CONSOLE_USERNAME`      | 网页控制台登录用户名（可选）。如果与密码同时设置，则登录时需要输入两者。                                         | 无                   |\n| `WEB_CONSOLE_PASSWORD`      | 网页控制台登录密码（可选）。如果只设置密码，则控制台只要求输入密码；如果两者都不设置，则回退到 `API_KEYS` 登录。 | 无                   |\n| `PORT`                      | HTTP API 与控制台端口。                                                                                          | `7861`               |\n| `HOST`                      | HTTP 服务和 WebSocket 服务监听地址。                                                                             | `0.0.0.0`            |\n| `ICON_URL`                  | 控制台 favicon 地址，支持 ICO、PNG、SVG 等格式。                                                                 | `\u002FAIStudio_logo.svg` |\n| `SECURE_COOKIES`            | 是否启用仅 HTTPS 可用的安全 Cookie。                                                                             | `false`              |\n| `RATE_LIMIT_MAX_ATTEMPTS`   | 控制台登录失败次数限制，设为 `0` 可关闭。                                                                        | `5`                  |\n| `RATE_LIMIT_WINDOW_MINUTES` | 控制台登录失败次数统计窗口，单位分钟。                                                                           | `15`                 |\n| `CHECK_UPDATE`              | 是否在控制台页面检查新版本。设为 `false` 可关闭。                                                                | `true`               |\n| `LOG_LEVEL`                 | 日志级别，支持 `INFO` 和 `DEBUG`。                                                                               | `INFO`               |\n| `TZ`                        | 日志和页面显示时间使用的时区，例如 `Asia\u002FShanghai`。留空时默认使用系统时区。                                     | 系统时区             |\n\n#### 🌐 代理配置\n\n| 变量名                    | 描述                                                                                         | 默认值  |\n| :------------------------ | :------------------------------------------------------------------------------------------- | :------ |\n| `ROUND`                   | 会话选择策略，支持 `round`（轮询）和 `random`（随机）。                                      | `round` |\n| `SESSION_ERROR_THRESHOLD` | 单个浏览器会话累计 WebSocket \u002F 浏览器错误达到该阈值后会被自动禁用，设为 `0` 表示永远不禁用。 | `3`     |\n| `MAX_RETRIES`             | 单次请求失败后的最大重试次数。                                                               | `3`     |\n| `RETRY_DELAY`             | 两次重试之间的间隔，单位毫秒。                                                               | `2000`  |\n\n#### 🗒️ 其他配置\n\n| 变量名              | 描述                                                                                     | 默认值  |\n| :------------------ | :--------------------------------------------------------------------------------------- | :------ |\n| `STREAMING_MODE`    | 流式传输模式。`real` 为真流式，`fake` 为假流式。根据目前的测试，使用真流式可能导致报错。 | `fake`  |\n| `FORCE_THINKING`    | 强制为所有请求启用思考模式。                                                             | `false` |\n| `FORCE_WEB_SEARCH`  | 强制为所有请求启用联网搜索。根据目前的测试，启用后可能导致请求报错。                     | `false` |\n| `FORCE_URL_CONTEXT` | 强制为所有请求启用 URL 上下文。                                                          | `false` |\n\n### 🔌 浏览器会话连接\n\n当前版本不再读取本地 `auth` 文件，也不包含 `setup-auth` 初始化脚本。正确的使用方式是：\n\n1. 启动服务端，并确保 `PORT` 能被建立会话的浏览器访问到。\n2. 打开控制台查看当前浏览器会话连接地址和连接状态。\n3. 在浏览器中打开 [https:\u002F\u002Fgemini.google.com\u002Fshare\u002F0e87cc62be50](https:\u002F\u002Fgemini.google.com\u002Fshare\u002F0e87cc62be50)。\n   如果该分享链接已失效，请前往 Gemini 页面，开启 Canvas，并使用 [scripts\u002Fclient\u002Fcanvas.html](scripts\u002Fclient\u002Fcanvas.html) 里的内容新建一个 Canvas。\n4. 在页面中填写浏览器标志（`Browser Identifier`）、API Key，以及服务端 WebSocket 地址（`Server WS Endpoint`）。\n5. `API Key` 请填写与你请求 API 时相同的 key；`Server WS Endpoint` 本地可填写 `ws:\u002F\u002F127.0.0.1:7861\u002Fws`，如果控制台是通过 `https:\u002F\u002F` 访问的远程服务，则应填写 `wss:\u002F\u002F你的域名或公网地址\u002Fws`。\n   如果你使用 Chrome 作为浏览器端，请先在地址栏输入 `chrome:\u002F\u002Fflags\u002F#local-network-access-check`，将该项改为 `Disabled`，再通过本地 `ws:\u002F\u002F` 地址连接服务端。\n6. 等待状态页出现在线会话后，再开始调用 API。\n\n### 🧠 模型列表配置\n\n编辑 `configs\u002Fmodels.json` 以自定义可用模型及其设置。\n\n> 💡 **提示：** 思考参数支持通过模型名后缀设置，可以在模型名后追加 `-THINKING_LEVEL` 或 `(THINKING_LEVEL)`，其中 `THINKING_LEVEL` 支持 `high`、`medium`、`low`、`minimal`，不区分大小写。例如：`gemini-3-flash-preview(minimal)` 或 `gemini-3-flash-preview-minimal`。\n>\n> 流式模式也支持通过模型名后缀覆盖，可在模型名最后追加 `-real` 或 `-fake`。该后缀优先级高于系统 `STREAMING_MODE`，但只在流式请求中生效。例如：`gemini-3-flash-preview-fake`。若和思考后缀同时使用，真假流后缀必须放在最后，例如：`gemini-3-flash-preview-minimal-fake` 或 `gemini-3-flash-preview(minimal)-real`。\n\n## 📄 许可证\n\n本项目基于 [**iBUHub\u002FAIStudioToAPI**](https:\u002F\u002Fgithub.com\u002FiBUHub\u002FAIStudioToAPI) 开发，并采用 CC BY-NC 4.0 许可证，其使用、分发与修改行为均需遵守许可证的全部条款，完整许可的内容请参见 [LICENSE](LICENSE) 文件。\n\n## 🤝 贡献者\n\n[![Contributors](https:\u002F\u002Fcontrib.rocks\u002Fimage?repo=iBUHub\u002FCanvasToAPI)](https:\u002F\u002Fgithub.com\u002FiBUHub\u002FCanvasToAPI\u002Fgraphs\u002Fcontributors)\n\n感谢所有为本项目付出汗水与智慧的开发者。\n\n---\n\n如果你觉得 CanvasToAPI 对你有帮助，欢迎给项目点一个 ⭐️！\n\n[![Star History Chart](https:\u002F\u002Fapi.star-history.com\u002Fsvg?repos=iBUHub\u002FCanvasToAPI&type=date&legend=top-left)](https:\u002F\u002Fwww.star-history.com\u002F#iBUHub\u002FCanvasToAPI&type=date&legend=top-left)\n\n## 社区支持\n\n学 AI , 上 L 站\n[LinuxDO](https:\u002F\u002Flinux.do)\n","CanvasToAPI 是一个将 Gemini Canvas 封装为兼容 OpenAI、Gemini 和 Anthropic 风格 API 的工具。其核心功能包括多会话调度、支持多种 API 格式以及工具调用，并提供可视化控制台以监控服务状态。该项目采用 JavaScript 编写，能够实现几乎无上限的 Gemini 3 Flash Preview 调用，适用于需要在不同平台间无缝切换 AI 服务的应用场景，如开发跨平台的 AI 应用或进行多模型对比测试等。通过简单的配置和部署，用户可以快速搭建起自己的 API 服务并开始调用。",2,"2026-06-11 02:45:02","CREATED_QUERY"]