|
@@ -486,6 +486,20 @@ class DialogueManager:
|
|
|
messages.append({'role': 'assistant', 'content': msg_prefix})
|
|
|
elif chat_service_type == ChatServiceType.COZE_CHAT:
|
|
|
dialogue_history = dialogue_history[-95:] # Coze最多支持100条,还需要附加系统消息
|
|
|
+ # 如果system后的第1条消息不为user,需要补一条user消息
|
|
|
+ if len(dialogue_history) > 0 and dialogue_history[0]['role'] != 'user':
|
|
|
+ fmt_time = self.format_timestamp(dialogue_history[0]['timestamp'])
|
|
|
+ messages.append(cozepy.Message.build_user_question_text(f'[{fmt_time}] '))
|
|
|
+ # coze最后一条消息必须为user,且可能吞掉连续的user消息,故强制增加一条空消息(可参与合并)
|
|
|
+ current_time = overwrite_context.get('current_time', datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
|
|
|
+ dialogue_history.append({
|
|
|
+ 'role': 'user',
|
|
|
+ 'content': ' ',
|
|
|
+ 'timestamp': int(datetime.strptime(current_time, '%Y-%m-%d %H:%M:%S').timestamp() * 1000),
|
|
|
+ })
|
|
|
+ # 将连续的同一角色的消息做聚合,避免coze吞消息
|
|
|
+ messages_to_aggr = []
|
|
|
+ last_message_role = None
|
|
|
for entry in dialogue_history:
|
|
|
if not entry['content']:
|
|
|
logger.warning("staff[{}], user[{}], role[{}]: empty content in dialogue history".format(
|
|
@@ -493,12 +507,16 @@ class DialogueManager:
|
|
|
))
|
|
|
continue
|
|
|
role = entry['role']
|
|
|
- fmt_time = self.format_timestamp(entry['timestamp'])
|
|
|
- content = '[{}] {}'.format(fmt_time, entry["content"])
|
|
|
- if role == 'user':
|
|
|
- messages.append(cozepy.Message.build_user_question_text(content))
|
|
|
- elif role == 'assistant':
|
|
|
- messages.append(cozepy.Message.build_assistant_answer(content))
|
|
|
+ if role != last_message_role:
|
|
|
+ if messages_to_aggr:
|
|
|
+ aggregated_message = '\n'.join(messages_to_aggr)
|
|
|
+ messages.append(self.build_chat_message(last_message_role, aggregated_message, chat_service_type))
|
|
|
+ messages_to_aggr = []
|
|
|
+ last_message_role = role
|
|
|
+ messages_to_aggr.append(self.format_dialogue_content(entry))
|
|
|
+ if messages_to_aggr:
|
|
|
+ aggregated_message = '\n'.join(messages_to_aggr)
|
|
|
+ messages.append(self.build_chat_message(last_message_role, aggregated_message, chat_service_type))
|
|
|
custom_variables = {}
|
|
|
for k, v in prompt_context.items():
|
|
|
custom_variables[k] = str(v)
|
|
@@ -506,13 +524,6 @@ class DialogueManager:
|
|
|
config['custom_variables'] = custom_variables
|
|
|
config['bot_id'] = self._select_coze_bot(self.current_state)
|
|
|
|
|
|
- msg_prefix = '[{}]'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
|
|
|
- messages.append(cozepy.Message.build_assistant_answer(msg_prefix))
|
|
|
- #FIXME(zhoutian): 这种方法并不可靠,需要结合状态来判断
|
|
|
- if self.current_state == DialogueState.GREETING and not messages:
|
|
|
- # messages.append(cozepy.Message.build_user_question_text(f'{msg_prefix} 请开始对话'))
|
|
|
- pass
|
|
|
-
|
|
|
#FIXME(zhoutian): 临时报警
|
|
|
if user_message and not messages:
|
|
|
logger.error(f"staff[{self.staff_id}], user[{self.user_id}]: inconsistency in messages")
|
|
@@ -524,6 +535,23 @@ class DialogueManager:
|
|
|
def format_timestamp(timestamp_ms):
|
|
|
return datetime.fromtimestamp(timestamp_ms / 1000).strftime("%Y-%m-%d %H:%M:%S")
|
|
|
|
|
|
+ @staticmethod
|
|
|
+ def format_dialogue_content(dialogue_entry):
|
|
|
+ fmt_time = DialogueManager.format_timestamp(dialogue_entry['timestamp'])
|
|
|
+ content = '[{}] {}'.format(fmt_time, dialogue_entry['content'])
|
|
|
+ return content
|
|
|
+
|
|
|
+ @staticmethod
|
|
|
+ def build_chat_message(role, content, chat_service_type: ChatServiceType):
|
|
|
+ if chat_service_type == ChatServiceType.COZE_CHAT:
|
|
|
+ if role == 'user':
|
|
|
+ return cozepy.Message.build_user_question_text(content)
|
|
|
+ elif role == 'assistant':
|
|
|
+ return cozepy.Message.build_assistant_answer(content)
|
|
|
+ else:
|
|
|
+ return {'role': role, 'content': content}
|
|
|
+
|
|
|
+
|
|
|
if __name__ == '__main__':
|
|
|
state_cache = DialogueStateCache()
|
|
|
state_cache.set_state('1688854492669990', '7881302581935903', DialogueState.CHITCHAT, DialogueState.GREETING)
|