补齐画布Agent业务提示词契约测试

覆盖确认取消、取消后新调用与无依赖批量串行策略

覆盖消息窗口截断、窗口外重新引用与工具路由矩阵
This commit is contained in:
2026-07-31 11:53:48 +08:00
parent 2b785423ed
commit ce47df4c3d
@@ -81,3 +81,114 @@ pub fn generate_ui_design_tool_description() -> String {
"仅用于生成完整可用的 UI 设计图或界面稿,包括 HUD、弹窗、面板、按钮组合和整页界面。不要用于提取图标、拆素材;{EXISTING_IMAGE_EDIT_POLICY}。UI 规范图、组件规范展板或视觉规范展板属于规范展板,{SPEC_BOARD_ROUTE_POLICY}。只能输出一张图"
)
}
#[cfg(test)]
mod tests {
use super::*;
use platform_agent_harness::prompt::build_tools_system_prompt;
use platform_llm::LlmMessageRole;
use shared_contracts::editor_agent::{
EDITOR_AGENT_MESSAGES_DOCUMENT_VERSION, EditorAgentMessage,
};
#[test]
fn business_prompt_keeps_pending_confirmation_and_cancellation_policy() {
let prompt = editor_agent_system_prompt();
assert!(prompt.contains("pending confirmation/completed/cancelled"));
assert!(prompt.contains("用户界面工具消息的确认/取消按钮"));
assert!(prompt.contains("引导他使用确认/取消按钮"));
assert!(prompt.contains("禁止在对话中dump参数"));
}
#[test]
fn business_prompt_allows_new_calls_after_cancelled_or_pending_calls() {
let prompt = editor_agent_system_prompt();
assert!(prompt.contains("已经被用户取消的工具调用是无法再次被确认的"));
assert!(prompt.contains("如果用户明确要修改, 请发起新工具调用"));
assert!(prompt.contains("一个等待确认的工具调用不影响另一个工具调用的发起"));
assert!(prompt.contains("不要因为尚未确认或完成就拒绝发起另一个"));
}
#[test]
fn final_business_prompt_batches_independent_calls_but_keeps_serial_execution() {
let prompt = build_tools_system_prompt(editor_agent_system_prompt(), &[]);
assert!(prompt.contains("尽可能多(无依赖)的工具调用"));
assert!(prompt.contains("尽量批量"));
assert!(prompt.contains("(sequentially inside)"));
assert!(prompt.contains("call them in a batch instead of one call per turn"));
}
#[test]
fn prompt_memory_keeps_only_the_latest_window_before_history_end() {
let messages = (0..20)
.map(|index| EditorAgentMessage {
id: index,
client_message_id: None,
role: match index % 3 {
0 => EditorAgentMessageRole::User,
1 => EditorAgentMessageRole::Assistant,
_ => EditorAgentMessageRole::System,
},
text: format!("message-{index}"),
attachments: Vec::new(),
tool_call: None,
created_at: format!("created-{index}"),
})
.collect::<Vec<_>>();
let document = EditorAgentConversationMessagesDocument {
version: EDITOR_AGENT_MESSAGES_DOCUMENT_VERSION,
conversation_id: "conversation-1".to_string(),
messages,
};
let memory = build_prompt_memory(&document, 19);
assert_eq!(memory.len(), EDITOR_AGENT_MAX_RECENT_PROMPT_MESSAGES);
for (offset, message) in memory.iter().enumerate() {
let source_index = offset + 1;
assert_eq!(message.content, format!("message-{source_index}"));
assert_eq!(
message.role,
match source_index % 3 {
0 => LlmMessageRole::User,
1 => LlmMessageRole::Assistant,
_ => LlmMessageRole::System,
}
);
}
assert!(memory.iter().all(|message| message.content != "message-0"));
assert!(memory.iter().all(|message| message.content != "message-19"));
}
#[test]
fn business_prompt_requests_a_new_reference_when_history_is_outside_the_window() {
let prompt = editor_agent_system_prompt();
assert!(prompt.contains("滑动窗口上下文有限"));
assert!(prompt.contains("可能被历史截断了"));
assert!(prompt.contains("请求用户重新引用"));
assert!(prompt.contains("但不是告诉你image_id"));
}
#[test]
fn tool_descriptions_keep_edit_and_spec_board_routes_consistent() {
let edit_image = edit_image_tool_description();
let generate_image = generate_image_tool_description();
let character = generate_character_tool_description();
let icons = generate_icon_spritesheet_tool_description();
let ui = generate_ui_design_tool_description();
assert!(edit_image.contains(EXISTING_IMAGE_EDIT_POLICY));
assert!(generate_image.contains(EXISTING_IMAGE_EDIT_POLICY));
assert!(generate_image.contains(SPEC_BOARD_ROUTE_POLICY));
assert!(generate_image.contains(SPEC_BOARD_CONTENT_POLICY));
assert!(character.contains(EXISTING_IMAGE_EDIT_POLICY));
assert!(character.contains(SPEC_BOARD_ROUTE_POLICY));
assert!(icons.contains(SPEC_BOARD_ROUTE_POLICY));
assert!(ui.contains(EXISTING_IMAGE_EDIT_POLICY));
assert!(ui.contains(SPEC_BOARD_ROUTE_POLICY));
}
}