52 lines
2.0 KiB
Python
52 lines
2.0 KiB
Python
"""统一收尾能力不足、资源缺失和动作修正失败"""
|
|
|
|
from app.processor.base import BaseNode
|
|
from app.processor.state import QueryState
|
|
|
|
|
|
class FallbackNode(BaseNode):
|
|
name = "fallback_node"
|
|
|
|
def process(self, state: QueryState) -> QueryState:
|
|
# 浅拷贝状态
|
|
updated_state: QueryState = state.copy()
|
|
# 读取上游记录的具体失败原因
|
|
reason = state.get("failure_reason")
|
|
|
|
# 如果上游没有提供有效原因,则根据校验错误补充失败说明
|
|
if not reason:
|
|
# 如果仍有校验错误,使用达到自动修正上限的说明,并带上已重试次数
|
|
if state.get("validation_errors"):
|
|
reason = f"动作校验未通过,已达到自动修正上限,共重试 {state.get('retry_count', 0)} 次"
|
|
else:
|
|
# 如果既没有具体原因也没有校验错误,使用通用说明,避免返回空原因
|
|
reason = "当前需求未能完成,缺少具体失败原因"
|
|
|
|
# 将任务标记为最终失败,结束本轮处理
|
|
updated_state["status"] = "failed"
|
|
# 保存上游原因或本节点补充的说明,供后续输出给用户
|
|
updated_state["failure_reason"] = reason
|
|
# 显式标记校验未通过,防止残留动作被当作可执行结果
|
|
updated_state["validation_passed"] = False
|
|
# 清空旧模拟快照,避免失败结果中仍携带之前的成功快照
|
|
updated_state["simulated_screen"] = None
|
|
|
|
# 返回统一的失败状态,保留原动作和错误信息供排查
|
|
return updated_state
|
|
|
|
|
|
if __name__ == "__main__":
|
|
from app.schemas.action_validation import ActionValidationError
|
|
|
|
state = {
|
|
"request": {},
|
|
"retry_count": 2,
|
|
"actions": None,
|
|
"validation_errors": [
|
|
ActionValidationError(code="generation_error", message="动作生成失败")
|
|
],
|
|
}
|
|
node = FallbackNode()
|
|
final_state = node.process(state)
|
|
print(final_state)
|