"""按需求变更推导修改范围和是否需要规划,不调用模型""" from app.processor.base import BaseNode from app.processor.nodes.action_node import action_block_reason from app.processor.state import QueryState from app.schemas.change_scope import ChangeScope class ScopeNode(BaseNode): name = "scope_node" def process(self, state: QueryState) -> QueryState: # 浅拷贝状态 updated_state: QueryState = state.copy() # 需求节点已校验目标 ID 并落地唯一候选,范围直接由变更推导 scope = ChangeScope.from_requirement(state["requirement"]) # 保存范围,下面的动作能力检查也需要读取该结果 updated_state["change_scope"] = scope # 需要规划时先交给后续规划流程,不在此处判断能否直接生成动作 # 无需规划时检查操作能力,无法执行则记录阻塞原因,通过则返回 None reason = None if scope.needs_planning else action_block_reason(updated_state) # 写入本次检查结果,没有阻塞原因时同时清空旧的失败说明 updated_state["failure_reason"] = reason # 有阻塞原因时标记失败,否则保持运行状态,继续后续处理 updated_state["status"] = "failed" if reason else "running" return updated_state