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 9d8a62c4d..08c60dcb2 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 @@ -77,6 +77,26 @@ const DIRECT_TOOL_BRIDGE_MAX_RESOURCE_PAGE_SIZE: usize = 100; const DIRECT_TOOL_BRIDGE_MAX_ACCOUNT_ASSET_ID_CHARS: usize = 512; const DIRECT_TOOL_BRIDGE_MAX_LOCAL_ASSET_PATH_CHARS: usize = 512; +/// 远端服务告警给模型时每条允许保留的字符数:原文保留,只做长度收口 +/// (与旧 `redact_agent_runtime_error(..., 480)` 的预算一致)。 +const DIRECT_TOOL_BRIDGE_WARNING_MAX_CHARS: usize = 480; + +/// 告警原文给模型,只做长度收口。 +fn bounded_remote_warning(warning: &str) -> String { + crate::agent::redaction::truncate_agent_runtime_text( + warning, + DIRECT_TOOL_BRIDGE_WARNING_MAX_CHARS, + ) +} + +/// 逐条给远端告警做长度收口,顺序与原文一致。 +fn bounded_remote_warnings(warnings: &[String]) -> Vec { + warnings + .iter() + .map(|warning| bounded_remote_warning(warning)) + .collect() +} + pub(crate) fn reject_command_output_wrapper(content: &str) -> Result<(), String> { let mut lines = content.trim_start_matches('\u{feff}').lines(); let exit_line = lines.next().map(str::trim).unwrap_or_default(); @@ -2189,6 +2209,8 @@ fn bridge_completed_resource_result( let (warnings, slice_warnings) = local_project_resource_edit_warnings_at(root, &result.operation_id) .map_err(|cause| ResourceCompletionRejection::WarningsUnreadable { cause })?; + let warnings = bounded_remote_warnings(&warnings); + let slice_warnings = bounded_remote_warnings(&slice_warnings); Ok(json!({ "status": "completed", "operationId": result.operation_id, @@ -2649,8 +2671,8 @@ async fn bridge_prepare_game_art_validated( "mode": mode.as_str(), "assetPaths": package.asset_paths, "slicePaths": package.slice_paths, - "warnings": package.warnings, - "sliceWarnings": package.slice_warnings, + "warnings": bounded_remote_warnings(&package.warnings), + "sliceWarnings": bounded_remote_warnings(&package.slice_warnings), "resources": resources, "derivativePolicy": "新建或重生成的标准图集必须包含四张 canonical 切片;旧可信图集缺少切片时只能按 warning 使用完整图集,不得伪造衍生素材", "next": "读取这些相对路径并把合适素材接入核心游戏画面" @@ -3168,8 +3190,14 @@ async fn bridge_generate_image( "taskId": generated.task_id, }, "resources": resources, - "warnings": generated.warning.map(|warning| vec![warning]).unwrap_or_default(), - "sliceWarnings": generated.slice_warning.map(|warning| vec![warning]).unwrap_or_default(), + "warnings": generated + .warning + .map(|warning| vec![bounded_remote_warning(&warning)]) + .unwrap_or_default(), + "sliceWarnings": generated + .slice_warning + .map(|warning| vec![bounded_remote_warning(&warning)]) + .unwrap_or_default(), "sliceMode": generated.slice_mode, "gridX": generated.grid_x, "gridY": generated.grid_y,