diff --git a/app/tree/environment.py b/app/tree/environment.py index df0532e..b89df7b 100644 --- a/app/tree/environment.py +++ b/app/tree/environment.py @@ -94,6 +94,19 @@ _ENTITY_FIELDS_BY_LEVEL: dict[str, tuple[str, ...]] = { } +def _clean_join(values: object) -> str: + """过滤非空字符串、去重(保序)、分号拼接;无有效值返回空串。 + + 参数: + values: 待清洗的值集合(通常为 list[str],容忍 None / 混入非字符串)。 + + 返回: + "a; b; c" 形式的拼接串,无有效值时为空串。 + """ + cleaned = [v.strip() for v in (values or []) if isinstance(v, str) and v.strip()] + return "; ".join(dict.fromkeys(cleaned)) + + def _collect_from_obj( obj: object, out: list[str], @@ -240,23 +253,18 @@ class TreeEnvironment: if node is None: raise KeyError(f"节点不存在: {node_id}") level = _node_level(node) - out: dict[str, str] = {} entity_values: list[str] = [] for field_name in _ENTITY_FIELDS_BY_LEVEL[level]: - for value in getattr(node.card, field_name) or []: - if isinstance(value, str) and value.strip(): - entity_values.append(value.strip()) - if entity_values: - out["实体"] = "; ".join(dict.fromkeys(entity_values)) + entity_values.extend(getattr(node.card, field_name) or []) - text_values = [ - v.strip() - for v in (getattr(node.card, "visible_text", None) or []) - if isinstance(v, str) and v.strip() - ] - if text_values: - out["画面文字"] = "; ".join(dict.fromkeys(text_values)) + out: dict[str, str] = {} + entities_text = _clean_join(entity_values) + if entities_text: + out["实体"] = entities_text + visible_text = _clean_join(getattr(node.card, "visible_text", None)) + if visible_text: + out["画面文字"] = visible_text return out def search_similar(