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

54 lines
1.7 KiB
Python
Raw Normal View History

2026-04-21 11:02:16 +08:00
"""
完成事件节点模块
负责发送完成事件包含token使用情况和耗时信息
"""
from typing import Any, Dict
from app.main_graph.config import get_stream_writer
2026-04-21 11:02:16 +08:00
# 本地模块
from app.main_graph.state import MessagesState
from app.utils.logging import log_state_change
from app.logger import info, error
2026-04-21 11:02:16 +08:00
from langchain_core.runnables.config import RunnableConfig
def _get_attr(state, attr_name, default=None):
"""通用方法:兼容 dict 和 dataclass 两种状态格式"""
if isinstance(state, dict):
return state.get(attr_name, default)
else:
return getattr(state, attr_name, default)
async def finalize_node(state, config: RunnableConfig) -> Dict[str, Any]:
2026-04-21 11:02:16 +08:00
"""
完成事件节点 - 发送完成事件包含token使用情况和耗时信息
Args:
state: 当前对话状态兼容 dict dataclass
2026-04-21 11:02:16 +08:00
config: 运行时配置
2026-04-21 11:02:16 +08:00
Returns:
空字典完成节点无状态更新
"""
log_state_change("finalize", state, "进入")
try:
# 获取流式写入器并发送完成事件
writer = get_stream_writer()
writer({
"type": "custom",
"data": {
"type": "done",
"token_usage": _get_attr(state, "last_token_usage", {}),
"elapsed_time": _get_attr(state, "last_elapsed_time", 0.0)
2026-04-21 11:02:16 +08:00
}
})
info("🏁 [完成事件] 已发送完成事件包含token使用情况和耗时信息")
except Exception as e:
error(f"❌ [完成事件] 发送完成事件时发生异常: {e}")
log_state_change("finalize", state, "离开")
return {}