From 8283bc542f728064d6e575e335f45c74a2a4272e Mon Sep 17 00:00:00 2001 From: Blizzard Date: Wed, 22 Jul 2026 09:59:58 +0800 Subject: [PATCH] =?UTF-8?q?fix(voice):=20=E7=81=AB=E5=B1=B1=E9=89=B4?= =?UTF-8?q?=E6=9D=83=E5=A4=B4=E7=B2=BE=E7=A1=AE=E5=A4=A7=E5=B0=8F=E5=86=99?= =?UTF-8?q?(X-Api-App-ID=20=E5=85=8D=E8=A2=AB=20Go=20=E8=A7=84=E8=8C=83?= =?UTF-8?q?=E5=8C=96)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Go 的 Header.Set 会把 X-Api-App-ID 规范化成 X-Api-App-Id;改直接赋 map 保留精确 大小写,对齐官方 demo。鉴权方案已与参考实现(realtime_dialog demo)完全一致。 Co-Authored-By: Claude Opus 4.8 --- sundynix-gateway/internal/voice/frame.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/sundynix-gateway/internal/voice/frame.go b/sundynix-gateway/internal/voice/frame.go index 5d663f6..8e120d1 100644 --- a/sundynix-gateway/internal/voice/frame.go +++ b/sundynix-gateway/internal/voice/frame.go @@ -17,13 +17,15 @@ const volcAppKey = "PlgvMymc7f3tQnJ6" // 新版 API Key(Access Key) + 资源 ID + 连接 ID。**不是** Authorization: Bearer(那是 OpenAI // 兼容端点用的,流式二进制端点不认)。App ID 用于解析账号资源授权(缺它会 401 grant not found)。 func setVolcAuthHeaders(hdr http.Header, apiKey, appID, resourceID string) { - hdr.Set("X-Api-App-Key", volcAppKey) + // 直接赋 map(不走 Set)以**保留精确大小写**:Go 的 Header.Set 会把 "X-Api-App-ID" + // 规范化成 "X-Api-App-Id",而火山网关按精确大小写匹配(官方 demo 用 X-Api-App-ID)。 + hdr["X-Api-App-Key"] = []string{volcAppKey} + hdr["X-Api-Access-Key"] = []string{apiKey} + hdr["X-Api-Resource-Id"] = []string{resourceID} + hdr["X-Api-Connect-Id"] = []string{newConnectID()} if appID != "" { - hdr.Set("X-Api-App-ID", appID) + hdr["X-Api-App-ID"] = []string{appID} } - hdr.Set("X-Api-Access-Key", apiKey) - hdr.Set("X-Api-Resource-Id", resourceID) - hdr.Set("X-Api-Connect-Id", newConnectID()) } // handshakeDetail 从失败的 WS 握手响应里榨出可诊断信息:HTTP 状态 + 火山排障用的