generate_conversation_summary_task.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import logging
  2. import time
  3. import click
  4. from celery import shared_task
  5. from werkzeug.exceptions import NotFound
  6. from core.generator.llm_generator import LLMGenerator
  7. from extensions.ext_database import db
  8. from models.model import Conversation, Message
  9. @shared_task(queue='generation')
  10. def generate_conversation_summary_task(conversation_id: str):
  11. """
  12. Async Generate conversation summary
  13. :param conversation_id:
  14. Usage: generate_conversation_summary_task.delay(conversation_id)
  15. """
  16. logging.info(click.style('Start generate conversation summary: {}'.format(conversation_id), fg='green'))
  17. start_at = time.perf_counter()
  18. conversation = db.session.query(Conversation).filter(Conversation.id == conversation_id).first()
  19. if not conversation:
  20. raise NotFound('Conversation not found')
  21. try:
  22. # get conversation messages count
  23. history_message_count = conversation.message_count
  24. if history_message_count >= 5 and not conversation.summary:
  25. app_model = conversation.app
  26. if not app_model:
  27. return
  28. history_messages = db.session.query(Message).filter(Message.conversation_id == conversation.id) \
  29. .order_by(Message.created_at.asc()).all()
  30. conversation.summary = LLMGenerator.generate_conversation_summary(app_model.tenant_id, history_messages)
  31. db.session.add(conversation)
  32. db.session.commit()
  33. end_at = time.perf_counter()
  34. logging.info(click.style('Conversation summary generated: {} latency: {}'.format(conversation_id, end_at - start_at), fg='green'))
  35. except Exception:
  36. logging.exception("generate conversation summary failed")