|
@@ -514,6 +514,7 @@ class DialogueManager:
|
|
})
|
|
})
|
|
# 将连续的同一角色的消息做聚合,避免coze吞消息
|
|
# 将连续的同一角色的消息做聚合,避免coze吞消息
|
|
messages_to_aggr = []
|
|
messages_to_aggr = []
|
|
|
|
+ objects_to_aggr = []
|
|
last_message_role = None
|
|
last_message_role = None
|
|
for entry in dialogue_history:
|
|
for entry in dialogue_history:
|
|
if not entry['content']:
|
|
if not entry['content']:
|
|
@@ -523,14 +524,47 @@ class DialogueManager:
|
|
continue
|
|
continue
|
|
role = entry['role']
|
|
role = entry['role']
|
|
if role != last_message_role:
|
|
if role != last_message_role:
|
|
- if messages_to_aggr:
|
|
|
|
|
|
+ if objects_to_aggr:
|
|
|
|
+ if last_message_role != 'user':
|
|
|
|
+ pass
|
|
|
|
+ else:
|
|
|
|
+ text_message = '\n'.join(messages_to_aggr)
|
|
|
|
+ object_string_list = []
|
|
|
|
+ for entry in objects_to_aggr:
|
|
|
|
+ # FIXME: 其它消息类型的支持
|
|
|
|
+ object_string_list.append(cozepy.MessageObjectString.build_image(file_url=entry['content']))
|
|
|
|
+ object_string_list.append(cozepy.MessageObjectString.build_text(text_message))
|
|
|
|
+ messages.append(cozepy.Message.build_user_question_objects(object_string_list))
|
|
|
|
+ elif messages_to_aggr:
|
|
aggregated_message = '\n'.join(messages_to_aggr)
|
|
aggregated_message = '\n'.join(messages_to_aggr)
|
|
messages.append(DialogueManager.build_chat_message(
|
|
messages.append(DialogueManager.build_chat_message(
|
|
last_message_role, aggregated_message, ChatServiceType.COZE_CHAT))
|
|
last_message_role, aggregated_message, ChatServiceType.COZE_CHAT))
|
|
|
|
+ objects_to_aggr = []
|
|
messages_to_aggr = []
|
|
messages_to_aggr = []
|
|
last_message_role = role
|
|
last_message_role = role
|
|
- messages_to_aggr.append(DialogueManager.format_dialogue_content(entry))
|
|
|
|
- if messages_to_aggr:
|
|
|
|
|
|
+ if entry.get('type', MessageType.TEXT) in (MessageType.IMAGE_GW, MessageType.IMAGE_QW):
|
|
|
|
+ # 多模态消息必须用特殊的聚合方式,一个object_string数组中只能有一个文字消息,但可以有多个图片
|
|
|
|
+ if role == 'user':
|
|
|
|
+ objects_to_aggr.append(entry)
|
|
|
|
+ else:
|
|
|
|
+ logger.warning("staff[{}], user[{}]: unsupported message type [{}] in assistant role".format(
|
|
|
|
+ staff_id, user_id, entry['type']
|
|
|
|
+ ))
|
|
|
|
+ else:
|
|
|
|
+ messages_to_aggr.append(DialogueManager.format_dialogue_content(entry))
|
|
|
|
+ # 如果有未聚合的object消息,需要特殊处理
|
|
|
|
+ if objects_to_aggr:
|
|
|
|
+ if last_message_role != 'user':
|
|
|
|
+ pass
|
|
|
|
+ else:
|
|
|
|
+ text_message = '\n'.join(messages_to_aggr)
|
|
|
|
+ object_string_list = []
|
|
|
|
+ for entry in objects_to_aggr:
|
|
|
|
+ # FIXME: 其它消息类型的支持
|
|
|
|
+ object_string_list.append(cozepy.MessageObjectString.build_image(file_url=entry['content']))
|
|
|
|
+ object_string_list.append(cozepy.MessageObjectString.build_text(text_message))
|
|
|
|
+ messages.append(cozepy.Message.build_user_question_objects(object_string_list))
|
|
|
|
+ elif messages_to_aggr:
|
|
aggregated_message = '\n'.join(messages_to_aggr)
|
|
aggregated_message = '\n'.join(messages_to_aggr)
|
|
messages.append(DialogueManager.build_chat_message(
|
|
messages.append(DialogueManager.build_chat_message(
|
|
last_message_role, aggregated_message, ChatServiceType.COZE_CHAT))
|
|
last_message_role, aggregated_message, ChatServiceType.COZE_CHAT))
|