refactor: tighten backend, flows, frontend, tests; push flows to Langflow
This commit is contained in:
parent
6688fb08c6
commit
06ab25fb47
31 changed files with 783 additions and 358 deletions
|
|
@ -21,7 +21,10 @@ Looks for form nodes — ``CustomInput*`` (``data.type`` or the inner
|
|||
* ``[visible_if ...]`` markers in ``info`` → conditional branches
|
||||
(``allOf`` with ``if``/``then`` per dependent field, arbitrarily nested;
|
||||
see ``_extract_visibility``). The marker is stripped from the shown
|
||||
description.
|
||||
description. Preferred: structured ``visible_if`` key (list of
|
||||
``{field, value}`` or ``{field: value}``) — no quoting mini-language,
|
||||
rename-refactorable, validated at sync time with warnings instead of
|
||||
silent fail-open. Markers stay as deprecated fallback.
|
||||
|
||||
A flow without such a node gets ``{fallback: "textarea"}``: the frontend
|
||||
renders one free-text box instead of a generated form.
|
||||
|
|
@ -177,9 +180,28 @@ def _parse_condition(token: str) -> tuple[str, object] | None:
|
|||
return field, value
|
||||
|
||||
|
||||
def _extract_visibility(info: str) -> tuple[str, list[tuple[str, object]]]:
|
||||
"""(marker-free description, conditions) for a field's ``info`` text."""
|
||||
conditions: list[tuple[str, object]] = []
|
||||
def _extract_visibility(
|
||||
info: str, field: dict | None = None
|
||||
) -> tuple[str, list[tuple[str, object]]]:
|
||||
"""(marker-free description, conditions) for a field's ``info`` text.
|
||||
|
||||
Structured ``visible_if`` on the field wins (list of {field, value} or
|
||||
dict); legacy ``[visible_if ...]`` markers in ``info`` stay as fallback.
|
||||
"""
|
||||
if field is not None:
|
||||
structured = field.get("visible_if")
|
||||
if structured:
|
||||
conditions: list[tuple[str, object]] = []
|
||||
items = structured.items() if isinstance(structured, dict) else structured
|
||||
for item in items or []:
|
||||
if isinstance(item, dict) and "field" in item:
|
||||
conditions.append((item["field"], item.get("value")))
|
||||
elif isinstance(item, (list, tuple)) and len(item) == 2:
|
||||
conditions.append((item[0], item[1]))
|
||||
if conditions:
|
||||
clean = re.sub(r"\s+", " ", (info or "")).strip()
|
||||
return clean, conditions
|
||||
conditions = []
|
||||
|
||||
def _collect(match: re.Match) -> str:
|
||||
for token in _split_conditions(match.group(1)):
|
||||
|
|
@ -263,7 +285,7 @@ def extract_form_schema(langflow_json: dict) -> dict:
|
|||
suffix += 1
|
||||
name = f"{name}_{suffix}"
|
||||
taken.add(name)
|
||||
clean_info, conditions = _extract_visibility(str(field.get("info") or ""))
|
||||
clean_info, conditions = _extract_visibility(str(field.get("info") or ""), field)
|
||||
records.append(
|
||||
{
|
||||
"name": name,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue