|
@@ -6,7 +6,7 @@ from datetime import datetime
|
|
|
from enum import Enum
|
|
|
from concurrent.futures import ThreadPoolExecutor
|
|
|
from threading import Thread
|
|
|
-from typing import Optional, Dict
|
|
|
+from typing import Optional, Dict, List
|
|
|
|
|
|
import rocketmq
|
|
|
from rocketmq import ClientConfiguration, Credentials, SimpleConsumer, FilterExpression
|
|
@@ -30,7 +30,7 @@ def generate_task_rmq_message(topic: str, staff_id: str, user_id: str, task_type
|
|
|
'staff_id': staff_id,
|
|
|
'user_id': user_id,
|
|
|
'task_type': task_type.value,
|
|
|
-
|
|
|
+
|
|
|
'content': content or '',
|
|
|
'timestamp': int(time.time() * 1000),
|
|
|
}, ensure_ascii=False).encode('utf-8')
|
|
@@ -142,26 +142,41 @@ class PushTaskWorkerPool:
|
|
|
logger.debug(f"user[{user_id}], do not initiate conversation")
|
|
|
self.consumer.ack(msg)
|
|
|
return
|
|
|
- content = task['content']
|
|
|
+ contents: List[Dict] = json.loads(task['content'])
|
|
|
+ if not contents:
|
|
|
+ logger.debug(f"staff[{staff_id}], user[{user_id}]: empty content, do not send")
|
|
|
+ self.consumer.ack(msg)
|
|
|
+ return
|
|
|
recent_dialogue = agent.dialogue_history[-10:]
|
|
|
agent_voice_whitelist = set(apollo_config.get_json_value("agent_voice_whitelist", []))
|
|
|
-
|
|
|
- if len(recent_dialogue) < 2 or staff_id not in agent_voice_whitelist:
|
|
|
- message_type = MessageType.TEXT
|
|
|
- else:
|
|
|
- message_type = self.agent_service.response_type_detector.detect_type(
|
|
|
- recent_dialogue, content, enable_random=True)
|
|
|
- response = agent.generate_response(content)
|
|
|
- if response:
|
|
|
- current_ts = int(time.time())
|
|
|
- with self.agent_service.AgentDBSession() as session:
|
|
|
- msg_list = [{'type': MessageType.TEXT.value, 'content': response}]
|
|
|
- record = AgentPushRecord(staff_id=staff_id, user_id=user_id,
|
|
|
- content=json.dumps(msg_list, ensure_ascii=False),
|
|
|
- timestamp=current_ts)
|
|
|
- session.add(record)
|
|
|
- session.commit()
|
|
|
- self.agent_service.send_response(staff_id, user_id, response, message_type, skip_check=True)
|
|
|
+ messages_to_send = []
|
|
|
+ for item in contents:
|
|
|
+ if item["type"] == "text":
|
|
|
+ if staff_id not in agent_voice_whitelist:
|
|
|
+ message_type = MessageType.TEXT
|
|
|
+ else:
|
|
|
+ message_type = self.agent_service.response_type_detector.detect_type(
|
|
|
+ recent_dialogue, item["content"], enable_random=True)
|
|
|
+ response = agent.generate_response(item["content"])
|
|
|
+ if response:
|
|
|
+ messages_to_send.append({'type': message_type, 'content': response})
|
|
|
+ else:
|
|
|
+ message_type = MessageType.from_str(item["type"])
|
|
|
+ response = agent.generate_multimodal_response(item)
|
|
|
+ if response:
|
|
|
+ item["type"] = message_type
|
|
|
+ messages_to_send.append(item)
|
|
|
+ current_ts = int(time.time())
|
|
|
+ with self.agent_service.AgentDBSession() as session:
|
|
|
+ msg_list = []
|
|
|
+ record = AgentPushRecord(staff_id=staff_id, user_id=user_id,
|
|
|
+ content=json.dumps(msg_list, ensure_ascii=False),
|
|
|
+ timestamp=current_ts)
|
|
|
+ session.add(record)
|
|
|
+ session.commit()
|
|
|
+ if messages_to_send:
|
|
|
+ for response in messages_to_send:
|
|
|
+ self.agent_service.send_multimodal_response(staff_id, user_id, response, skip_check=True)
|
|
|
agent.update_last_active_interaction_time(current_ts)
|
|
|
else:
|
|
|
logger.debug(f"staff[{staff_id}], user[{user_id}]: generate empty response")
|
|
@@ -184,8 +199,8 @@ class PushTaskWorkerPool:
|
|
|
)
|
|
|
)
|
|
|
if message_to_user:
|
|
|
- rmq_message = generate_task_rmq_message(self.rmq_topic, staff_id, user_id, TaskType.SEND, message_to_user)
|
|
|
- logger.debug(f"send message: {rmq_message.body.decode('utf-8')}")
|
|
|
+ rmq_message = generate_task_rmq_message(
|
|
|
+ self.rmq_topic, staff_id, user_id, TaskType.SEND, json.dumps(message_to_user))
|
|
|
self.producer.send(rmq_message)
|
|
|
else:
|
|
|
logger.info(f"staff[{staff_id}], user[{user_id}]: no push message generated")
|