From 235adde72c110c0dd423403e6e8e53f2f487a02d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Thu, 1 Oct 2026 14:14:29 +0800 Subject: [PATCH] =?UTF-8?q?=E8=81=94=E7=BD=91=E6=90=9C=E7=B4=A2=E5=93=8D?= =?UTF-8?q?=E5=BA=94=E8=B6=85=E9=99=90=E7=9A=84=E8=AF=8A=E6=96=AD=E5=B8=A6?= =?UTF-8?q?=E4=B8=8A=E5=AE=9E=E9=99=85=E6=94=B6=E5=88=B0=E7=9A=84=E5=AD=97?= =?UTF-8?q?=E8=8A=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - WebSearchError::ResponseTooLarge 原来只记 max_bytes,用户只看到「超过上限 524288 bytes」,不知道实际多大 - 两个构造点都已拿到真实大小:content_length() 与 bytes.len() + chunk.len(),变体加 got_bytes 并写进文案 - 判定与两个构造点位置不变,仅补上实际值 验证:cargo test --bin genarrative-ai-game-creator-shell -- agent::direct_tool_bridge::tests::search_parser_accepts_only_bounded_public_https_results 通过 --- .../src-tauri/src/agent/direct_tool_bridge.rs | 9 ++++++--- .../src-tauri/src/agent/tool/web_search/error.rs | 11 ++++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_tool_bridge.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_tool_bridge.rs index f44904bd4..bbf31cf21 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/direct_tool_bridge.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/direct_tool_bridge.rs @@ -3452,11 +3452,12 @@ async fn bridge_web_search_at( status: response.status().as_u16(), }); } - if response + if let Some(length) = response .content_length() - .is_some_and(|length| length > DIRECT_TOOL_BRIDGE_MAX_SEARCH_RESPONSE_BYTES as u64) + .filter(|length| *length > DIRECT_TOOL_BRIDGE_MAX_SEARCH_RESPONSE_BYTES as u64) { return Err(WebSearchError::ResponseTooLarge { + got_bytes: usize::try_from(length).unwrap_or(usize::MAX), max_bytes: DIRECT_TOOL_BRIDGE_MAX_SEARCH_RESPONSE_BYTES, }); } @@ -3470,8 +3471,10 @@ async fn bridge_web_search_at( cause: error.to_string(), })? { - if bytes.len() + chunk.len() > DIRECT_TOOL_BRIDGE_MAX_SEARCH_RESPONSE_BYTES { + let received_bytes = bytes.len() + chunk.len(); + if received_bytes > DIRECT_TOOL_BRIDGE_MAX_SEARCH_RESPONSE_BYTES { return Err(WebSearchError::ResponseTooLarge { + got_bytes: received_bytes, max_bytes: DIRECT_TOOL_BRIDGE_MAX_SEARCH_RESPONSE_BYTES, }); } diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/tool/web_search/error.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/tool/web_search/error.rs index 894e60c48..8296586e9 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/tool/web_search/error.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/tool/web_search/error.rs @@ -18,7 +18,7 @@ pub(crate) enum WebSearchError { ClientUnavailable { cause: String }, RequestFailed { cause: String }, HttpStatusNotSuccess { status: u16 }, - ResponseTooLarge { max_bytes: usize }, + ResponseTooLarge { got_bytes: usize, max_bytes: usize }, ResponseReadFailed { cause: String }, NoPublicResults, } @@ -62,8 +62,13 @@ impl ToolFailure for WebSearchError { Self::HttpStatusNotSuccess { status } => { format!("联网搜索失败:AGC 受控搜索返回 HTTP {status}。") } - Self::ResponseTooLarge { max_bytes } => { - format!("联网搜索失败:AGC 受控搜索响应超过大小上限 {max_bytes} bytes。") + Self::ResponseTooLarge { + got_bytes, + max_bytes, + } => { + format!( + "联网搜索失败:AGC 受控搜索响应有 {got_bytes} bytes,超过大小上限 {max_bytes} bytes。" + ) } Self::ResponseReadFailed { cause } => { format!("联网搜索失败:读取 AGC 受控搜索响应失败:{cause}")