Repository navigation
v0.3.1
下载
| 系统 | 推荐 | 其他 |
|---|---|---|
| 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