66 @date:2024/6/4 14:30
77 @desc:
88"""
9- import time
109from functools import reduce
1110from typing import List , Dict
1211
1312from langchain .schema import HumanMessage , SystemMessage
1413from langchain_core .messages import BaseMessage
1514
16- from application .flow import tools
1715from application .flow .i_step_node import NodeResult , INode
1816from application .flow .step_node .ai_chat_step_node .i_chat_node import IChatNode
1917from setting .models_provider .tools import get_model_instance_by_model_user_id
2018
2119
20+ def _write_context (node_variable : Dict , workflow_variable : Dict , node : INode , workflow , answer : str ):
21+ chat_model = node_variable .get ('chat_model' )
22+ message_tokens = chat_model .get_num_tokens_from_messages (node_variable .get ('message_list' ))
23+ answer_tokens = chat_model .get_num_tokens (answer )
24+ node .context ['message_tokens' ] = message_tokens
25+ node .context ['answer_tokens' ] = answer_tokens
26+ node .context ['answer' ] = answer
27+ node .context ['history_message' ] = node_variable ['history_message' ]
28+ node .context ['question' ] = node_variable ['question' ]
29+ if workflow .is_result ():
30+ workflow .answer += answer
31+
32+
2233def write_context_stream (node_variable : Dict , workflow_variable : Dict , node : INode , workflow ):
2334 """
2435 写入上下文数据 (流式)
@@ -31,15 +42,8 @@ def write_context_stream(node_variable: Dict, workflow_variable: Dict, node: INo
3142 answer = ''
3243 for chunk in response :
3344 answer += chunk .content
34- chat_model = node_variable .get ('chat_model' )
35- message_tokens = chat_model .get_num_tokens_from_messages (node_variable .get ('message_list' ))
36- answer_tokens = chat_model .get_num_tokens (answer )
37- node .context ['message_tokens' ] = message_tokens
38- node .context ['answer_tokens' ] = answer_tokens
39- node .context ['answer' ] = answer
40- node .context ['history_message' ] = node_variable ['history_message' ]
41- node .context ['question' ] = node_variable ['question' ]
42- node .context ['run_time' ] = time .time () - node .context ['start_time' ]
45+ yield answer
46+ _write_context (node_variable , workflow_variable , node , workflow , answer )
4347
4448
4549def write_context (node_variable : Dict , workflow_variable : Dict , node : INode , workflow ):
@@ -51,71 +55,8 @@ def write_context(node_variable: Dict, workflow_variable: Dict, node: INode, wor
5155 @param workflow: 工作流管理器
5256 """
5357 response = node_variable .get ('result' )
54- chat_model = node_variable .get ('chat_model' )
5558 answer = response .content
56- message_tokens = chat_model .get_num_tokens_from_messages (node_variable .get ('message_list' ))
57- answer_tokens = chat_model .get_num_tokens (answer )
58- node .context ['message_tokens' ] = message_tokens
59- node .context ['answer_tokens' ] = answer_tokens
60- node .context ['answer' ] = answer
61- node .context ['history_message' ] = node_variable ['history_message' ]
62- node .context ['question' ] = node_variable ['question' ]
63-
64-
65- def get_to_response_write_context (node_variable : Dict , node : INode ):
66- def _write_context (answer , status = 200 ):
67- chat_model = node_variable .get ('chat_model' )
68-
69- if status == 200 :
70- answer_tokens = chat_model .get_num_tokens (answer )
71- message_tokens = chat_model .get_num_tokens_from_messages (node_variable .get ('message_list' ))
72- else :
73- answer_tokens = 0
74- message_tokens = 0
75- node .err_message = answer
76- node .status = status
77- node .context ['message_tokens' ] = message_tokens
78- node .context ['answer_tokens' ] = answer_tokens
79- node .context ['answer' ] = answer
80- node .context ['run_time' ] = time .time () - node .context ['start_time' ]
81-
82- return _write_context
83-
84-
85- def to_stream_response (chat_id , chat_record_id , node_variable : Dict , workflow_variable : Dict , node , workflow ,
86- post_handler ):
87- """
88- 将流式数据 转换为 流式响应
89- @param chat_id: 会话id
90- @param chat_record_id: 对话记录id
91- @param node_variable: 节点数据
92- @param workflow_variable: 工作流数据
93- @param node: 节点
94- @param workflow: 工作流管理器
95- @param post_handler: 后置处理器 输出结果后执行
96- @return: 流式响应
97- """
98- response = node_variable .get ('result' )
99- _write_context = get_to_response_write_context (node_variable , node )
100- return tools .to_stream_response (chat_id , chat_record_id , response , workflow , _write_context , post_handler )
101-
102-
103- def to_response (chat_id , chat_record_id , node_variable : Dict , workflow_variable : Dict , node , workflow ,
104- post_handler ):
105- """
106- 将结果转换
107- @param chat_id: 会话id
108- @param chat_record_id: 对话记录id
109- @param node_variable: 节点数据
110- @param workflow_variable: 工作流数据
111- @param node: 节点
112- @param workflow: 工作流管理器
113- @param post_handler: 后置处理器
114- @return: 响应
115- """
116- response = node_variable .get ('result' )
117- _write_context = get_to_response_write_context (node_variable , node )
118- return tools .to_response (chat_id , chat_record_id , response , workflow , _write_context , post_handler )
59+ _write_context (node_variable , workflow_variable , node , workflow , answer )
11960
12061
12162class BaseChatNode (IChatNode ):
@@ -132,13 +73,12 @@ def execute(self, model_id, system, prompt, dialogue_number, history_chat_record
13273 r = chat_model .stream (message_list )
13374 return NodeResult ({'result' : r , 'chat_model' : chat_model , 'message_list' : message_list ,
13475 'history_message' : history_message , 'question' : question .content }, {},
135- _write_context = write_context_stream ,
136- _to_response = to_stream_response )
76+ _write_context = write_context_stream )
13777 else :
13878 r = chat_model .invoke (message_list )
13979 return NodeResult ({'result' : r , 'chat_model' : chat_model , 'message_list' : message_list ,
14080 'history_message' : history_message , 'question' : question .content }, {},
141- _write_context = write_context , _to_response = to_response )
81+ _write_context = write_context )
14282
14383 @staticmethod
14484 def get_history_message (history_chat_record , dialogue_number ):
0 commit comments