From 938b7ce654b34e849664104bf7ce34935a9ecffe Mon Sep 17 00:00:00 2001 From: Linghong Date: Thu, 20 Aug 2026 13:40:30 +0000 Subject: [PATCH] =?UTF-8?q?=E6=89=8B=E5=8A=A8=E6=8F=90=E4=BA=A4=EF=BC=9A?= =?UTF-8?q?=E4=BF=AE=E5=A4=8DCI=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../provider_request_builders.rs | 91 ++++++++++++------- .../agent/runtime_driver/main_loop_tests.rs | 6 +- .../src/agent/runtime_driver/task_start.rs | 50 ++++++---- 3 files changed, 90 insertions(+), 57 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_actions/provider_request_builders.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_actions/provider_request_builders.rs index a229f3c67..66f087bf6 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_actions/provider_request_builders.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_actions/provider_request_builders.rs @@ -1346,16 +1346,25 @@ mod tests { } } - #[test] - fn autonomous_art_director_advertises_canvas_without_smoke_or_preview_tools() { - let _config_guard = crate::tests::write_test_local_config( - r#"{"editorApi":{"apiKey":"art-director-provider-key"}}"#.to_string(), - ); - let request = build_autonomous_ready_child_request( - "art-director", - AGENT_RUNTIME_SUPERVISOR_GUI_SOURCE, - "art-director-canvas-only", - ); + #[tokio::test] + async fn autonomous_art_director_advertises_canvas_without_smoke_or_preview_tools() { + // debug 构建下 editor_api_mode() 恒为 PlatformAccount,配置里的 + // editorApi.apiKey 会被 editor_api_key_is_configured 完全忽略;只有凭据 + // override 或平台会话才算「已配置」,Canvas 才会进工具目录。 + let request = crate::assets::with_external_editor_api_credentials( + crate::assets::external_editor_api_credentials_for_test( + "https://editor.test".to_string(), + "art-director-provider-key".to_string(), + ), + async { + build_autonomous_ready_child_request( + "art-director", + AGENT_RUNTIME_SUPERVISOR_GUI_SOURCE, + "art-director-canvas-only", + ) + }, + ) + .await; assert!(request_advertises_native_tool( &request, "canvas.asset_generate" @@ -1427,8 +1436,8 @@ mod tests { assert!(!publish_prompts.contains("固定 owner 收束协议")); } - #[test] - fn art_director_request_exposes_canvas_only_for_the_keyed_owner_route() { + #[tokio::test] + async fn art_director_request_exposes_canvas_only_for_the_keyed_owner_route() { { let _config_guard = crate::tests::write_test_local_config("{}".to_string()); let request = build_autonomous_ready_child_request( @@ -1452,30 +1461,42 @@ mod tests { ); assert!(prompts.contains("不调用 canvas.asset_generate")); } - { - let _config_guard = crate::tests::write_test_local_config( - r#"{"editorApi":{"apiKey":"provider-art-director-key"}}"#.to_string(), + // debug 构建下 editor_api_mode() 恒为 PlatformAccount,配置里的 + // editorApi.apiKey 会被 editor_api_key_is_configured 完全忽略;只有凭据 + // override 或平台会话才算「已配置」。 + let request = crate::assets::with_external_editor_api_credentials( + crate::assets::external_editor_api_credentials_for_test( + "https://editor.test".to_string(), + "provider-art-director-key".to_string(), + ), + async { + build_autonomous_ready_child_request( + "art-director", + AGENT_RUNTIME_SUPERVISOR_CLI_SOURCE, + "art-director-keyed", + ) + }, + ) + .await; + assert!(request_advertises_native_tool( + &request, + "canvas.asset_generate" + )); + let prompts = request + .messages + .iter() + .map(|message| message.content.as_str()) + .collect::>() + .join( + " +", ); - let request = build_autonomous_ready_child_request( - "art-director", - AGENT_RUNTIME_SUPERVISOR_CLI_SOURCE, - "art-director-keyed", - ); - assert!(request_advertises_native_tool( - &request, - "canvas.asset_generate" - )); - let prompts = request - .messages - .iter() - .map(|message| message.content.as_str()) - .collect::>() - .join("\n"); - assert!(prompts.contains("条件 Canvas owner 任务")); - assert!(prompts.contains("assets/art-spec.png")); - assert!(prompts.contains("成功只表示候选已生成并登记,不等于视觉门已经通过")); - assert!(!prompts.contains("成功会为本人当前 revision 形成验证凭证")); - } + assert!(prompts.contains("非只读视觉规范生成任务")); + assert!(prompts + .contains(crate::agent::AGENT_RUNTIME_AUTONOMOUS_ART_DIRECTOR_CANVAS_ONLY_TASK_MARKER)); + assert!(prompts.contains("assets/art-spec.png")); + assert!(prompts.contains("会同时提交当前 run 的 mutation 与验证凭证")); + assert!(!prompts.contains("无生图凭据只读协调任务")); } #[test] diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_driver/main_loop_tests.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_driver/main_loop_tests.rs index ee4b7103d..e304642d8 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_driver/main_loop_tests.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_driver/main_loop_tests.rs @@ -3355,14 +3355,16 @@ fn prepare_autonomous_playtest_evidence_for_actor_at_revision( ) .expect("bind deterministic game-chat collaboration policy"); + // 回执现在冻结执行者身份,证据路径按 executor 的 agent/run 校验;夹具必须落在 + // 实际执行试玩的 actor 名下,而不是合同根。 let evidence_root = root .join(".agent/runtime/browser-validations") .join(agent_runtime_confirmation_path_component( - &contract_state.agent_id, + &actor_state.agent_id, "agent", )) .join(agent_runtime_confirmation_path_component( - &contract_state.run_id, + &actor_state.run_id, "run", )) .join(revision.to_string()); diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_driver/task_start.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_driver/task_start.rs index c1cdeda2e..1858397e7 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_driver/task_start.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_driver/task_start.rs @@ -1750,8 +1750,8 @@ mod tests { assert!(!publish_prompt.contains("验证本人固定 owner 产物")); } - #[test] - fn art_director_ready_task_is_read_only_without_key_and_canvas_owner_with_key() { + #[tokio::test] + async fn art_director_ready_task_is_read_only_without_key_and_canvas_owner_with_key() { let task = seed_task("art-director"); { let _config_guard = crate::tests::write_test_local_config("{}".to_string()); @@ -1767,23 +1767,33 @@ mod tests { &prompt )); } - { - let _config_guard = crate::tests::write_test_local_config( - r#"{"editorApi":{"apiKey":"art-director-ready-task-key"}}"#.to_string(), - ); - let prompt = render_autonomous_manifest_ready_task_background_prompt(&task); - assert!(prompt.contains("条件 Canvas owner 任务")); - assert!(prompt.contains("生成并登记 assets/art-spec.png")); - assert!(prompt.contains("成功只表示候选已生成并登记,不等于视觉门已经通过")); - assert!(prompt.contains("由 Runtime 在收束时核对当前 revision")); - assert!(!prompt.contains("成功会为本人当前 revision 形成验证凭证")); - assert!(autonomous_manifest_ready_task_requires_visual_asset( - "art-director" - )); - assert!(!agent_runtime_task_requires_read_only_delivery( - "art-director", - &prompt - )); - } + // debug 构建下 editor_api_mode() 恒为 PlatformAccount,配置里的 + // editorApi.apiKey 会被 editor_api_key_is_configured 完全忽略,只有凭据 + // override 或平台会话才算「已配置」。用支持的 override 钩子模拟。 + crate::assets::with_external_editor_api_credentials( + crate::assets::external_editor_api_credentials_for_test( + "https://editor.test".to_string(), + "art-director-ready-task-key".to_string(), + ), + async { + let prompt = render_autonomous_manifest_ready_task_background_prompt(&task); + assert!(prompt.contains("非只读视觉规范生成任务")); + assert!(prompt.contains( + crate::agent::AGENT_RUNTIME_AUTONOMOUS_ART_DIRECTOR_CANVAS_ONLY_TASK_MARKER + )); + assert!(prompt.contains("生成并登记 assets/art-spec.png")); + assert!(prompt.contains("会同时提交当前 run 的 mutation 与验证凭证")); + assert!(prompt.contains("Runtime 会在子 Run 终态后幂等投影 manifest")); + assert!(!prompt.contains("无生图凭据只读协调任务")); + assert!(autonomous_manifest_ready_task_requires_visual_asset( + "art-director" + )); + assert!(!agent_runtime_task_requires_read_only_delivery( + "art-director", + &prompt + )); + }, + ) + .await; } }