为识别根节点补充名称兜底
LLM 返回空根名称时使用页面根节点默认名称,避免空标题进入 UI 树。
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user