from __future__ import annotations """定稿渲染节点:调用FinalizationService将审核通过的方案渲染为面向用户的Markdown最终答复。""" from typing import Any from app.graph.state import TravelState from app.services.finalization_service import ( FinalizationService, ) def make_finalization_node( service: FinalizationService | None = None, ): """创建最终回答生成节点。""" finalization_service = ( service or FinalizationService() ) def finalization_node( state: TravelState, ) -> dict[str, Any]: """定稿节点:收集请求、方案、校验与审查结果,渲染为完整的最终旅行方案文本。""" request = state.get("travel_request") plan = state.get("itinerary_plan") validation = state.get( "plan_validation_result" ) review = state.get( "trip_review_result" ) missing: list[str] = [] if request is None: missing.append("travel_request") if plan is None: missing.append("itinerary_plan") if validation is None: missing.append( "plan_validation_result" ) if review is None: missing.append( "trip_review_result" ) if missing: message = ( "最终输出阶段缺少必要状态:" + "、".join(missing) ) existing_errors = list( state.get("errors", []) ) existing_errors.append(message) return { "errors": existing_errors, "workflow_status": "failed", "final_answer": message, } workflow_status = state.get( "workflow_status", "completed_with_risks", ) approved = ( workflow_status == "approved" ) answer = finalization_service.render( request=request, plan=plan, validation=validation, review=review, approved=approved, planning_attempts=state.get( "planning_attempts", 0, ), supervisor_reason=state.get( "supervisor_reason", "未提供Supervisor说明。", ), ) return { "final_answer": answer, } return finalization_node