crud_mismatch_records.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from typing import Sequence
  4. from sqlalchemy import select, or_, and_
  5. from sqlalchemy.ext.asyncio import AsyncSession
  6. from sqlalchemy_crud_plus import CRUDPlus
  7. from app.call_center.schema.mismatch_records import GetMismatchRecordsByIdParam, CreateMismatchRecordsParam, \
  8. UpdateMismatchRecordsParam
  9. from model.mismatch_records import MismatchRecords
  10. class CRUDMismatchRecords(CRUDPlus[MismatchRecords]):
  11. async def get(self, db: AsyncSession, obj_in: GetMismatchRecordsByIdParam) -> MismatchRecords | None:
  12. """
  13. 获取call record
  14. :param db:
  15. :param obj_in:
  16. :return:
  17. """
  18. mismatch_records = None
  19. if obj_in.internal_id:
  20. mismatch_records = await self.select_model_by_column(db, id=obj_in.internal_id, org_id=obj_in.org_id)
  21. elif obj_in.external_id:
  22. mismatch_records = await self.select_model_by_column(db, external_id=obj_in.external_id, org_id=obj_in.org_id)
  23. return mismatch_records
  24. async def get_earliest_record(self, db: AsyncSession, limit: int = 1) -> Sequence[MismatchRecords] | None:
  25. """
  26. 获取最早的 llm_intent 不为空的记录
  27. :param db:
  28. :return:
  29. """
  30. stmt = select(self.model).where(or_(and_(MismatchRecords.ignore == 0, MismatchRecords.llm_ignore == 0), and_(MismatchRecords.ignore == 2, MismatchRecords.user_intent == None))).order_by(MismatchRecords.created_at.asc()).limit(limit)
  31. query = await db.execute(stmt)
  32. return query.scalars().fetchall()
  33. async def create(self, db: AsyncSession, obj_in: CreateMismatchRecordsParam) -> None:
  34. """
  35. 创建call record
  36. :param db:
  37. :param obj_in:
  38. :return:
  39. """
  40. await self.create_model(db, obj_in)
  41. async def update_ignore(self, db: AsyncSession, obj_in: UpdateMismatchRecordsParam) -> int:
  42. """
  43. 更新call record
  44. :param db:
  45. :param obj_in:
  46. :return:
  47. """
  48. if obj_in.internal_id:
  49. return await self.update_model_by_column(db, {'ignore': obj_in.ignore}, id=obj_in.internal_id)
  50. else:
  51. return await self.update_model_by_column(db, {'ignore': obj_in.ignore}, external_id=obj_in.external_id)
  52. async def update_llm_ignore(self, db: AsyncSession, internal_id: str, llm_ignore: int, response_data: dict, status: int) -> int:
  53. """
  54. 更新call record
  55. :param db:
  56. :param internal_id:
  57. :param llm_ignore:
  58. :param response_data:
  59. :param status:
  60. :return:
  61. """
  62. return await self.update_model_by_column(db, {'llm_ignore': llm_ignore, 'ignore_response_data': response_data, 'status': status}, id=internal_id)
  63. async def update(self, db: AsyncSession, internal_id: str, llm_ignore: int, user_intent: str, similar_reply: list[str], keywords: list[str], regular: list[str], request_data: dict, response_data: dict, status: int, ignore_response_data: dict | None) -> int:
  64. """
  65. 更新call record
  66. :param db:
  67. :param internal_id:
  68. :param llm_ignore:
  69. :param user_intent:
  70. :param similar_reply:
  71. :param keywords:
  72. :param regular:
  73. :param request_data:
  74. :param response_data:
  75. :param status:
  76. :param ignore_response_data:
  77. :return:
  78. """
  79. if ignore_response_data:
  80. return await self.update_model_by_column(db, {'llm_ignore': llm_ignore, 'user_intent': user_intent, 'similar_reply': similar_reply, 'keywords': keywords, 'regular': regular, 'request_data': request_data, 'response_data': response_data, 'status': status, 'ignore_response_data': ignore_response_data}, id=internal_id)
  81. else:
  82. return await self.update_model_by_column(db, {'llm_ignore': llm_ignore, 'user_intent': user_intent, 'similar_reply': similar_reply, 'keywords': keywords, 'regular': regular, 'request_data': request_data, 'response_data': response_data, 'status': status}, id=internal_id)
  83. mismatch_records_dao: CRUDMismatchRecords = CRUDMismatchRecords(MismatchRecords)