iflytek/astron-agent · error · CustomException
ENG_PROTOCOL_VALIDATE_ERROR
ENG_PROTOCOL_VALIDATE_ERROR
Error message
Node configuration information not found, node id = {node_id} What it means
Raised by VariablePool.get_node_protocol when iterating the workflow's node list finds no node whose id matches the requested node_id, as a CustomException with code ENG_PROTOCOL_VALIDATE_ERROR. It means the workflow protocol (node definitions) loaded into the pool does not contain the node being looked up.
Solutions
- Print the workflow's node ids and verify the requested node_id exists (exact string match)
- Fix the referencing node's config to point at the correct current node id
- Re-export/re-publish the workflow so the protocol contains all referenced nodes
- Normalize ids (strip whitespace, consistent casing) when constructing the workflow definition
Example fix
// before
protocol = pool.get_node_protocol(node_id)
// after
node_ids = {n.id for n in pool.nodes}
if node_id not in node_ids:
raise ValueError(f"unknown node {node_id}, known: {node_ids}")
protocol = pool.get_node_protocol(node_id) Defensive patterns
Strategy: validation
Validate before calling
node_ids = {n.id for n in pool.nodes}
if node_id not in node_ids:
raise ValueError(f"node {node_id} not in workflow; known ids: {sorted(node_ids)}") Type guard
def node_exists(pool, node_id: str) -> bool:
return any(n.id == node_id for n in pool.nodes) Try / catch
try:
data = pool.get_node_protocol(node_id)
except CustomException as e:
if e.err_code == CodeEnum.ENG_PROTOCOL_VALIDATE_ERROR:
data = None # handle missing node
else:
raise Prevention
- Never hardcode node ids; resolve them from the workflow definition
- Re-validate all cross-node references after editing a workflow
- Strip whitespace and normalize casing of node ids at import time
When it happens
Trigger: Calling get_node_protocol(node_id) — directly or indirectly via _add_chat_history_if_needed, _process_llm_output_stream, or execute — with a node_id absent from self.nodes.
Common situations: Stale node references after a workflow was edited (node deleted/recreated with a new id); nodes imported from another workflow; case-mismatched or whitespace-polluted node ids; referencing a node that failed to deserialize.
Understand the failure class
Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.
Related errors
- PARSE_INPUT_PARAM_TYPE_FAILED
- Failed to convert literal value
- VARIABLE_POOL_SET_PARAMETER_ERROR
- VARIABLE_POOL_GET_PARAMETER_ERROR
- get variable error
AI-assisted analysis of iflytek/astron-agent@5e758547a8 (2026-09-12).
Data as JSON: /api/errors/5a8b07aec9b251cf.
Report an issue: GitHub.
Appendix: source
Thrown at core/workflow/engine/entities/variable_pool.py:343
"""
if node_id not in self.stream_node_has_sent_first_token:
self.stream_node_has_sent_first_token[node_id] = False
return False
return self.stream_node_has_sent_first_token[node_id]
def get_node_protocol(self, node_id: str) -> NodeData:
"""
Get the protocol data for a specific node.
:param node_id: ID of the node
:return: Node data protocol
:raises CustomException: If node is not found
"""
for node in self.nodes:
if node_id == node.id:
return node.data
raise CustomException(
err_code=CodeEnum.ENG_PROTOCOL_VALIDATE_ERROR,
err_msg=f"Node configuration information not found, node id = {node_id}",
)
def protocol_inputs_parser(self) -> None:
"""
Parse protocol inputs and populate input variable mapping.
"""
for node in self.nodes:
node_id = node.id
node_inputs = node.data.inputs
for node_input in node_inputs:
input_key = node_input.name
input_schema = node_input.input_schema
input_value = input_schema.value
json_input_type = input_schema.type
python_input_type_list = schema_type_map_python.get(json_input_type, [])View on GitHub (pinned to 5e758547a8)