Skip to content

Conversation

@Make-magic
Copy link
Contributor

Files API 支持实现说明

我已在 AIStudioToAPI 中实现了对 Google Files API 的支持。这涉及对服务端请求处理器和客户端浏览器脚本的修改,以处理二进制文件上传和多步 API 流程。

已作出的变更

1. 服务端:src/core/RequestHandler.js

  • 二进制主体捕获:增加了当 express.json 中间件跳过请求(即非 JSON 内容类型,如二进制上传)时,手动读取 POST/PUT/PATCH 请求流的逻辑。
  • Base64 编码:原始二进制主体现在被编码为 Base64 (body_b64) 并传递给浏览器代理,以防止 JSON 序列化导致的数据损坏。

2. 客户端:scripts/client/build.js

  • 二进制转换:添加了 b64toBlob 辅助函数,用于将接收到的 Base64 数据转换回 Blob 对象,供浏览器的 fetch API 使用。
  • 动态主机切换:实现了从 URL 中提取 __proxy_host__ 查询参数并据此动态切换目标域名的逻辑(例如,从 generativelanguage 切换到 storage.googleapis.com)。
  • Host 标头捕获:增加了从传入请求中捕获 Host 标头的逻辑,以识别代理自身的地址。
  • 响应头重写:更新了 _transmitHeaders 以拦截 locationx-goog-upload-url 标头。它将 __proxy_host__ 参数注入到这些 URL 中,确保后续请求能正确路由回代理,随后再转发至正确的 Google 域名。

验证清单

用户可以通过尝试使用调用 Google Files API 的工具或脚本(例如,为 Gemini 1.5 Pro 上传图像或文件)来验证此实现。

手动验证步骤

  1. 启动服务器:运行 npm run startnode main.js
  2. API 客户端:使用支持 Files API 的客户端(例如 Python 的 google-generativeai 库或 curl)。
  3. 上传文件
    • 执行媒体上传操作。
    • 观察控制台日志。您应该看到:
      • 浏览器日志中显示 [Files API Support] Switching target host to: storage.googleapis.com(或类似内容)。
      • [Files API] Converted Base64 body to Blob.
      • [Files API] Rewrote x-goog-upload-url: ...

代码差异

// RequestHandler.js - 二进制读取

if ((req.method === "POST" /.../) && Object.keys(req.body || {}).length === 0) {

// ... 将流读取至 rawBody ...

}

// build.js - 标头重写

if ((lowerKey === 'location' || lowerKey === 'x-goog-upload-url') && v.includes('googleapis.com')) {

// ... 注入 __proxy_host__ ...

}

@bbbugg bbbugg merged commit a7b80fc into iBUHub:main Jan 18, 2026
@github-actions
Copy link

🎉 此 PR 的修改已在版本 v0.4.0 中发布。
🎉 The changes in this PR have been released in version v0.4.0.

@iBUHub iBUHub deleted a comment from github-actions bot Jan 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants