fix(builder): align backend contracts and fixtures with main CI

This commit is contained in:
twwu committed 2026-11-03 14:53:59 +08:00
1 parent 969de89727
commit 45ca55e266
167 files changed
+2836 -1975

No files matched your search

@@ -8,7 +8,6 @@ The caller supplies its existing placeholder grammar; no runtime lookup occurs.
from collections import Counter
from collections.abc import Mapping, Sequence
from re import Pattern
from typing import cast
from services.dify_builder.native_api_output_contract import is_native_api_tool
@@ -30,7 +29,7 @@ def normalize_native_api_string_bindings(
Sources, declarations and original binding objects are never mutated.
"""
raw = tool_data.get("tool_parameters")
bindings = dict(cast(Mapping[str, object], raw)) if isinstance(raw, Mapping) else {}
bindings: dict[str, object] = dict(raw) if isinstance(raw, Mapping) else {}
if not is_native_api_tool(tool_data):
return bindings
@@ -40,9 +39,10 @@ def normalize_native_api_string_bindings(
node_id, data = node.get("id"), node.get("data")
if not isinstance(node_id, str) or node_counts[node_id] != 1 or not isinstance(data, Mapping):
continue
if data.get("type") != "start" or not isinstance(data.get("variables"), list):
raw_variables = data.get("variables")
if data.get("type") != "start" or not isinstance(raw_variables, list):
continue
variables = [item for item in cast(list[object], data["variables"]) if isinstance(item, Mapping)]
variables = [item for item in raw_variables if isinstance(item, Mapping)]
counts = Counter(item.get("variable") for item in variables if isinstance(item.get("variable"), str))
for variable in variables:
name = variable.get("variable")
@@ -66,7 +66,9 @@ def normalize_native_api_string_bindings(
selector = binding.get("value")
if not isinstance(selector, list) or len(selector) != 2 or not all(isinstance(part, str) for part in selector):
continue
source_id, field = cast(list[str], selector)
source_id, field = selector
assert isinstance(source_id, str)
assert isinstance(field, str)
# A dot inside the direct field would become a different nested selector
# when the native template resolver splits its placeholder on dots.
if "." in field or (source_id, field) not in string_selectors: