Skip to content

v0.3.1

Choose a tag to compare

@github-actions github-actions released this 05 Nov 18:12
· 1 commit to main since this release

下载

系统 推荐 其他
Windows 10 及以上 桌面版 —
macOS 13 及以上(Apple 芯片与 Intel) 桌面版 dmg 桌面版 zip
Linux 桌面 x64 AppImage deb 安装包
Linux 服务器 x64 命令行版 · ARM64 命令行版 Docker 镜像 ghcr.io/mag1cfall/aistudio2api:v0.3.1
macOS 13 及以上命令行 Apple 芯片 · Intel —

桌面版与命令行版启动后都在 http://127.0.0.1:2048 提供管理页面与 API;Windows 与命令行版解压即用。

公开 API

  • 开启 YouTube 链接识别后,只有有效的 YouTube 视频链接转为视频输入,CLAUDE.md 与 system-reminder 中的 ${videoId} 模板、VIDEO_ID 占位符与链接后紧跟的文字不再使 Claude Code 的请求报错(#111)
  • .bat、.ps1、.sh、.js、.ts、.py、.yaml、.rtf、.svg 等文本附件按内容以纯文本发送,声明为 application/octet-stream 等类型时不再返回 Unsupported file(#111)
  • 超过 63 字符的工具函数名可正常生成与计数,回复中以原名返回(#108、#109)
  • 上传文件按官方保留期删除:Gemini Files API 的文件保留 48 小时并返回 expirationTime,OpenAI /v1/files 支持 expires_after,purpose=batch 默认保留 30 天
  • 生成的视频在完成 48 小时后删除,视频对象返回 expires_at,结果已删除时下载返回 404
  • Gemini Files API 的 File 对象字段顺序与官方相同
  • /v1/images/generations 的 usage 中文本与图片 token 取上游按模态细分的计数
  • Chat Completions、图片生成与编辑、Gemini generateContent 与 streamGenerateContent 请求偶发使服务进程退出(found bad pointer in Go heap)的问题已修复
  • 流式响应在服务端仍在生成时每 10 秒没有输出就发送心跳:隐藏思考摘要的 Interactions、MP3 等格式的语音合成与 Chat 音频、上下文压缩、图片与转写的流式请求不再长时间没有字节,经默认配置的 nginx 时不再在 60 秒后被断开;流式响应与 NONSTREAM_KEEPALIVE=true 时非流式请求的保活响应带 X-Accel-Buffering: no,经 nginx 反向代理时逐帧到达客户端(#114)
  • 上游返回 JPEG 时输出的 PNG 为 8 位,文件约为原来的一半;输出格式与尺寸与上游图片相同时直接返回上游图片

性能与依赖

图片与语音编解码的热点由 AVX2(amd64)与 NEON(arm64)汇编实现,没有 AVX2 的 CPU 与其他平台使用同一算法的 Go 实现;PNG 与 image/png 逐字节相同,缩放与 x/image/draw 逐像素相同,JPEG 解码的像素与错误同 image/jpeg,MP3、AAC 编码输出与上游库相同。

图片(4096×4096 JPEG,本机 p50):

环节 实现 之前 现在
JPEG 解码 Go image/jpeg 的分叉:汇编反量化与 IDCT,64 位位缓冲与 10 位组合快表的熵解码 265.7 ms 66.6 ms
缩放到 1024×1024 CatmullRom 两遍卷积汇编 444.6 ms 32.2 ms
输出 1024×1024 PNG PNG 行过滤与选择、RGBA 与 YCbCr 取色汇编 790.0 ms 137.9 ms
输出原尺寸 PNG 同上 2584.1 ms 590.4 ms
输出 1024×1024 WebP(质量 80) libwebp 1.6.0 静态库,与 cwebp 1.6.0 逐字节相同 1086.1 ms 155.7 ms
输出原尺寸 WebP(质量 80) 同上 8278.6 ms 910.5 ms
输出原尺寸 JPEG 直接返回上游图片 262.7 ms 0 ms

gemini-3-pro-image 真实请求的本地处理中位数:1024 PNG 1588 → 767 ms,Responses 的 WebP 1024 2139 → 960 ms,4K JPEG 890 → 614 ms。

语音合成(13.5 s 语音,本机 p50):

环节 实现 之前 现在
重采样到 32 kHz(MP3) 重写的 Kaiser 窗 sinc 多相滤波,点积汇编,取代 oov/audio 62.3 ms 6.0 ms
重采样到 44.1 kHz(AAC) 同上 87.0 ms 9.0 ms
MP3 编码 Mag1cFall/go-mp3 v0.1.1 167.1 ms 39.6 ms
AAC 编码 Mag1cFall/go-aac v0.7.3 158.6 ms 115.4 ms
输出 mp3 合计 233.7 ms 45.8 ms
输出 aac 合计 245.6 ms 133.8 ms

/v1/audio/speech 真实请求在上游音频到达后的本地处理中位数:mp3 208 → 46 ms,aac 234 → 124 ms。

依赖分叉在上游版本上加入汇编内核并打标签,每组内核已分别向上游提交 PR(整帧收益为 AMD EPYC 7763 上 benchstat 的中位数):

分叉 内核 上游 PR 收益
Mag1cFall/go-mp3 v0.1.1(基于 tphakala/go-mp3 v0.1.0) 量化 quantizeGranule tphakala/go-mp3#84 整帧 −36.1%,量化 −73.9%
分析滤波器组与 36 点 MDCT tphakala/go-mp3#85 分析滤波 −89.8%
霍夫曼前缀代价融合、区域搜索与打包写出 tphakala/go-mp3#86 整帧 −27.6%
FFT 与心理声学模型 2 tphakala/go-mp3#87 心理声学 −66.6%,FFT1024 −58.0%
Mag1cFall/go-aac v0.7.3(基于 tphakala/go-aac v0.7.0) 只算开销的码本开销 tphakala/go-aac#122(已合入上游) 48 kHz 立体声整帧 −19.7%
NMR 节点开销与网格合并 tphakala/go-aac#123 整帧 −2.6%
高通滤波器与 PE 对数 tphakala/go-aac#124 整帧 −2.4%
Mag1cFall/libwebp v1.6.0-aistudio2api.1 上游 libwebp 1.6.0 发布提交的六平台静态库 — WebP 编码见上表

各 PR 在 GitHub runner 的 AMD EPYC、Intel Xeon、Arm Neoverse N2、Apple M1 等 CPU 上与上游交替测量,正文列出所测 CPU 与全部基准,控制代码布局后整帧基准都没有统计显著的变慢。

两个分叉标签合起来相对上游版本的整帧收益(GitHub runner 上两侧交替 10 轮,benchstat,没有统计显著变慢的基准):

CPU go-mp3 v0.1.1(帧基准几何平均) go-aac v0.7.3(48 kHz 立体声 128k)
AMD EPYC 7763(Zen 3) −80.3% −27.8%
AMD EPYC 9V74(Zen 4) −80.8% −23.7%
AMD EPYC 9V45(Zen 5) −80.3% −22.6%
Intel Xeon Platinum 8370C — −19.7%
Intel Xeon Platinum 8573C −77.8% −26.0%
Arm Neoverse N2 −66.8% −17.9%
Apple M1 −74.5% −21.6%

管理端

  • 启动生成服务后不久就停止时立即停止,不再等待到期文件的删除并返回“模型目录刷新停止超时”
  • Camoufox 后端多个 Worker 同时启动时停止生成服务,不再等满 12 秒后返回“生成服务停止超时”

WAA 后端与账户

  • 账户时区含零宽空格、BOM 或方向标记时,SpiderMonkey 后端不再在 WAA Bootstrap 报 unknown time zone;添加、导入与编辑账户时拒绝无法加载的时区(#115)
  • 从 0.2.19 及更早版本升级且 .env 没有写 WAA_BACKEND 时继续使用 Camoufox;WAA_BACKEND 为 go 等其他值时使用 SpiderMonkey,不再报配置无效;启动时把所用后端写入 .env(#115)
  • 预热时登录失效的账户续签后继续启动 Worker,不再与同账户的模型目录同步互相等待而一直停在启动中

API 试用页

  • 没有浏览器类型的代码文件与超长粘贴作为纯文本附件发送

数据与存储

  • MEDIA_OUTPUT=url 的媒体目录总量超过 1 GB 时从最久未使用的文件开始删除
  • Live 续接凭证保留 24 小时,内联附件闲置 1 小时后删除;服务在请求进行中退出时留下的临时文件在 48 小时后删除
  • 到期文件在 Drive 删除成功后才解除记录,回收途中退出或删除失败的文件在下一轮继续删除
  • 升级前留下的视频、Live 绑定、旧版本数据库表,以及旧版本请求留下的内联附件、Omni 输入图片与跨账户临时副本,在首次启动时按同一规则清理

构建

  • SpiderMonkey 绑定与 macOS 包的 SQLite 以 -O2 编译,源码构建的头文件路径统一经 CGO_CPPFLAGS 传入
  • macOS 桌面版与命令行版的最低系统版本为 macOS 13,与构建所用的 Go 1.27 一致
  • 在源码目录执行 docker compose up -d --build 时前端阶段可以正常构建

完整变更:v0.3.0...v0.3.1