Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ChatGPT Tool - Vercel text/plain + automatic chunking

这是一个面向 Vercel 的 URL/Base64 中转工具。

核心目标:

  • 所有 /api/* 响应强制使用 Content-Type: text/plain; charset=utf-8
  • 小文件保持原来的完整 Base64 JSON 返回方式
  • 大文件自动切换到分片模式
  • 分片优先使用上游 HTTP Range,避免每次下载整个大文件
  • 如果上游忽略 Range,会退化为流式跳过并只保留目标片段
  • 无数据库、无环境变量,适合直接部署到 Vercel

响应头

Content-Type: text/plain; charset=utf-8
X-Content-Type-Options: nosniff

注意:虽然普通响应正文是 JSON 字符串,但 HTTP MIME 类型仍然是 text/plain

自动分片规则

当前安全阈值:

2,700,000 原始二进制字节

这会编码成约:

3,600,000 Base64 字符

2,700,000 可以被 3 整除,因此正常的非末尾分片不会产生 Base64 = padding。

小文件

请求:

/api/fetch?url=<目标URL>

如果文件不超过阈值,返回:

{"success":true,"chunked":false,"url":"...","filename":"file.aar","size_bytes":123456,"content_base64":"UEsDB..."}

大文件

同样请求:

/api/fetch?url=<目标URL>

如果文件超过阈值,不会把整个 Base64 塞进一次响应,而是返回一个很小的 manifest:

{"success":true,"chunked":true,"size_bytes":6000000,"chunk_size_bytes":2700000,"total_chunks":3,"chunk_url_template":"/api/fetch?url=...&part={part}",...}

然后分别访问:

/api/fetch?url=<目标URL>&part=0
/api/fetch?url=<目标URL>&part=1
/api/fetch?url=<目标URL>&part=2

每个 part=N 的响应正文是纯 Base64 文本,不再包 JSON:

UEsDBBQAAAAI...

分片响应还会附带:

X-Content-Encoding: base64
X-Chunk-Index: 0
X-Chunk-Start: 0
X-Chunk-End: 2699999
X-Total-Size: 6000000
X-Total-Chunks: 3

还原文件时,按 part=0,1,2... 顺序分别 Base64 解码,再把得到的二进制块顺序拼接即可。

Maven AAR 示例

部署后直接访问:

https://你的域名.vercel.app/api/fetch?url=https://repo1.maven.org/maven2/top/yukonga/miuix/kmp/miuix-ui-android/0.9.3/miuix-ui-android-0.9.3.aar

如果它被判定为大文件,先得到 manifest,再继续访问:

https://你的域名.vercel.app/api/fetch?url=https://repo1.maven.org/maven2/top/yukonga/miuix/kmp/miuix-ui-android/0.9.3/miuix-ui-android-0.9.3.aar&part=0

之后将 part 递增即可。

Vercel 部署

GitHub + Vercel

  1. 新建 GitHub 仓库。
  2. 把本目录全部内容上传到仓库根目录。
  3. 在 Vercel 选择 Add New -> Project
  4. Import 这个 GitHub 仓库。
  5. Framework Preset 选择 Other
  6. 不需要环境变量。
  7. 点击 Deploy

Vercel CLI

Linux/macOS:

./deploy-vercel.sh

Windows:

deploy-vercel.cmd

或者:

npm run deploy

接口

  • /api/fetch?url=<URL>:自动判断完整模式或分片模式。
  • /api/fetch?url=<URL>&part=N:读取第 N 个 Base64 分片。
  • /api/extract?url=<URL>:DOCX/XLSX/TXT/CSV/MD/JSON/HTML/RTF 文本提取。
  • /api:查看接口说明。

Range 行为

大文件分片请求优先向上游发送:

Range: bytes=<start>-<end>
Accept-Encoding: identity

如果上游返回 206 Partial Content,只读取目标范围。

如果上游无视 Range 并返回 200 OK,程序会流式读取响应,跳过前面的数据,只保留当前分片窗口,不把整个文件一次性塞进响应。

未知文件大小

程序优先通过 HEAD 获取 Content-Length

如果 HEAD 不可用,会尝试一个小范围 Range 探测。如果上游既不提供文件大小、也不支持 Range,仍可进入分片模式;此时 total_chunks 可能是 null,调用方从 part=0 开始递增,直到接口返回 HTTP 416

为什么不用 res.json()

接口统一使用:

res.setHeader('Content-Type', 'text/plain; charset=utf-8');
res.end(JSON.stringify(payload));

这样 JSON helper 不会把 MIME 改回 application/jsonvercel.json 也配置了相同响应头作为兜底。

Attribution

Based on upstream project: https://github.com/mariklolik/claude_tool

Original project license: MIT.

About

用于ChatGPT web云端沙箱无法拉取json的问题,强制将外部文件编码为Base64纯文本返回

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages