|
@@ -63,7 +63,7 @@ class PushScanThread:
|
|
|
# logger.debug(f"User {user_id} not enabled agent push, skipping.")
|
|
|
# continue
|
|
|
user_tags = self.service.user_relation_manager.get_user_tags(user_id)
|
|
|
- if configs.get_env() != 'dev' and not white_list_tags.intersection(user_tags):
|
|
|
+ if not white_list_tags.intersection(user_tags):
|
|
|
should_initiate = False
|
|
|
else:
|
|
|
agent = self.service.get_agent_instance(staff_id, user_id)
|
|
@@ -78,14 +78,17 @@ class PushScanThread:
|
|
|
|
|
|
class PushTaskWorkerPool:
|
|
|
def __init__(self, agent_service: 'AgentService', mq_topic: str,
|
|
|
- mq_consumer: rocketmq.SimpleConsumer, mq_producer: rocketmq.Producer):
|
|
|
+ mq_consumer_generate: rocketmq.SimpleConsumer,
|
|
|
+ mq_consumer_send: rocketmq.SimpleConsumer,
|
|
|
+ mq_producer: rocketmq.Producer):
|
|
|
self.agent_service = agent_service
|
|
|
max_workers = configs.get()['system'].get('push_task_workers', 5)
|
|
|
self.max_push_workers = max_workers
|
|
|
self.generate_executor = ThreadPoolExecutor(max_workers=max_workers)
|
|
|
self.send_executors = {}
|
|
|
self.rmq_topic = mq_topic
|
|
|
- self.consumer = mq_consumer
|
|
|
+ self.generate_consumer = mq_consumer_generate
|
|
|
+ self.send_consumer = mq_consumer_send
|
|
|
self.producer = mq_producer
|
|
|
self.loop_thread = None
|
|
|
self.is_generator_running = True
|
|
@@ -100,7 +103,13 @@ class PushTaskWorkerPool:
|
|
|
# RMQ consumer疑似有bug,创建后立即消费可能报NPE
|
|
|
time.sleep(1)
|
|
|
while True:
|
|
|
- msgs = self.consumer.receive(1, 300)
|
|
|
+ # FIXME: 拆分为两个单独的线程
|
|
|
+ # 目前优先处理发送任务
|
|
|
+ task_source = 'send'
|
|
|
+ msgs = self.send_consumer.receive(1, 60)
|
|
|
+ if not msgs:
|
|
|
+ task_source = 'generate'
|
|
|
+ msgs = self.generate_consumer.receive(1, 300)
|
|
|
if not msgs:
|
|
|
# 没有生成任务在执行且没有消息,才可退出
|
|
|
if self.generate_send_done:
|
|
@@ -136,7 +145,10 @@ class PushTaskWorkerPool:
|
|
|
self.send_executors[staff_id].submit(self.handle_send_task, task, msg)
|
|
|
else:
|
|
|
logger.error(f"Unknown task type: {task['task_type']}")
|
|
|
- self.consumer.ack(msg)
|
|
|
+ if task_source == 'send':
|
|
|
+ self.send_consumer.ack(msg)
|
|
|
+ else:
|
|
|
+ self.generate_consumer.ack(msg)
|
|
|
logger.info("PushGenerateWorkerPool stopped")
|
|
|
|
|
|
def wait_to_finish(self):
|
|
@@ -155,13 +167,13 @@ class PushTaskWorkerPool:
|
|
|
agent = self.agent_service.get_agent_instance(staff_id, user_id)
|
|
|
# 二次校验是否需要发送
|
|
|
if not agent.should_initiate_conversation():
|
|
|
- logger.debug(f"user[{user_id}], do not initiate conversation")
|
|
|
- self.consumer.ack(msg)
|
|
|
+ logger.debug(f"user[{user_id}], should not initiate, skip sending task")
|
|
|
+ self.send_consumer.ack(msg)
|
|
|
return
|
|
|
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)
|
|
|
+ self.send_consumer.ack(msg)
|
|
|
return
|
|
|
recent_dialogue = agent.dialogue_history[-10:]
|
|
|
agent_voice_whitelist = set(apollo_config.get_json_value("agent_voice_whitelist", []))
|
|
@@ -197,11 +209,11 @@ class PushTaskWorkerPool:
|
|
|
agent.update_last_active_interaction_time(current_ts)
|
|
|
else:
|
|
|
logger.debug(f"staff[{staff_id}], user[{user_id}]: generate empty response")
|
|
|
- self.consumer.ack(msg)
|
|
|
+ self.send_consumer.ack(msg)
|
|
|
except Exception as e:
|
|
|
fmt_exc = traceback.format_exc()
|
|
|
logger.error(f"Error processing message sending: {e}, {fmt_exc}")
|
|
|
- self.consumer.ack(msg)
|
|
|
+ self.send_consumer.ack(msg)
|
|
|
|
|
|
def handle_generate_task(self, task: Dict, msg: rocketmq.Message):
|
|
|
try:
|
|
@@ -237,9 +249,9 @@ class PushTaskWorkerPool:
|
|
|
self.producer.send(rmq_message)
|
|
|
else:
|
|
|
logger.info(f"staff[{staff_id}], user[{user_id}]: no push message generated")
|
|
|
- self.consumer.ack(msg)
|
|
|
+ self.generate_consumer.ack(msg)
|
|
|
except Exception as e:
|
|
|
fmt_exc = traceback.format_exc()
|
|
|
logger.error(f"Error processing message generation: {e}, {fmt_exc}")
|
|
|
# FIXME: 是否需要ACK
|
|
|
- self.consumer.ack(msg)
|
|
|
+ self.generate_consumer.ack(msg)
|