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

  1. Print the workflow's node ids and verify the requested node_id exists (exact string match)
  2. Fix the referencing node's config to point at the correct current node id
  3. Re-export/re-publish the workflow so the protocol contains all referenced nodes
  4. 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

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


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)