为识别根节点补充名称兜底

LLM 返回空根名称时使用页面根节点默认名称,避免空标题进入 UI 树。
This commit is contained in:
2026-09-12 21:40:20 +08:00
parent 0ea7c7745c
commit 16db7ae8aa
@@ -12,7 +12,7 @@ use crate::ui_editor::layout::node::{Node as LayoutNode, NodeMetadata, NodeSourc
use crate::ui_editor::layout::transform::Transform;
use crate::ui_editor::resource::ui_design_image::UIDesignImage;
use crate::ui_editor::state::{State, UITree};
use crate::ui_editor::utils::{random_node_id, NodeId, UIDesignImageId};
use crate::ui_editor::utils::{NodeId, UIDesignImageId, random_node_id};
use nalgebra::{Point2, Vector2};
use platform_llm::{
LlmFunctionTool, LlmMessage, LlmMessageContentPart, LlmRunRequest, LlmToolChoice,
@@ -463,19 +463,23 @@ mod tests {
let oversized = (0..=MAX_RECOGNITION_TREE_NODES)
.map(|_| serde_json::json!({"children": []}))
.collect::<Vec<_>>();
assert!(validate_recognition_response_shape(&serde_json::json!({
"trees": [{"root": {"children": oversized}}]
}))
.is_err());
assert!(
validate_recognition_response_shape(&serde_json::json!({
"trees": [{"root": {"children": oversized}}]
}))
.is_err()
);
let mut nested = serde_json::json!({"children": []});
for _ in 0..MAX_RECOGNITION_TREE_DEPTH {
nested = serde_json::json!({"children": [nested]});
}
assert!(validate_recognition_response_shape(&serde_json::json!({
"trees": [{"root": {"children": [nested]}}]
}))
.is_err());
assert!(
validate_recognition_response_shape(&serde_json::json!({
"trees": [{"root": {"children": [nested]}}]
}))
.is_err()
);
}
#[test]
@@ -595,11 +599,13 @@ mod tests {
root: test_node(),
};
assert!(validate_tree_image_ids(
&[tree(page.clone()), tree(slave.clone())],
&[page.clone(), slave.clone()],
)
.is_ok());
assert!(
validate_tree_image_ids(
&[tree(page.clone()), tree(slave.clone())],
&[page.clone(), slave.clone()],
)
.is_ok()
);
assert!(
validate_tree_image_ids(&[tree(page.clone())], &[page.clone(), slave.clone()]).is_err()
);
@@ -838,11 +844,16 @@ pub(crate) async fn recognize_ui_impl_with_provider(
Confidence::Confident => StageStatus::NoProblem,
Confidence::UnSure(reason) => StageStatus::NeedReview(reason),
};
let root_name = if recognition_root.name.trim().is_empty() {
"页面根节点".to_string()
} else {
recognition_root.name
};
let root = LayoutNode {
id: random_node_id(),
layout: ControlLayout::with_transform(Transform::stretch()),
metadata: NodeMetadata {
name: recognition_root.name,
name: root_name,
description: recognition_root.description,
layout_status: root_layout_status,
component_status: StageStatus::NoProblem,