WHIRL v0.1.4 于 10 月 5 日发布。WHIRL 是面向 Radeon AI PRO R9700 的原生 Windows C++/HIP LLM 推理引擎。
发布说明称这是没有新功能、没有速度变化的错误修复版本,输出与 v0.1.3 逐位相同。唯一改变的默认值是 CORS。
取决于网页来源的 CORS
CORS(跨源资源共享)是浏览器判断其他来源的网页能否读取响应的规则。v0.1.4 之前,每个响应都带有 Access-Control-Allow-Origin: *,浏览器中打开的任何页面都能读取答案。
现在只向由 localhost、127.0.0.1、[::1] 提供的 HTTP 和 HTTPS 页面发送 CORS 头,不论端口。页面的 Origin 会原样返回并附加 Vary: Origin,不再使用 *。
受影响的是 https://app.example.com 这类其他来源、由网络中另一台计算机提供的页面,以及 Origin 为 null 的 file:// 页面。请求仍会到达服务器,但浏览器不再把响应交给页面。
OpenAI 和 Anthropic SDK、curl、IDE 编程代理、脚本等不是浏览器页面的客户端不使用 CORS,因此不受影响。
允许其他来源的选项
要让其他来源的页面重新获得访问权,可以指定 --cors-origin https://app.example.com,每个来源重复一次该选项。
--cors-origin "*" 会恢复 v0.1.4 之前的全部允许行为。如果网页界面由回环地址提供,无需额外放行即可照常工作。
CORS 不是认证
CORS 头只控制浏览器能否读取响应,并不核实调用者是谁。HTTP 实现把选择响应头的部分与请求处理分开。
固定到标签的测试会检查回环判断是否拒绝 null、localhost.evil.com、127.0.0.1.nip.io 等来源。本文只阅读了源码,没有运行测试。
绑定地址与 API 密钥
服务器指南把默认绑定地址和端口写为 127.0.0.1:8080,并明确说明接受任何 API 密钥。因此,客户端里有 API 密钥输入框,并不意味着存在凭据检查。
扩大网络暴露范围与放行来源是两回事,需要另行审查访问控制。
停滞的流式客户端如何处理
以前,如果流式客户端停止读取响应,引擎可能会卡在该连接上,连其他用户的槽位也一起停住。现在引擎从不等待客户端,30 秒内完全不接收数据的连接会被断开,其槽位被释放。
在 HTTP 选项中,send_timeout_ms 的默认值同样是 30000,这一限制针对的是发送停滞,而不是推理时间。这并不意味着长回答必须在 30 秒内完成。
测试会检查在一个流无人读取时,另一个请求能否在 1 秒内以 HTTP 200 完成,并确认停滞的请求被清理后槽位变为空闲。测试中的时间限制缩短为 2 秒。
新增的 HTTP 限制
发布说明列出了以下限制:同时连接 64 个,请求行和请求头须在 60 秒内到达,两次读取请求之间空闲 30 秒,请求头 64 KiB 或 100 行。请求体和为客户端缓存的未发送响应数据各自上限为 64 MiB。
GGUF 解析器的边界检查不再会溢出,并在分配 GPU 内存前检查每个张量的类型和形状。这些是文档中写明的变化,而不是本文进行负载或安全测试的结果。
注意事项:狭窄的支持环境
要求没有变化:Windows 11、Adrenalin 26.8.1 或更新版本,以及一块 R9700(gfx1201)。README 支持的架构只有 qwen35 和 qwen35moe。
源代码采用 Apache License 2.0,但这并不决定另行下载的模型的许可证。发布中附有 whirl-0.1.4-windows-x64.zip 和 SHA-256 文件,本文没有安装或运行该 ZIP。
WHIRL v0.1.4 只是把浏览器读取响应的权限收窄到回环来源,并没有增加认证,因此升级时需要分别检查网页界面的来源和服务器的网络暴露范围。
