@@ -57,13 +57,20 @@ def write_context(node_variable: Dict, workflow_variable: Dict, node: INode, wor
57
57
_write_context (node_variable , workflow_variable , node , workflow , answer )
58
58
59
59
60
+ def file_id_to_base64 (file_id : str ):
61
+ file = QuerySet (File ).filter (id = file_id ).first ()
62
+ base64_image = base64 .b64encode (file .get_byte ()).decode ("utf-8" )
63
+ return base64_image
64
+
65
+
60
66
class BaseImageUnderstandNode (IImageUnderstandNode ):
61
67
def save_context (self , details , workflow_manage ):
62
68
self .context ['answer' ] = details .get ('answer' )
63
69
self .context ['question' ] = details .get ('question' )
64
70
self .answer_text = details .get ('answer' )
65
71
66
- def execute (self , model_id , system , prompt , dialogue_number , dialogue_type , history_chat_record , stream , chat_id , chat_record_id ,
72
+ def execute (self , model_id , system , prompt , dialogue_number , dialogue_type , history_chat_record , stream , chat_id ,
73
+ chat_record_id ,
67
74
image ,
68
75
** kwargs ) -> NodeResult :
69
76
# 处理不正确的参数
@@ -72,12 +79,13 @@ def execute(self, model_id, system, prompt, dialogue_number, dialogue_type, hist
72
79
73
80
image_model = get_model_instance_by_model_user_id (model_id , self .flow_params_serializer .data .get ('user_id' ))
74
81
# 执行详情中的历史消息不需要图片内容
75
- history_message = self .get_history_message_for_details (history_chat_record , dialogue_number )
82
+ history_message = self .get_history_message_for_details (history_chat_record , dialogue_number )
76
83
self .context ['history_message' ] = history_message
77
84
question = self .generate_prompt_question (prompt )
78
85
self .context ['question' ] = question .content
79
86
# 生成消息列表, 真实的history_message
80
- message_list = self .generate_message_list (image_model , system , prompt , self .get_history_message (history_chat_record , dialogue_number ), image )
87
+ message_list = self .generate_message_list (image_model , system , prompt ,
88
+ self .get_history_message (history_chat_record , dialogue_number ), image )
81
89
self .context ['message_list' ] = message_list
82
90
self .context ['image_list' ] = image
83
91
self .context ['dialogue_type' ] = dialogue_type
@@ -92,11 +100,11 @@ def execute(self, model_id, system, prompt, dialogue_number, dialogue_type, hist
92
100
'history_message' : history_message , 'question' : question .content }, {},
93
101
_write_context = write_context )
94
102
95
-
96
103
def get_history_message_for_details (self , history_chat_record , dialogue_number ):
97
104
start_index = len (history_chat_record ) - dialogue_number
98
105
history_message = reduce (lambda x , y : [* x , * y ], [
99
- [self .generate_history_human_message_for_details (history_chat_record [index ]), self .generate_history_ai_message (history_chat_record [index ])]
106
+ [self .generate_history_human_message_for_details (history_chat_record [index ]),
107
+ self .generate_history_ai_message (history_chat_record [index ])]
100
108
for index in
101
109
range (start_index if start_index > 0 else 0 , len (history_chat_record ))], [])
102
110
return history_message
@@ -115,17 +123,19 @@ def generate_history_human_message_for_details(self, chat_record):
115
123
image_list = data ['image_list' ]
116
124
if len (image_list ) == 0 or data ['dialogue_type' ] == 'WORKFLOW' :
117
125
return HumanMessage (content = chat_record .problem_text )
118
- file_id = image_list [ 0 ][ 'file_id' ]
126
+ file_id_list = [ image . get ( 'file_id' ) for image in image_list ]
119
127
return HumanMessage (content = [
120
- {'type' : 'text' , 'text' : data ['question' ]},
121
- {'type' : 'image_url' , 'image_url' : {'url' : f'/api/file/{ file_id } ' }},
122
- ])
128
+ {'type' : 'text' , 'text' : data ['question' ]},
129
+ * [{'type' : 'image_url' , 'image_url' : {'url' : f'/api/file/{ file_id } ' }} for file_id in file_id_list ]
130
+
131
+ ])
123
132
return HumanMessage (content = chat_record .problem_text )
124
133
125
134
def get_history_message (self , history_chat_record , dialogue_number ):
126
135
start_index = len (history_chat_record ) - dialogue_number
127
136
history_message = reduce (lambda x , y : [* x , * y ], [
128
- [self .generate_history_human_message (history_chat_record [index ]), self .generate_history_ai_message (history_chat_record [index ])]
137
+ [self .generate_history_human_message (history_chat_record [index ]),
138
+ self .generate_history_ai_message (history_chat_record [index ])]
129
139
for index in
130
140
range (start_index if start_index > 0 else 0 , len (history_chat_record ))], [])
131
141
return history_message
@@ -137,13 +147,12 @@ def generate_history_human_message(self, chat_record):
137
147
image_list = data ['image_list' ]
138
148
if len (image_list ) == 0 or data ['dialogue_type' ] == 'WORKFLOW' :
139
149
return HumanMessage (content = chat_record .problem_text )
140
- file_id = image_list [0 ]['file_id' ]
141
- file = QuerySet (File ).filter (id = file_id ).first ()
142
- base64_image = base64 .b64encode (file .get_byte ()).decode ("utf-8" )
150
+ image_base64_list = [file_id_to_base64 (image .get ('file_id' )) for image in image_list ]
143
151
return HumanMessage (
144
152
content = [
145
153
{'type' : 'text' , 'text' : data ['question' ]},
146
- {'type' : 'image_url' , 'image_url' : {'url' : f'data:image/jpeg;base64,{ base64_image } ' }},
154
+ * [{'type' : 'image_url' , 'image_url' : {'url' : f'data:image/jpeg;base64,{ base64_image } ' }} for
155
+ base64_image in image_base64_list ]
147
156
])
148
157
return HumanMessage (content = chat_record .problem_text )
149
158
0 commit comments