Skip to content

Commit cefd66d

Browse files
authored
fix: 修复图片识别历史记录无法显示多个图片问题 (#1768)
1 parent f525181 commit cefd66d

File tree

1 file changed

+23
-14
lines changed

1 file changed

+23
-14
lines changed

apps/application/flow/step_node/image_understand_step_node/impl/base_image_understand_node.py

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,20 @@ def write_context(node_variable: Dict, workflow_variable: Dict, node: INode, wor
5757
_write_context(node_variable, workflow_variable, node, workflow, answer)
5858

5959

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+
6066
class BaseImageUnderstandNode(IImageUnderstandNode):
6167
def save_context(self, details, workflow_manage):
6268
self.context['answer'] = details.get('answer')
6369
self.context['question'] = details.get('question')
6470
self.answer_text = details.get('answer')
6571

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,
6774
image,
6875
**kwargs) -> NodeResult:
6976
# 处理不正确的参数
@@ -72,12 +79,13 @@ def execute(self, model_id, system, prompt, dialogue_number, dialogue_type, hist
7279

7380
image_model = get_model_instance_by_model_user_id(model_id, self.flow_params_serializer.data.get('user_id'))
7481
# 执行详情中的历史消息不需要图片内容
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)
7683
self.context['history_message'] = history_message
7784
question = self.generate_prompt_question(prompt)
7885
self.context['question'] = question.content
7986
# 生成消息列表, 真实的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)
8189
self.context['message_list'] = message_list
8290
self.context['image_list'] = image
8391
self.context['dialogue_type'] = dialogue_type
@@ -92,11 +100,11 @@ def execute(self, model_id, system, prompt, dialogue_number, dialogue_type, hist
92100
'history_message': history_message, 'question': question.content}, {},
93101
_write_context=write_context)
94102

95-
96103
def get_history_message_for_details(self, history_chat_record, dialogue_number):
97104
start_index = len(history_chat_record) - dialogue_number
98105
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])]
100108
for index in
101109
range(start_index if start_index > 0 else 0, len(history_chat_record))], [])
102110
return history_message
@@ -115,17 +123,19 @@ def generate_history_human_message_for_details(self, chat_record):
115123
image_list = data['image_list']
116124
if len(image_list) == 0 or data['dialogue_type'] == 'WORKFLOW':
117125
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]
119127
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+
])
123132
return HumanMessage(content=chat_record.problem_text)
124133

125134
def get_history_message(self, history_chat_record, dialogue_number):
126135
start_index = len(history_chat_record) - dialogue_number
127136
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])]
129139
for index in
130140
range(start_index if start_index > 0 else 0, len(history_chat_record))], [])
131141
return history_message
@@ -137,13 +147,12 @@ def generate_history_human_message(self, chat_record):
137147
image_list = data['image_list']
138148
if len(image_list) == 0 or data['dialogue_type'] == 'WORKFLOW':
139149
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]
143151
return HumanMessage(
144152
content=[
145153
{'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]
147156
])
148157
return HumanMessage(content=chat_record.problem_text)
149158

0 commit comments

Comments
 (0)