From f16ce4997d060c536870bab915b63db48fcdee4f Mon Sep 17 00:00:00 2001 From: suzmii Date: Thu, 3 Sep 2026 11:09:09 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E8=87=AA=E5=8A=A8=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E5=91=BD=E5=90=8D=E6=8F=90=E7=A4=BA=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将自动项目命名提示词迁移到 prompts 目录并由 Rust 编译期引入 说明取名附件采用独立窄 DTO 的输入边界原因 增加提示词关键约束回归测试 --- .../prompts/automatic-project-name.md | 1 + .../src-tauri/src/commands.rs | 19 +++++++++++-------- .../src-tauri/src/tests/project.rs | 4 ++++ 3 files changed, 16 insertions(+), 8 deletions(-) create mode 100644 apps/ai-game-creator-shell/src-tauri/prompts/automatic-project-name.md diff --git a/apps/ai-game-creator-shell/src-tauri/prompts/automatic-project-name.md b/apps/ai-game-creator-shell/src-tauri/prompts/automatic-project-name.md new file mode 100644 index 000000000..b7369c0f5 --- /dev/null +++ b/apps/ai-game-creator-shell/src-tauri/prompts/automatic-project-name.md @@ -0,0 +1 @@ +你是项目命名助手。只根据用户输入提炼一个原创、简短、中文的项目名称;不要使用知名作品名、路径、URL、凭据、Markdown、引号或解释。输出必须有且只有一行纯文本,长度为 2 到 16 个字符。信息不足时输出:未命名游戏原型 diff --git a/apps/ai-game-creator-shell/src-tauri/src/commands.rs b/apps/ai-game-creator-shell/src-tauri/src/commands.rs index 87a713346..76949b928 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/commands.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/commands.rs @@ -17,8 +17,10 @@ const AUTOMATIC_PROJECT_NAME_MAX_PROMPT_CHARS: usize = 8_000; const AUTOMATIC_PROJECT_NAME_MAX_ATTACHMENTS: usize = 20; const AUTOMATIC_PROJECT_NAME_MAX_OUTPUT_TOKENS: u32 = 64; const AUTOMATIC_PROJECT_NAME_SYSTEM_PROMPT: &str = - "你是项目命名助手。只根据用户输入提炼一个原创、简短、中文的项目名称;不要使用知名作品名、路径、URL、凭据、Markdown、引号或解释。输出必须有且只有一行纯文本,长度为 2 到 16 个字符。信息不足时输出:未命名游戏原型"; + include_str!("../prompts/automatic-project-name.md"); +// 自动命名只需要附件名称和媒体类型提示。保持独立的窄 DTO 并拒绝未知字段, +// 避免把 Direct 回合附件中的本地路径、导入状态和文件大小引入无项目命名边界。 #[derive(Clone, Debug, Deserialize, Eq, PartialEq)] #[serde(rename_all = "camelCase", deny_unknown_fields)] pub(crate) struct AutomaticProjectNameAttachment { @@ -95,7 +97,7 @@ async fn request_automatic_project_name( let app_config = load_game_creator_app_config()?; if app_config.agent_mode == GAME_CREATOR_AGENT_MODE_CODEX_APP_SERVER { let reply = crate::agent::direct_game_creator_home_codex_chat( - AUTOMATIC_PROJECT_NAME_SYSTEM_PROMPT.to_string(), + AUTOMATIC_PROJECT_NAME_SYSTEM_PROMPT.trim().to_string(), user_prompt, ) .await?; @@ -104,12 +106,13 @@ async fn request_automatic_project_name( let mut llm = app_config.llm.clone(); llm.max_retries = 0; let client = build_game_creator_llm_client_from_llm_config(&llm, "llm")?; - let request = LlmRunRequest::single_turn(AUTOMATIC_PROJECT_NAME_SYSTEM_PROMPT, user_prompt) - .with_api_kind(parse_game_creator_llm_api_kind(&llm.api_kind)?) - .with_model(llm.model.clone()) - .with_request_timeout_ms(llm.request_timeout_ms) - .with_max_output_tokens(AUTOMATIC_PROJECT_NAME_MAX_OUTPUT_TOKENS) - .with_web_search(false); + let request = + LlmRunRequest::single_turn(AUTOMATIC_PROJECT_NAME_SYSTEM_PROMPT.trim(), user_prompt) + .with_api_kind(parse_game_creator_llm_api_kind(&llm.api_kind)?) + .with_model(llm.model.clone()) + .with_request_timeout_ms(llm.request_timeout_ms) + .with_max_output_tokens(AUTOMATIC_PROJECT_NAME_MAX_OUTPUT_TOKENS) + .with_web_search(false); let response = client .run(request) .await diff --git a/apps/ai-game-creator-shell/src-tauri/src/tests/project.rs b/apps/ai-game-creator-shell/src-tauri/src/tests/project.rs index 31650cbc1..3dce6ada7 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/tests/project.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/tests/project.rs @@ -1650,6 +1650,10 @@ fn automatic_project_name_suggestions_are_normalized_fail_closed() { #[test] fn automatic_project_name_prompt_is_bounded_and_uses_attachment_metadata_only() { + let system_prompt = include_str!("../../prompts/automatic-project-name.md"); + assert!(system_prompt.contains("长度为 2 到 16 个字符")); + assert!(system_prompt.contains("不要使用知名作品名、路径、URL、凭据、Markdown、引号或解释")); + let prompt = build_automatic_project_name_prompt( "做一个在月球邮局送信的解谜游戏", &[