Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion velvetflow/planner/params_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,13 @@ def _reasoning_params_schema() -> Dict[str, Any]:
"items": {"type": "string"},
},
},
"required": ["task_prompt"],
"required": [
"system_prompt",
"task_prompt",
"context",
"expected_output_format",
"toolset",
],
"additionalProperties": True,
}

Expand Down
56 changes: 56 additions & 0 deletions velvetflow/planner/structure.py
Original file line number Diff line number Diff line change
Expand Up @@ -1435,6 +1435,34 @@ def add_reasoning_node(
params=params or {},
action_schemas=action_schemas,
)
required_reasoning_fields = (
"system_prompt",
"task_prompt",
"context",
"expected_output_format",
"toolset",
)
missing_reasoning_fields = []
for field in required_reasoning_fields:
value = cleaned_params.get(field)
if value is None:
missing_reasoning_fields.append(field)
elif isinstance(value, str) and not value.strip():
missing_reasoning_fields.append(field)
elif isinstance(value, (list, dict)) and not value:
missing_reasoning_fields.append(field)
Comment on lines +1449 to +1453
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Allow empty context/toolset for reasoning nodes

The new validation treats any empty list/dict/blank string as “missing” for all required reasoning fields, so toolset: [] or context: {} now causes add_reasoning_node to reject nodes that intentionally have no tools or no context. This is a regression because the executor already tolerates toolset being empty (it resolves to no tools) and can build prompts without context; workflows that previously created tool-free or context-free reasoning nodes will now fail validation even though they still execute correctly.

Useful? React with 👍 / 👎.

if missing_reasoning_fields:
result = _build_validation_error(
(
"reasoning 节点 params 缺少必填字段,"
"且 out_params_schema 必须与 expected_output_format 一致。"
"请补全后重新调用 add_reasoning_node。"
),
missing_fields=missing_reasoning_fields,
required_fields=list(required_reasoning_fields),
required_out_params_schema="expected_output_format",
)
return _return_tool_result("add_reasoning_node", result)
out_params_schema = cleaned_params.get("expected_output_format")
ref_error = _validate_existing_references(
node_id=id, params=cleaned_params, depends_on=depends_on or []
Expand Down Expand Up @@ -1953,6 +1981,34 @@ def update_reasoning_node(
params=params or {},
action_schemas=action_schemas,
)
required_reasoning_fields = (
"system_prompt",
"task_prompt",
"context",
"expected_output_format",
"toolset",
)
missing_reasoning_fields = []
for field in required_reasoning_fields:
value = cleaned_params.get(field)
if value is None:
missing_reasoning_fields.append(field)
elif isinstance(value, str) and not value.strip():
missing_reasoning_fields.append(field)
elif isinstance(value, (list, dict)) and not value:
missing_reasoning_fields.append(field)
if missing_reasoning_fields:
result = _build_validation_error(
(
"reasoning 节点 params 缺少必填字段,"
"且 out_params_schema 必须与 expected_output_format 一致。"
"请补全后重新调用 update_reasoning_node。"
),
missing_fields=missing_reasoning_fields,
required_fields=list(required_reasoning_fields),
required_out_params_schema="expected_output_format",
)
return _return_tool_result("update_reasoning_node", result)
updates["params"] = cleaned_params
updates["out_params_schema"] = cleaned_params.get("expected_output_format")
reference_issues, available_nodes = _collect_param_reference_issues(cleaned_params)
Expand Down
Loading