WHIRL v0.1.4が10月5日に公開された。WHIRLは、Radeon AI PRO R9700向けのネイティブWindows C++/HIP LLM推論エンジンだ。

リリースは、新機能も速度の変化もないバグ修正版で、出力はv0.1.3とビット単位で同じだとしている。変わった既定値はCORSの1つだけだ。

Webページの出所で分かれるCORS

CORS(Cross-Origin Resource Sharing)は、別の出所のWebページが応答を読んでよいかをブラウザが判断する規則だ。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より前の全許可の動作を戻す。Web UIをループバックアドレスから提供していれば、追加の許可なしにそのまま動く。

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)1枚だ。READMEが対応するアーキテクチャはqwen35とqwen35moeだけだ。

ソースにはApache License 2.0が適用されるが、別にダウンロードするモデルのライセンスまで決めるものではない。リリースにはwhirl-0.1.4-windows-x64.zipとSHA-256ファイルがあり、この記事はZIPをインストールも実行もしていない。

WHIRL v0.1.4はブラウザによる応答の読み取りをループバックの出所に絞っただけで認証は加えていないため、アップグレードではWeb UIの出所とサーバーのネットワーク公開を別々に確かめる必要がある。