Files
ailine/backend/app/main_graph/nodes/finalize.py

60 lines
1.9 KiB
Python
Raw Normal View History

2026-04-21 11:02:16 +08:00
"""
完成事件节点模块
负责发送完成事件包含token使用情况和耗时信息
"""
from typing import Any, Dict
# 本地模块
2026-05-05 23:17:00 +08:00
from ...main_graph.state import MainGraphState
from ...utils.logging import log_state_change
from ...logger import info, warning
2026-04-21 11:02:16 +08:00
from langchain_core.runnables.config import RunnableConfig
async def finalize_node(state: MainGraphState, config: RunnableConfig) -> Dict[str, Any]:
2026-04-21 11:02:16 +08:00
"""
完成事件节点 - 发送完成事件包含token使用情况和耗时信息
2026-04-21 11:02:16 +08:00
Args:
state: 当前对话状态
2026-04-21 11:02:16 +08:00
config: 运行时配置
2026-04-21 11:02:16 +08:00
Returns:
更新后的状态包含 final_result
2026-04-21 11:02:16 +08:00
"""
log_state_change("finalize", state, "进入")
# 确保 final_result 被传递出去
result = {
"final_result": state.final_result,
"success": state.success,
"current_phase": "done"
}
2026-04-21 11:02:16 +08:00
try:
# 获取流式写入器并发送完成事件
2026-05-05 23:17:00 +08:00
from backend.app.main_graph.config import get_stream_writer
2026-04-21 11:02:16 +08:00
writer = get_stream_writer()
# 只在 writer 存在且不是 noop 时才发送
if writer and hasattr(writer, '__call__'):
try:
writer({
"type": "custom",
"data": {
"type": "done",
"token_usage": state.last_token_usage,
"elapsed_time": state.last_elapsed_time,
"final_result": state.final_result
}
})
info("🏁 [完成事件] 已发送完成事件")
except Exception as e:
warning(f"⚠️ [完成事件] 发送完成事件失败 (非致命): {e}")
2026-04-21 11:02:16 +08:00
except Exception as e:
warning(f"⚠️ [完成事件] 处理失败 (非致命): {e}")
2026-04-21 11:02:16 +08:00
log_state_change("finalize", state, "离开")
return result