letschatty 0.4.332__tar.gz → 0.4.336__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (322) hide show
  1. {letschatty-0.4.332 → letschatty-0.4.336}/PKG-INFO +1 -1
  2. {letschatty-0.4.332 → letschatty-0.4.336}/pyproject.toml +1 -1
  3. letschatty-0.4.336/src/letschatty/models/ai_microservices/__init__.py +10 -0
  4. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/ai_microservices/expected_output.py +36 -1
  5. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/ai_microservices/lambda_events.py +159 -31
  6. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/ai_microservices/lambda_invokation_types.py +3 -1
  7. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/ai_microservices/n8n_ai_agents_payload.py +3 -1
  8. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/__init__.py +2 -1
  9. letschatty-0.4.336/src/letschatty/models/analytics/events/chat_based_events/ai_agent_execution_event.py +71 -0
  10. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/company_based_events/asset_events.py +0 -3
  11. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/event_type_to_classes.py +0 -4
  12. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/event_types.py +45 -0
  13. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/chat/continuous_conversation.py +1 -1
  14. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/ai_agents_v2/ai_agents_decision_output.py +1 -1
  15. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/ai_agents_v2/chatty_ai_agent.py +7 -1
  16. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/ai_agents_v2/chatty_ai_agent_in_chat.py +6 -34
  17. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/ai_agents_v2/chatty_ai_mode.py +2 -2
  18. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/ai_agents_v2/get_chat_with_prompt_response.py +1 -0
  19. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/ai_agents_v2/pre_qualify_config.py +14 -2
  20. letschatty-0.4.336/src/letschatty/models/company/assets/ai_agents_v2/statuses.py +33 -0
  21. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/automation.py +18 -0
  22. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/chat_assets.py +9 -0
  23. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/form_field.py +9 -2
  24. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/data_base/collection_interface.py +101 -29
  25. letschatty-0.4.336/src/letschatty/models/data_base/mongo_connection.py +118 -0
  26. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/utils/custom_exceptions/custom_exceptions.py +38 -1
  27. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/ai_agents/smart_follow_up_context_builder_v2.py +5 -2
  28. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/chat/chat_service.py +8 -1
  29. letschatty-0.4.336/src/letschatty/services/chatty_assets/__init__.py +14 -0
  30. letschatty-0.4.336/src/letschatty/services/chatty_assets/asset_service.py +260 -0
  31. letschatty-0.4.336/src/letschatty/services/chatty_assets/assets_collections.py +137 -0
  32. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/chatty_assets/base_container.py +3 -2
  33. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/chatty_assets/base_container_with_collection.py +35 -26
  34. letschatty-0.4.336/src/letschatty/services/chatty_assets/collections/__init__.py +38 -0
  35. letschatty-0.4.336/src/letschatty/services/chatty_assets/collections/ai_agent_collection.py +19 -0
  36. letschatty-0.4.336/src/letschatty/services/chatty_assets/collections/ai_agent_in_chat_collection.py +32 -0
  37. letschatty-0.4.336/src/letschatty/services/chatty_assets/collections/ai_component_collection.py +21 -0
  38. letschatty-0.4.336/src/letschatty/services/chatty_assets/collections/chain_of_thought_collection.py +30 -0
  39. letschatty-0.4.336/src/letschatty/services/chatty_assets/collections/chat_collection.py +21 -0
  40. letschatty-0.4.336/src/letschatty/services/chatty_assets/collections/contact_point_collection.py +21 -0
  41. letschatty-0.4.336/src/letschatty/services/chatty_assets/collections/fast_answer_collection.py +21 -0
  42. letschatty-0.4.336/src/letschatty/services/chatty_assets/collections/filter_criteria_collection.py +18 -0
  43. letschatty-0.4.336/src/letschatty/services/chatty_assets/collections/flow_collection.py +20 -0
  44. letschatty-0.4.336/src/letschatty/services/chatty_assets/collections/product_collection.py +20 -0
  45. letschatty-0.4.336/src/letschatty/services/chatty_assets/collections/sale_collection.py +20 -0
  46. letschatty-0.4.336/src/letschatty/services/chatty_assets/collections/source_collection.py +21 -0
  47. letschatty-0.4.336/src/letschatty/services/chatty_assets/collections/tag_collection.py +19 -0
  48. letschatty-0.4.336/src/letschatty/services/chatty_assets/collections/topic_collection.py +21 -0
  49. letschatty-0.4.336/src/letschatty/services/chatty_assets/collections/user_collection.py +20 -0
  50. letschatty-0.4.336/src/letschatty/services/chatty_assets/example_usage.py +44 -0
  51. letschatty-0.4.336/src/letschatty/services/chatty_assets/services/__init__.py +37 -0
  52. letschatty-0.4.336/src/letschatty/services/chatty_assets/services/ai_agent_in_chat_service.py +73 -0
  53. letschatty-0.4.336/src/letschatty/services/chatty_assets/services/ai_agent_service.py +23 -0
  54. letschatty-0.4.336/src/letschatty/services/chatty_assets/services/chain_of_thought_service.py +70 -0
  55. letschatty-0.4.336/src/letschatty/services/chatty_assets/services/chat_service.py +25 -0
  56. letschatty-0.4.336/src/letschatty/services/chatty_assets/services/contact_point_service.py +29 -0
  57. letschatty-0.4.336/src/letschatty/services/chatty_assets/services/fast_answer_service.py +32 -0
  58. letschatty-0.4.336/src/letschatty/services/chatty_assets/services/filter_criteria_service.py +30 -0
  59. letschatty-0.4.336/src/letschatty/services/chatty_assets/services/flow_service.py +25 -0
  60. letschatty-0.4.336/src/letschatty/services/chatty_assets/services/product_service.py +30 -0
  61. letschatty-0.4.336/src/letschatty/services/chatty_assets/services/sale_service.py +25 -0
  62. letschatty-0.4.336/src/letschatty/services/chatty_assets/services/source_service.py +28 -0
  63. letschatty-0.4.336/src/letschatty/services/chatty_assets/services/tag_service.py +32 -0
  64. letschatty-0.4.336/src/letschatty/services/chatty_assets/services/topic_service.py +31 -0
  65. letschatty-0.4.336/src/letschatty/services/chatty_assets/services/user_service.py +32 -0
  66. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/continuous_conversation_service/continuous_conversation_helper.py +11 -0
  67. letschatty-0.4.336/src/letschatty/services/events/__init__.py +6 -0
  68. letschatty-0.4.336/src/letschatty/services/events/events_manager.py +219 -0
  69. letschatty-0.4.336/src/letschatty/services/factories/analytics/ai_agent_event_factory.py +161 -0
  70. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/analytics/events_factory.py +63 -1
  71. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/lambda_ai_orchestrartor/lambda_events_factory.py +25 -8
  72. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/messages_helpers/get_caption_or_body_or_preview.py +6 -4
  73. letschatty-0.4.332/src/letschatty/models/ai_microservices/__init__.py +0 -10
  74. letschatty-0.4.332/src/letschatty/models/data_base/mongo_connection.py +0 -35
  75. letschatty-0.4.332/src/letschatty/services/chatty_assets/__init__.py +0 -2
  76. letschatty-0.4.332/src/letschatty/services/chatty_assets/asset_service.py +0 -83
  77. letschatty-0.4.332/src/letschatty/services/events/events_manager.py +0 -2
  78. {letschatty-0.4.332 → letschatty-0.4.336}/LICENSE +0 -0
  79. {letschatty-0.4.332 → letschatty-0.4.336}/README.md +0 -0
  80. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/__init__.py +0 -0
  81. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/__init__.py +0 -0
  82. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/ai_microservices/openai_payloads.py +0 -0
  83. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/__init__.py +0 -0
  84. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/base.py +0 -0
  85. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/chat_based_events/ai_agent_chat.py +0 -0
  86. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/chat_based_events/business_area.py +0 -0
  87. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/chat_based_events/chat_based_event.py +0 -0
  88. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/chat_based_events/chat_context.py +0 -0
  89. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/chat_based_events/chat_funnel.py +0 -0
  90. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/chat_based_events/chat_status.py +0 -0
  91. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/chat_based_events/contact_point.py +0 -0
  92. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/chat_based_events/continuous_conversation.py +0 -0
  93. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/chat_based_events/highlight.py +0 -0
  94. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/chat_based_events/message.py +0 -0
  95. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/chat_based_events/messages_intent_context.py +0 -0
  96. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/chat_based_events/product_chat.py +0 -0
  97. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/chat_based_events/quality_scoring.py +0 -0
  98. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/chat_based_events/sale.py +0 -0
  99. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/chat_based_events/tag_chat.py +0 -0
  100. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/chat_based_events/workflow.py +0 -0
  101. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/company_based_events/company_events.py +0 -0
  102. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/events/company_based_events/user_events.py +0 -0
  103. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/metrics/__init_.py +0 -0
  104. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/metrics/daily_contact_points.py +0 -0
  105. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/metrics/daily_new_chats.py +0 -0
  106. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/metrics/daily_sent_templates_grouped.py +0 -0
  107. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/metrics/sales_roadmap.py +0 -0
  108. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/metrics/sent_templates.py +0 -0
  109. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/smart_messages/friendly_code_for_source.py +0 -0
  110. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/smart_messages/topic.py +0 -0
  111. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/smart_messages/topic_message.py +0 -0
  112. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/sources/__init__.py +0 -0
  113. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/sources/google_ad_utm_source.py +0 -0
  114. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/sources/helpers.py +0 -0
  115. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/sources/other_source.py +0 -0
  116. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/sources/pure_ad.py +0 -0
  117. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/sources/pure_ad_utm_source.py +0 -0
  118. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/sources/source_base.py +0 -0
  119. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/sources/template_source.py +0 -0
  120. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/sources/topic_default_source.py +0 -0
  121. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/sources/utm_source.py +0 -0
  122. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/sources/utms/referer_info.py +0 -0
  123. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/sources/utms/utm_query_params.py +0 -0
  124. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/analytics/sources/whatsapp_default_source.py +0 -0
  125. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/auth/jwt.py +0 -0
  126. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/base_models/__init__.py +0 -0
  127. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/base_models/ai_agent_component.py +0 -0
  128. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/base_models/chatty_asset_model.py +0 -0
  129. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/base_models/helpers.py +0 -0
  130. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/base_models/related_asset_usage_example.py +0 -0
  131. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/base_models/singleton.py +0 -0
  132. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/base_models/update_model_interface.py +0 -0
  133. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/base_models/validate_timestamps_and_id.py +0 -0
  134. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/channels/channel.py +0 -0
  135. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/chat/assets_assigned_to_chat.py +0 -0
  136. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/chat/chat.py +0 -0
  137. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/chat/chat_status_modifications.py +0 -0
  138. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/chat/chat_with_assets.py +0 -0
  139. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/chat/client.py +0 -0
  140. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/chat/filter_parameters.py +0 -0
  141. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/chat/flow_link_state.py +0 -0
  142. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/chat/highlight.py +0 -0
  143. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/chat/preview.py +0 -0
  144. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/chat/quality_scoring.py +0 -0
  145. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/chat/scheduled_messages.py +0 -0
  146. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/chat/temporary_chat.py +0 -0
  147. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/chat/time_left.py +0 -0
  148. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/CRM/business_area.py +0 -0
  149. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/CRM/funnel.py +0 -0
  150. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/__init__.py +0 -0
  151. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/__init__.py +0 -0
  152. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/ai_agents_v2/ai_agent_message_draft.py +0 -0
  153. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/ai_agents_v2/chain_of_thought_in_chat.py +0 -0
  154. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/ai_agents_v2/chat_example.py +0 -0
  155. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/ai_agents_v2/chat_example_test.py +0 -0
  156. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/ai_agents_v2/chatty_ai_agent_config_for_automation.py +0 -0
  157. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/ai_agents_v2/context_item.py +0 -0
  158. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/ai_agents_v2/faq.py +0 -0
  159. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/ai_agents_v2/follow_up_strategy.py +0 -0
  160. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/ai_agents_v2/knowleadge_base_components.py +0 -0
  161. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/ai_agents_v2/n8n_agents_info.py +0 -0
  162. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/ai_agents_v2/n8n_schema_incoming_message_output.json +0 -0
  163. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/ai_agents_v2/n8n_schema_smart_follow_up_output.json +0 -0
  164. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/assignment/__init__.py +0 -0
  165. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/assignment/assignment_assets.py +0 -0
  166. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/chatty_fast_answers/__init__.py +0 -0
  167. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/chatty_fast_answers/chatty_fast_answer.py +0 -0
  168. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/company_assets.py +0 -0
  169. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/contact_point.py +0 -0
  170. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/filter_criteria.py +0 -0
  171. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/flow.py +0 -0
  172. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/launch/__init__.py +0 -0
  173. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/launch/launch.py +0 -0
  174. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/launch/scheduled_communication.py +0 -0
  175. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/launch/subscription.py +0 -0
  176. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/media/__init__.py +0 -0
  177. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/media/file.py +0 -0
  178. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/product.py +0 -0
  179. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/sale.py +0 -0
  180. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/tag.py +0 -0
  181. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/users/agent_chats_snapshot.py +0 -0
  182. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/users/user.py +0 -0
  183. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/users/user_asset_permission.py +0 -0
  184. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/assets/workflow_execution.py +0 -0
  185. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/company_chats_snapshot.py +0 -0
  186. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/company_messaging_settgins.py +0 -0
  187. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/conversation_topic.py +0 -0
  188. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/empresa.py +0 -0
  189. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/insight.py +0 -0
  190. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/company/notifications/notification.py +0 -0
  191. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/copilot/links.py +0 -0
  192. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/data_base/__init__.py +0 -0
  193. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/execution/__init__.py +0 -0
  194. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/execution/execution.py +0 -0
  195. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/execution/executor.py +0 -0
  196. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/forms/company/auth0_company_registration_form.py +0 -0
  197. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/forms/company/meta_register.py +0 -0
  198. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/__init__.py +0 -0
  199. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/__init__.py +0 -0
  200. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/audio.py +0 -0
  201. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/base/__init__.py +0 -0
  202. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/base/chatty_message_json.py +0 -0
  203. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/base/message_base.py +0 -0
  204. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/base/message_draft.py +0 -0
  205. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/button.py +0 -0
  206. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/central_notification.py +0 -0
  207. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/contact.py +0 -0
  208. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/document.py +0 -0
  209. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/image.py +0 -0
  210. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/interactive.py +0 -0
  211. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/location.py +0 -0
  212. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/reaction.py +0 -0
  213. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/schema/__init__.py +0 -0
  214. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_audio.py +0 -0
  215. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_button.py +0 -0
  216. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_central.py +0 -0
  217. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_contacts.py +0 -0
  218. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_document.py +0 -0
  219. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_image.py +0 -0
  220. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_interactive.py +0 -0
  221. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_location.py +0 -0
  222. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_media.py +0 -0
  223. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_reaction.py +0 -0
  224. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_sticker.py +0 -0
  225. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_text.py +0 -0
  226. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_video.py +0 -0
  227. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/schema/chatty_context/__init__.py +0 -0
  228. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/schema/chatty_context/chatty_context.py +0 -0
  229. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/schema/chatty_referal/__init__.py +0 -0
  230. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/schema/chatty_referal/chatty_referal.py +0 -0
  231. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/sticker.py +0 -0
  232. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/text.py +0 -0
  233. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/chatty_messages/video.py +0 -0
  234. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/message_templates/__init__.py +0 -0
  235. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/message_templates/chatty_template_campaign.py +0 -0
  236. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/message_templates/filled_data_from_frontend.py +0 -0
  237. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/message_templates/payload_for_sending_template.py +0 -0
  238. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/message_templates/raw_meta_template.py +0 -0
  239. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/message_templates/recipient_of_template_campaign.py +0 -0
  240. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/message_templates/required_for_frontend_templates.py +0 -0
  241. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/meta_message_model/meta_base_notification_json.py +0 -0
  242. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/meta_message_model/meta_error_json.py +0 -0
  243. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/meta_message_model/meta_inexistent_json.py +0 -0
  244. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/meta_message_model/meta_message_json.py +0 -0
  245. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/meta_message_model/meta_status_json.py +0 -0
  246. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/meta_message_model/meta_unknown_json.py +0 -0
  247. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/meta_message_model/schema/content_messages/__init__.py +0 -0
  248. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/meta_message_model/schema/content_messages/button_content.py +0 -0
  249. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/meta_message_model/schema/content_messages/contacts_content.py +0 -0
  250. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/meta_message_model/schema/content_messages/interactive_content.py +0 -0
  251. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/meta_message_model/schema/content_messages/location_content.py +0 -0
  252. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/meta_message_model/schema/content_messages/multimedia_content.py +0 -0
  253. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/meta_message_model/schema/content_messages/order_content.py +0 -0
  254. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/meta_message_model/schema/content_messages/reaction_content.py +0 -0
  255. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/meta_message_model/schema/content_messages/system_content.py +0 -0
  256. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/meta_message_model/schema/content_messages/text_content.py +0 -0
  257. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/meta_message_model/schema/values/__init__.py +0 -0
  258. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/meta_message_model/schema/values/value_errors.py +0 -0
  259. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/meta_message_model/schema/values/value_messages.py +0 -0
  260. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/messages/meta_message_model/schema/values/value_statuses.py +0 -0
  261. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/utils/__init__.py +0 -0
  262. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/utils/custom_exceptions/__init__.py +0 -0
  263. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/utils/definitions.py +0 -0
  264. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/utils/types/CRUD_operations.py +0 -0
  265. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/utils/types/__init__.py +0 -0
  266. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/utils/types/channel_types.py +0 -0
  267. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/utils/types/chats_actions.py +0 -0
  268. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/utils/types/country.py +0 -0
  269. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/utils/types/deletion_type.py +0 -0
  270. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/utils/types/executor_types.py +0 -0
  271. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/utils/types/identifier.py +0 -0
  272. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/utils/types/message_status_types.py +0 -0
  273. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/utils/types/message_types.py +0 -0
  274. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/utils/types/phone_number.py +0 -0
  275. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/utils/types/serializer_type.py +0 -0
  276. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/utils/types/source_types.py +0 -0
  277. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/models/utils/types/typealiases.py +0 -0
  278. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/__init__.py +0 -0
  279. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/ai_agents/context_builder_v2.py +0 -0
  280. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/ai_agents/cot_follow_up_examples.py +0 -0
  281. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/ai_agents/followup_schema.json +0 -0
  282. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/ai_agents/smart_follow_up_service_v2.py +0 -0
  283. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/ai_agents/tool_descriptions/assign_chat_to_ai_agent_itself.json +0 -0
  284. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/ai_agents/tool_descriptions/human_handover.json +0 -0
  285. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/ai_agents/tool_descriptions.py +0 -0
  286. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/ai_components_service.py +0 -0
  287. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/chat/chat_extractors.py +0 -0
  288. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/chat/client_service.py +0 -0
  289. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/chat/conversation_topics_service.py +0 -0
  290. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/chatty_assets/documentation_diagram.png +0 -0
  291. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/chatty_assets/readme.md +0 -0
  292. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/concurrent/concurrent.py +0 -0
  293. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/contact_points/contact_point_service.py +0 -0
  294. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/__init__.py +0 -0
  295. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/analytics/contact_point_factory.py +0 -0
  296. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/analytics/smart_messages/topics_factory.py +0 -0
  297. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/analytics/sources/helpers.py +0 -0
  298. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/analytics/sources/source_factory.py +0 -0
  299. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/chats/chat_factory.py +0 -0
  300. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/chatty_fast_answers/__init__.py +0 -0
  301. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/chatty_fast_answers/chatty_fast_answers_factory.py +0 -0
  302. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/clients/client_factory.py +0 -0
  303. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/company/__init__.py +0 -0
  304. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/company/empresa_factory.py +0 -0
  305. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/messages/__init__.py +0 -0
  306. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/messages/central_notification_factory.py +0 -0
  307. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/messages/chatty_message_factory.py +0 -0
  308. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/messages/child_db_message_factory.py +0 -0
  309. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/messages/child_request_message.py +0 -0
  310. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/messages/from_template_hot_fix.py +0 -0
  311. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/messages/message_templates/template_factory.py +0 -0
  312. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/messages/message_templates/test.py +0 -0
  313. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/meta_notifications/__init__.py +0 -0
  314. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/meta_notifications/meta_notification_factory.py +0 -0
  315. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/factories/product_factory.py +0 -0
  316. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/filter_criteria_service.py +0 -0
  317. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/messages_helpers/__init__.py +0 -0
  318. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/scheduled_messages_service/scheduled_messages_helpers.py +0 -0
  319. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/template_campaigns/template_campaign_service.py +0 -0
  320. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/users/agent_service.py +0 -0
  321. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/users/user_factory.py +0 -0
  322. {letschatty-0.4.332 → letschatty-0.4.336}/src/letschatty/services/validators/analytics_validator.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: letschatty
3
- Version: 0.4.332
3
+ Version: 0.4.336
4
4
  Summary: Models and custom classes to work across the Chattyverse
5
5
  License: MIT
6
6
  Author: Axel
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "letschatty"
3
- version = "0.4.332" # Or whichever is your latest version
3
+ version = "0.4.336" # Or whichever is your latest version
4
4
  description = "Models and custom classes to work across the Chattyverse"
5
5
  authors = ["Axel <axel@letschatty.com>"]
6
6
  license = "MIT"
@@ -0,0 +1,10 @@
1
+ from .expected_output import ExpectedOutputQualityTest, ExpectedOutputSmartTag
2
+ from .lambda_events import (
3
+ IncomingMessageAIDecision, QualityTestCallbackEvent, SmartTaggingCallbackEvent,
4
+ QualityTestInteractionCallbackEvent, QualityTestEvent,
5
+ AllQualityTestEvent, SmartTaggingEvent, QualityTestEventData, AllQualityTestEventData,ChatData,
6
+ ComparisonAnalysisCallbackMetadata, InteractionCallbackMetadata, SmartTaggingCallbackMetadata,
7
+ SmartTaggingPromptEvent
8
+ )
9
+ from .lambda_invokation_types import InvokationType, LambdaAiEvent
10
+ from .openai_payloads import OpenaiPayload, N8nPayload
@@ -6,9 +6,10 @@ from typing import List, Optional, Literal
6
6
  from datetime import datetime
7
7
 
8
8
  from letschatty.models.utils.types.message_types import MessageType
9
- from ...models.company.assets.ai_agents_v2.ai_agents_decision_output import ChainOfThoughtInChatRequest, IncomingMessageAIDecision, IncomingMessageDecisionAction
9
+ from ...models.company.assets.ai_agents_v2.ai_agents_decision_output import ChainOfThoughtInChatRequest, IncomingMessageAIDecision, IncomingMessageDecisionAction, SmartFollowUpDecision, SmartFollowUpDecisionAction
10
10
  from ...models.company.assets.automation import Automation
11
11
  from ...models.company.form_field import CollectedData
12
+ from ...models.chat.chat import Area
12
13
 
13
14
  class ExpectedOutputQualityTest(BaseModel):
14
15
  accuracy: float = Field(description="The accuracy of the comparison analysis")
@@ -169,6 +170,12 @@ class ExpectedOutputIncomingMessage(BaseModel):
169
170
  action: IncomingMessageDecisionAction
170
171
  messages: List[str] = Field(description="Array of message strings to send to the customer. Required for send/suggest actions, optional for escalate action, empty array for skip/remove actions.")
171
172
  chain_of_thought: ChainOfThoughtInChatRequest = Field(description="REQUIRED: Your reasoning process and response decision explanation")
173
+ confidence: Optional[int] = Field(
174
+ default=None,
175
+ ge=0,
176
+ le=100,
177
+ description="Confidence level 0-100"
178
+ )
172
179
 
173
180
  def to_incoming_message_decision_output(self) -> IncomingMessageAIDecision:
174
181
  messages_drafts = [
@@ -187,3 +194,31 @@ class ExpectedOutputIncomingMessage(BaseModel):
187
194
  return incoming_decision
188
195
 
189
196
 
197
+ class ExpectedOutputSmartFollowUp(BaseModel):
198
+ action: SmartFollowUpDecisionAction
199
+ messages: List[str] = Field(description="Array of message strings to send to the customer. Required for send/suggest actions, optional for escalate action, empty array for skip/remove/postpone actions.")
200
+ chain_of_thought: ChainOfThoughtInChatRequest = Field(description="REQUIRED: Your reasoning process and response decision explanation")
201
+ next_call_time: Optional[datetime] = Field(default=None, description="The next call time for the smart follow up (required for postpone_delta_time action)")
202
+ reason: Optional[str] = Field(default=None, description="Reason for the decision (especially for postpone/postponed actions)")
203
+ area: Optional[Area] = Field(default=None, description="The area to move the chat after the decision")
204
+
205
+ def to_smart_follow_up_decision_output(self) -> SmartFollowUpDecision:
206
+ messages_drafts = [
207
+ MessageDraft(
208
+ type=MessageType.TEXT,
209
+ content=ChattyContentText(body=message),
210
+ is_incoming_message=False
211
+ )
212
+ for message in self.messages
213
+ ]
214
+ smart_follow_up_decision = SmartFollowUpDecision(
215
+ action=self.action,
216
+ next_call_time=self.next_call_time,
217
+ messages=messages_drafts,
218
+ chain_of_thought=self.chain_of_thought,
219
+ reason=self.reason,
220
+ area=self.area
221
+ )
222
+ return smart_follow_up_decision
223
+
224
+
@@ -1,16 +1,18 @@
1
+ from letschatty.models.company.assets.ai_agents_v2.chatty_ai_agent_in_chat import HumanInterventionReason
1
2
  from letschatty.models.company.assets.chat_assets import ChainOfThoughtInChatTrigger
2
3
  from pydantic import BaseModel, Field, model_validator
3
- from typing import Dict, Any, List, Optional
4
+ from typing import Dict, Any, List, Optional, TYPE_CHECKING
4
5
 
5
6
  from letschatty.models.base_models.ai_agent_component import AiAgentComponentType
6
7
  from letschatty.models.utils.types.identifier import StrObjectId
7
8
  from .lambda_invokation_types import InvokationType, LambdaAiEvent
8
- from .expected_output import ExpectedOutputIncomingMessage, ExpectedOutputSmartTag, ExpectedOutputQualityTest, IncomingMessageAIDecision
9
- from ...models.company.assets.ai_agents_v2.ai_agents_decision_output import IncomingMessageDecisionAction
9
+ from .expected_output import ExpectedOutputIncomingMessage, ExpectedOutputSmartFollowUp, ExpectedOutputSmartTag, ExpectedOutputQualityTest, IncomingMessageAIDecision
10
+ from ...models.company.assets.ai_agents_v2.ai_agents_decision_output import IncomingMessageDecisionAction, SmartFollowUpDecision
10
11
 
11
12
  class SmartTaggingCallbackMetadata(BaseModel):
12
13
  chat_id: StrObjectId
13
14
  company_id: StrObjectId
15
+ trigger: ChainOfThoughtInChatTrigger
14
16
 
15
17
  class ComparisonAnalysisCallbackMetadata(BaseModel):
16
18
  test_case_id: StrObjectId
@@ -22,21 +24,8 @@ class InteractionCallbackMetadata(BaseModel):
22
24
  ai_agent_id: StrObjectId
23
25
  company_id: StrObjectId
24
26
  interaction_index: int
25
-
26
- class IncomingMessageCallbackMetadata(BaseModel):
27
- chat_id: StrObjectId
28
- company_id: StrObjectId
29
- ai_agent_id: StrObjectId
30
- cot_id: StrObjectId
31
- trigger: str
32
- # Trigger info is in: incoming_message_ids for user_message,
33
- # triggered_by_user_id for manual_trigger, smart_follow_up_id for follow_up
34
- triggered_by_user_id: Optional[StrObjectId] = None
35
-
36
- class IncomingMessageCallbackEvent(LambdaAiEvent):
37
- type: InvokationType = InvokationType.INCOMING_MESSAGE_CALLBACK
38
- data: IncomingMessageAIDecision
39
- callback_metadata: IncomingMessageCallbackMetadata
27
+ trigger: ChainOfThoughtInChatTrigger
28
+ chain_of_thought_id: StrObjectId
40
29
 
41
30
  class QualityTestCallbackEvent(LambdaAiEvent):
42
31
  type: InvokationType = InvokationType.SINGLE_QUALITY_TEST_CALLBACK
@@ -54,16 +43,73 @@ class QualityTestInteractionCallbackEvent(LambdaAiEvent):
54
43
  data["data"]["chain_of_thought"]["chatty_ai_agent_id"] = data["callback_metadata"]["ai_agent_id"]
55
44
  return data
56
45
 
46
+ @model_validator(mode="before")
47
+ @classmethod
48
+ def set_chain_of_thought_id(cls, values: Dict[str, Any]):
49
+ """
50
+ Get the chain_of_thought_id from callback_metadata and set it in data.chain_of_thought.id
51
+
52
+ Handles both cases:
53
+ - data is a JSON string (needs parsing)
54
+ - data is already a dict
55
+ """
56
+ import json
57
+
58
+ data = values.get("data")
59
+ callback_metadata = values.get("callback_metadata")
60
+
61
+ if not data or not callback_metadata:
62
+ return values
63
+
64
+ # Get chain_of_thought_id from callback_metadata (could be dict or object)
65
+ if isinstance(callback_metadata, dict):
66
+ chain_of_thought_id = callback_metadata.get("chain_of_thought_id")
67
+ else:
68
+ chain_of_thought_id = getattr(callback_metadata, "chain_of_thought_id", None)
69
+
70
+ if not chain_of_thought_id:
71
+ return values
72
+
73
+ # Parse data if it's a JSON string
74
+ if isinstance(data, str):
75
+ try:
76
+ data = json.loads(data)
77
+ values["data"] = data
78
+ except (json.JSONDecodeError, TypeError):
79
+ return values
80
+
81
+ # If data is a dict, set the id in chain_of_thought
82
+ if isinstance(data, dict):
83
+ chain_of_thought = data.get("chain_of_thought")
84
+ if isinstance(chain_of_thought, dict):
85
+ chain_of_thought["id"] = chain_of_thought_id
86
+
87
+ return values
88
+
89
+
57
90
  class SmartTaggingCallbackEvent(LambdaAiEvent):
58
91
  type: InvokationType = InvokationType.SMART_TAGGING_CALLBACK
59
92
  data: ExpectedOutputSmartTag
60
93
  callback_metadata: SmartTaggingCallbackMetadata
61
94
 
62
95
  @model_validator(mode="before")
63
- def validate_data(cls, data):
64
- if isinstance(data, dict) and "data" in data and "chain_of_thought" in data["data"]:
65
- data["data"]["chain_of_thought"]["chatty_ai_agent_id"] = "000000000000000000000000"
66
- return data
96
+ def normalize_data(cls, values):
97
+ if not isinstance(values, dict):
98
+ return values
99
+
100
+ data = values.get("data")
101
+ if isinstance(data, str):
102
+ import json
103
+ try:
104
+ data = json.loads(data)
105
+ values["data"] = data
106
+ except (json.JSONDecodeError, TypeError):
107
+ return values
108
+
109
+ if isinstance(data, dict) and "chain_of_thought" in data:
110
+ data["chain_of_thought"]["chatty_ai_agent_id"] = "000000000000000000000000"
111
+
112
+ return values
67
113
 
68
114
  class ChatData(BaseModel):
69
115
  chat_id: StrObjectId
@@ -77,6 +123,11 @@ class FollowUpEvent(LambdaAiEvent):
77
123
  type: InvokationType = InvokationType.FOLLOW_UP
78
124
  data: ChatData
79
125
 
126
+
127
+ class SmartFollowUpDecisionOutputEvent(LambdaAiEvent):
128
+ type: InvokationType = InvokationType.FOLLOW_UP
129
+ data: ExpectedOutputSmartFollowUp
130
+
80
131
  class QualityTestEventData(BaseModel):
81
132
  chat_example_id: StrObjectId
82
133
  company_id: StrObjectId
@@ -130,11 +181,9 @@ class DoubleCheckerCallbackMetadata(BaseModel):
130
181
  company_id: StrObjectId
131
182
  ai_agent_id: StrObjectId
132
183
  incoming_messages_ids: List[str]
133
- # Trigger info
134
- trigger: str
135
- # Trigger info is in: incoming_messages_ids for user_message,
136
- # triggered_by_user_id for manual_trigger, smart_follow_up_id for follow_up
137
- triggered_by_user_id: Optional[StrObjectId] = None
184
+ trigger: ChainOfThoughtInChatTrigger
185
+ chain_of_thought_id: StrObjectId
186
+
138
187
 
139
188
  class DoubleCheckerForIncomingMessagesAnswerEvent(LambdaAiEvent):
140
189
  type: InvokationType = InvokationType.DOUBLE_CHECKER_FOR_INCOMING_MESSAGES_ANSWER
@@ -142,13 +191,73 @@ class DoubleCheckerForIncomingMessagesAnswerEvent(LambdaAiEvent):
142
191
 
143
192
  class DoubleCheckerForIncomingMessagesAnswerCallbackEvent(LambdaAiEvent):
144
193
  type: InvokationType = InvokationType.DOUBLE_CHECKER_FOR_INCOMING_MESSAGES_ANSWER_CALLBACK
145
- data: DoubleCheckerForIncomingMessagesAnswerData
194
+ data: ExpectedOutputIncomingMessage
146
195
  callback_metadata: DoubleCheckerCallbackMetadata
147
196
 
148
- class DoubleCheckerForIncomingMessagesAnswerCallbackMetadata(BaseModel):
197
+ @model_validator(mode="before")
198
+ @classmethod
199
+ def set_chain_of_thought_id(cls, values: Dict[str, Any]):
200
+ """
201
+ Get the chain_of_thought_id from callback_metadata and set it in data.chain_of_thought.id
202
+
203
+ Handles both cases:
204
+ - data is a JSON string (needs parsing)
205
+ - data is already a dict
206
+ """
207
+ import json
208
+
209
+ data = values.get("data")
210
+ callback_metadata = values.get("callback_metadata")
211
+
212
+ if not data or not callback_metadata:
213
+ return values
214
+
215
+ # Get chain_of_thought_id from callback_metadata (could be dict or object)
216
+ if isinstance(callback_metadata, dict):
217
+ chain_of_thought_id = callback_metadata.get("chain_of_thought_id")
218
+ else:
219
+ chain_of_thought_id = getattr(callback_metadata, "chain_of_thought_id", None)
220
+
221
+ if not chain_of_thought_id:
222
+ return values
223
+
224
+ # Parse data if it's a JSON string
225
+ if isinstance(data, str):
226
+ try:
227
+ data = json.loads(data)
228
+ values["data"] = data
229
+ except (json.JSONDecodeError, TypeError):
230
+ return values
231
+
232
+ # If data is a dict, set the id in chain_of_thought
233
+ if isinstance(data, dict):
234
+ chain_of_thought = data.get("chain_of_thought")
235
+ if isinstance(chain_of_thought, dict):
236
+ chain_of_thought["id"] = chain_of_thought_id
237
+
238
+ return values
239
+
240
+
241
+
242
+ # Smart Follow-Up Decision Output Events
243
+
244
+ class SmartFollowUpDecisionOutputData(BaseModel):
245
+ """Data for smart follow-up decision output"""
149
246
  chat_id: StrObjectId
150
247
  company_id: StrObjectId
151
248
  ai_agent_id: StrObjectId
249
+ smart_follow_up_output: ExpectedOutputSmartFollowUp
250
+ smart_follow_up_id: Optional[StrObjectId] = None
251
+
252
+ class SmartFollowUpDecisionOutputEvent(LambdaAiEvent):
253
+ """
254
+ Event for smart follow-up decision output.
255
+
256
+ Similar to incoming message decision but for follow-ups.
257
+ Bypasses double checker and sends directly to API.
258
+ """
259
+ type: InvokationType = InvokationType.SMART_FOLLOW_UP_DECISION_OUTPUT
260
+ data: SmartFollowUpDecisionOutputData
152
261
 
153
262
 
154
263
  # New AI Agent Context Building Events (for new architecture)
@@ -183,7 +292,7 @@ class GetChatWithPromptForFollowUpEventData(BaseModel):
183
292
  """Data for get chat with prompt for follow-up event"""
184
293
  chat_id: StrObjectId
185
294
  company_id: StrObjectId
186
- smart_follow_up_id: StrObjectId
295
+ smart_follow_up_id: Optional[StrObjectId] = Field(default=None, description="Smart follow-up ID")
187
296
  # Trigger information
188
297
  trigger: ChainOfThoughtInChatTrigger
189
298
  # trigger_id is derived from: smart_follow_up_id
@@ -303,7 +412,8 @@ class EscalateAIAgentInChatEventData(BaseModel):
303
412
  """Data for escalating an AI agent (requiring human intervention)"""
304
413
  chat_id: StrObjectId
305
414
  company_id: StrObjectId
306
- reason: str = Field(description="Reason for escalation (e.g., 'Complex technical issue', 'Customer request')")
415
+ reason: HumanInterventionReason = Field(description="Reason for escalation", default=HumanInterventionReason.SOMETHING_WENT_WRONG)
416
+ message: Optional[str] = Field(default="El agente de IA requiere de tu intervención", description="The message to display to the user if any")
307
417
 
308
418
 
309
419
  class EscalateAIAgentInChatEvent(LambdaAiEvent):
@@ -335,6 +445,24 @@ class UnescalateAIAgentInChatEvent(LambdaAiEvent):
335
445
  data: UnescalateAIAgentInChatEventData
336
446
 
337
447
 
448
+
449
+ class GetChainOfThoughtsByChatIdEventData(BaseModel):
450
+ """Data for getting chain of thoughts by chat ID"""
451
+ chat_id: StrObjectId
452
+ company_id: StrObjectId
453
+ skip: int = Field(default=0, description="Number of results to skip for pagination")
454
+ limit: int = Field(default=10, description="Number of results to return")
455
+
456
+
457
+ class GetChainOfThoughtsByChatIdEvent(LambdaAiEvent):
458
+ """
459
+ Event to get chain of thoughts for a chat.
460
+
461
+ Returns a list of chain of thoughts associated with the given chat ID,
462
+ sorted by created_at (newest first), with pagination support via skip.
463
+ """
464
+ type: InvokationType = InvokationType.GET_CHAIN_OF_THOUGHTS_BY_CHAT_ID
465
+ data: GetChainOfThoughtsByChatIdEventData
338
466
  # Launch Events
339
467
 
340
468
  class LaunchCommunicationEventData(BaseModel):
@@ -11,13 +11,14 @@ class InvokationType(StrEnum):
11
11
  SMART_TAGGING_PROMPT = "smart_tagging_prompt"
12
12
  QUALITY_TEST_INTERACTION = "quality_test_interaction"
13
13
  # Callback-specific types
14
- INCOMING_MESSAGE_CALLBACK = "incoming_message_callback"
15
14
  SINGLE_QUALITY_TEST_CALLBACK = "single_quality_test_callback"
16
15
  SMART_TAGGING_CALLBACK = "smart_tagging_callback"
17
16
  QUALITY_TESTS_FOR_UPDATED_AI_COMPONENT = "quality_tests_for_updated_ai_component"
18
17
  FIX_BUGGED_AI_AGENTS_CALLS_IN_CHATS = "fix_bugged_ai_agents_calls_in_chats"
19
18
  DOUBLE_CHECKER_FOR_INCOMING_MESSAGES_ANSWER = "double_checker_for_incoming_messages_answer"
20
19
  DOUBLE_CHECKER_FOR_INCOMING_MESSAGES_ANSWER_CALLBACK = "double_checker_for_incoming_messages_answer_callback"
20
+ # Decision output events
21
+ SMART_FOLLOW_UP_DECISION_OUTPUT = "smart_follow_up_decision_output"
21
22
  # AI Agent context building events (new architecture)
22
23
  GET_CHAT_WITH_PROMPT_INCOMING_MESSAGE = "get_chat_with_prompt_incoming_message"
23
24
  GET_CHAT_WITH_PROMPT_FOLLOW_UP = "get_chat_with_prompt_follow_up"
@@ -30,6 +31,7 @@ class InvokationType(StrEnum):
30
31
  UPDATE_AI_AGENT_MODE_IN_CHAT = "update_ai_agent_mode_in_chat"
31
32
  ESCALATE_AI_AGENT_IN_CHAT = "escalate_ai_agent_in_chat"
32
33
  UNESCALATE_AI_AGENT_IN_CHAT = "unescalate_ai_agent_in_chat"
34
+ GET_CHAIN_OF_THOUGHTS_BY_CHAT_ID = "get_chain_of_thoughts_by_chat_id"
33
35
  # Launch events
34
36
  LAUNCH_COMMUNICATION = "launch_communication"
35
37
  LAUNCH_WELCOME_KIT = "launch_welcome_kit"
@@ -1,3 +1,4 @@
1
+ from letschatty.models.company.assets.chat_assets import ChainOfThoughtInChatTrigger
1
2
  from pydantic import BaseModel, Field
2
3
  from letschatty.models import StrObjectId
3
4
  from letschatty.models.company.assets.ai_agents_v2.chatty_ai_agent import N8NWorkspaceAgentType
@@ -10,4 +11,5 @@ class SmartFollowUpN8NPayload(BaseModel):
10
11
  class ManualTriggerN8NPayload(BaseModel):
11
12
  chat_id: StrObjectId = Field(description="The id of the chat")
12
13
  company_id: StrObjectId = Field(description="The id of the company")
13
- n8n_agent_type: N8NWorkspaceAgentType = Field(description="The type of agent to redirect the message to")
14
+ n8n_agent_type: N8NWorkspaceAgentType = Field(description="The type of agent to redirect the message to")
15
+ trigger: ChainOfThoughtInChatTrigger = Field(default=ChainOfThoughtInChatTrigger.MANUAL_TRIGGER)
@@ -28,4 +28,5 @@ from ...messages.chatty_messages import ChattyMessage
28
28
  from ...company.CRM.funnel import Funnel, FunnelStage
29
29
  from ...utils.types import Status
30
30
  from .chat_based_events.chat_based_event import CustomerEventData
31
- from .chat_based_events.ai_agent_chat import ChattyAIChatEvent, ChattyAIChatData
31
+ from .chat_based_events.ai_agent_chat import ChattyAIChatEvent, ChattyAIChatData
32
+ from .chat_based_events.ai_agent_execution_event import AIAgentExecutionEvent, AIAgentExecutionEventData
@@ -0,0 +1,71 @@
1
+ """AI Agent Execution Events - Track AI agent lifecycle and decision-making"""
2
+
3
+ from ..base import Event, EventData
4
+ from ..event_types import EventType
5
+ from .chat_based_event import CustomerEventData
6
+ from typing import ClassVar, Optional, Dict, Any
7
+ from ....utils.types.identifier import StrObjectId
8
+
9
+
10
+ class AIAgentExecutionEventData(CustomerEventData):
11
+ """Data for AI agent execution events"""
12
+ ai_agent_id: StrObjectId
13
+ chain_of_thought_id: StrObjectId
14
+ trigger: str # USER_MESSAGE, FOLLOW_UP, MANUAL_TRIGGER, RETRY
15
+ decision_type: Optional[str] = None # send, suggest, escalate, skip
16
+ error_message: Optional[str] = None
17
+ duration_ms: Optional[int] = None
18
+ user_rating: Optional[int] = None # 1-5 stars
19
+ metadata: Optional[Dict[str, Any]] = None
20
+
21
+
22
+ class AIAgentExecutionEvent(Event):
23
+ """
24
+ Events for AI agent execution lifecycle.
25
+
26
+ This event type covers the entire AI agent decision-making process,
27
+ from trigger to final decision, including all intermediate steps.
28
+ """
29
+ data: AIAgentExecutionEventData
30
+
31
+ VALID_TYPES: ClassVar[set] = {
32
+ # Trigger events
33
+ EventType.CHATTY_AI_AGENT_IN_CHAT_TRIGGER_USER_MESSAGE,
34
+ EventType.CHATTY_AI_AGENT_IN_CHAT_TRIGGER_FOLLOW_UP,
35
+ EventType.CHATTY_AI_AGENT_IN_CHAT_TRIGGER_MANUAL,
36
+ EventType.CHATTY_AI_AGENT_IN_CHAT_TRIGGER_RETRY,
37
+
38
+ # State events
39
+ EventType.CHATTY_AI_AGENT_IN_CHAT_STATE_PROCESSING_STARTED,
40
+ EventType.CHATTY_AI_AGENT_IN_CHAT_STATE_CALL_STARTED,
41
+ EventType.CHATTY_AI_AGENT_IN_CHAT_STATE_ESCALATED,
42
+ EventType.CHATTY_AI_AGENT_IN_CHAT_STATE_UNESCALATED,
43
+
44
+ # Call events
45
+ EventType.CHATTY_AI_AGENT_IN_CHAT_CALL_GET_CHAT_WITH_PROMPT,
46
+ EventType.CHATTY_AI_AGENT_IN_CHAT_CALL_TAGGER,
47
+ EventType.CHATTY_AI_AGENT_IN_CHAT_CALL_DOUBLE_CHECKER,
48
+ EventType.CHATTY_AI_AGENT_IN_CHAT_CALL_DEBUGGER,
49
+
50
+ # Callback events
51
+ EventType.CHATTY_AI_AGENT_IN_CHAT_CALLBACK_GET_CHAT_WITH_PROMPT,
52
+ EventType.CHATTY_AI_AGENT_IN_CHAT_CALLBACK_TAGGER,
53
+ EventType.CHATTY_AI_AGENT_IN_CHAT_CALLBACK_DOUBLE_CHECKER,
54
+ EventType.CHATTY_AI_AGENT_IN_CHAT_CALLBACK_OUTPUT_RECEIVED,
55
+
56
+ # Decision events
57
+ EventType.CHATTY_AI_AGENT_IN_CHAT_DECISION_SEND,
58
+ EventType.CHATTY_AI_AGENT_IN_CHAT_DECISION_SUGGEST,
59
+ EventType.CHATTY_AI_AGENT_IN_CHAT_DECISION_ESCALATE,
60
+ EventType.CHATTY_AI_AGENT_IN_CHAT_DECISION_SKIP,
61
+ EventType.CHATTY_AI_AGENT_IN_CHAT_DECISION_SENT_TO_API,
62
+ EventType.CHATTY_AI_AGENT_IN_CHAT_DECISION_COMPLETED,
63
+
64
+ # Error events
65
+ EventType.CHATTY_AI_AGENT_IN_CHAT_ERROR_CALL_FAILED,
66
+ EventType.CHATTY_AI_AGENT_IN_CHAT_ERROR_CALL_CANCELLED,
67
+ EventType.CHATTY_AI_AGENT_IN_CHAT_ERROR_VALIDATION_FAILED,
68
+
69
+ # Rating events
70
+ EventType.CHATTY_AI_AGENT_IN_CHAT_RATING_RECEIVED,
71
+ }
@@ -70,9 +70,6 @@ class AssetEvent(Event):
70
70
  EventType.FILTER_CRITERIA_CREATED,
71
71
  EventType.FILTER_CRITERIA_UPDATED,
72
72
  EventType.FILTER_CRITERIA_DELETED,
73
- EventType.FORM_FIELD_CREATED,
74
- EventType.FORM_FIELD_UPDATED,
75
- EventType.FORM_FIELD_DELETED,
76
73
  EventType.COMPANY_CREATED,
77
74
  EventType.COMPANY_UPDATED,
78
75
  EventType.COMPANY_DELETED
@@ -86,10 +86,6 @@ EVENT_TO_TYPE_CLASSES = {
86
86
  EventType.WORKFLOW_CREATED : AssetEvent,
87
87
  EventType.WORKFLOW_UPDATED : AssetEvent,
88
88
  EventType.WORKFLOW_DELETED : AssetEvent,
89
- #FORM FIELDS
90
- EventType.FORM_FIELD_CREATED : AssetEvent,
91
- EventType.FORM_FIELD_UPDATED : AssetEvent,
92
- EventType.FORM_FIELD_DELETED : AssetEvent,
93
89
  #AGENTS
94
90
  EventType.USER_CREATED : UserEvent,
95
91
  EventType.USER_UPDATED : UserEvent,
@@ -12,6 +12,51 @@ class EventType(StrEnum):
12
12
  AI_AGENT_ASSIGNED_TO_CHAT = "chat.chatty_ai_agent.assigned_to_chat"
13
13
  AI_AGENT_REMOVED_FROM_CHAT = "chat.chatty_ai_agent.removed_from_chat"
14
14
  AI_AGENT_UPDATED_ON_CHAT = "chat.chatty_ai_agent.updated_on_chat"
15
+
16
+ #CHATTY AI AGENT EXECUTION EVENTS - 3-level hierarchy for execution tracking
17
+ # Pattern: chatty_ai_agent_in_chat.{operation}.{detail}
18
+ # Note: Execution events are already chat-scoped via CustomerEventData
19
+
20
+ # TRIGGER EVENTS - What initiates AI agent processing
21
+ CHATTY_AI_AGENT_IN_CHAT_TRIGGER_USER_MESSAGE = "chatty_ai_agent_in_chat.trigger.user_message"
22
+ CHATTY_AI_AGENT_IN_CHAT_TRIGGER_FOLLOW_UP = "chatty_ai_agent_in_chat.trigger.follow_up"
23
+ CHATTY_AI_AGENT_IN_CHAT_TRIGGER_MANUAL = "chatty_ai_agent_in_chat.trigger.manual"
24
+ CHATTY_AI_AGENT_IN_CHAT_TRIGGER_RETRY = "chatty_ai_agent_in_chat.trigger.retry"
25
+
26
+ # STATE EVENTS - AI agent state changes
27
+ CHATTY_AI_AGENT_IN_CHAT_STATE_PROCESSING_STARTED = "chatty_ai_agent_in_chat.state.processing_started"
28
+ CHATTY_AI_AGENT_IN_CHAT_STATE_CALL_STARTED = "chatty_ai_agent_in_chat.state.call_started"
29
+ CHATTY_AI_AGENT_IN_CHAT_STATE_ESCALATED = "chatty_ai_agent_in_chat.state.escalated"
30
+ CHATTY_AI_AGENT_IN_CHAT_STATE_UNESCALATED = "chatty_ai_agent_in_chat.state.unescalated"
31
+
32
+ # CALL EVENTS - Outbound calls to services
33
+ CHATTY_AI_AGENT_IN_CHAT_CALL_GET_CHAT_WITH_PROMPT = "chatty_ai_agent_in_chat.call.get_chat_with_prompt"
34
+ CHATTY_AI_AGENT_IN_CHAT_CALL_TAGGER = "chatty_ai_agent_in_chat.call.tagger"
35
+ CHATTY_AI_AGENT_IN_CHAT_CALL_DOUBLE_CHECKER = "chatty_ai_agent_in_chat.call.double_checker"
36
+ CHATTY_AI_AGENT_IN_CHAT_CALL_DEBUGGER = "chatty_ai_agent_in_chat.call.debugger"
37
+
38
+ # CALLBACK EVENTS - Responses received from services
39
+ CHATTY_AI_AGENT_IN_CHAT_CALLBACK_GET_CHAT_WITH_PROMPT = "chatty_ai_agent_in_chat.callback.get_chat_with_prompt"
40
+ CHATTY_AI_AGENT_IN_CHAT_CALLBACK_TAGGER = "chatty_ai_agent_in_chat.callback.tagger"
41
+ CHATTY_AI_AGENT_IN_CHAT_CALLBACK_DOUBLE_CHECKER = "chatty_ai_agent_in_chat.callback.double_checker"
42
+ CHATTY_AI_AGENT_IN_CHAT_CALLBACK_OUTPUT_RECEIVED = "chatty_ai_agent_in_chat.callback.output_received"
43
+
44
+ # DECISION EVENTS - AI agent decisions and actions
45
+ CHATTY_AI_AGENT_IN_CHAT_DECISION_SEND = "chatty_ai_agent_in_chat.decision.send"
46
+ CHATTY_AI_AGENT_IN_CHAT_DECISION_SUGGEST = "chatty_ai_agent_in_chat.decision.suggest"
47
+ CHATTY_AI_AGENT_IN_CHAT_DECISION_ESCALATE = "chatty_ai_agent_in_chat.decision.escalate"
48
+ CHATTY_AI_AGENT_IN_CHAT_DECISION_SKIP = "chatty_ai_agent_in_chat.decision.skip"
49
+ CHATTY_AI_AGENT_IN_CHAT_DECISION_SENT_TO_API = "chatty_ai_agent_in_chat.decision.sent_to_api"
50
+ CHATTY_AI_AGENT_IN_CHAT_DECISION_COMPLETED = "chatty_ai_agent_in_chat.decision.completed"
51
+
52
+ # ERROR EVENTS - Failures and cancellations
53
+ CHATTY_AI_AGENT_IN_CHAT_ERROR_CALL_FAILED = "chatty_ai_agent_in_chat.error.call_failed"
54
+ CHATTY_AI_AGENT_IN_CHAT_ERROR_CALL_CANCELLED = "chatty_ai_agent_in_chat.error.call_cancelled"
55
+ CHATTY_AI_AGENT_IN_CHAT_ERROR_VALIDATION_FAILED = "chatty_ai_agent_in_chat.error.validation_failed"
56
+
57
+ # RATING EVENTS - User feedback
58
+ CHATTY_AI_AGENT_IN_CHAT_RATING_RECEIVED = "chatty_ai_agent_in_chat.rating.received"
59
+
15
60
  #PRODUCTS
16
61
  PRODUCT_ASSIGNED = "chat.product.assigned"
17
62
  PRODUCT_REMOVED = "chat.product.removed"
@@ -30,7 +30,7 @@ class ContinuousConversation(ChattyAssetModel):
30
30
  template_message_waid: Optional[str] = None
31
31
  status: Optional[ContinuousConversationStatus] = Field(default=ContinuousConversationStatus.CREATED)
32
32
  active: bool = Field(default=True)
33
- expires_at: datetime = Field(default_factory=lambda: datetime.now(ZoneInfo("UTC")) + timedelta(days=10))
33
+ expires_at: datetime = Field(default=datetime.now(ZoneInfo("UTC")) + timedelta(days=10))
34
34
  messages: List[MessageDraft]
35
35
  creator_id: StrObjectId
36
36
  forced_send: bool = Field(default=False)
@@ -55,7 +55,7 @@ class SmartFollowUpDecision(BaseModel):
55
55
  SmartFollowUpDecisionAction.POSTPONE_DELTA_TIME]:
56
56
  # Postpone actions don't require messages
57
57
  if self.messages is not None and len(self.messages) > 0:
58
- raise ValueError("Messages are not allowed when action is postpone/postponed")
58
+ raise ValueError("Messages are not allowed when action is postpone")
59
59
  else:
60
60
  raise ValueError(f"Invalid action: {self.action}")
61
61
 
@@ -110,6 +110,12 @@ class ChattyAIAgent(CompanyAssetModel):
110
110
  examples: List[StrObjectId] = Field(default_factory=list, description="Training examples")
111
111
  double_checker_enabled: bool = Field(default=False, description="Whether the double checker is enabled")
112
112
  double_checker_instructions: Optional[str] = Field(default=None, description="Instructions for the double checker")
113
+ copilot_confidence_threshold: Optional[int] = Field(
114
+ default=None,
115
+ ge=0,
116
+ le=100,
117
+ description="Confidence threshold 0-100 para modo COPILOT (fallback a env si no está)"
118
+ )
113
119
 
114
120
  # Pre-qualification configuration
115
121
  pre_qualify: Optional["PreQualifyConfig"] = Field(
@@ -165,4 +171,4 @@ class ChattyAIAgent(CompanyAssetModel):
165
171
 
166
172
  # Import and rebuild for forward reference resolution
167
173
  from .pre_qualify_config import PreQualifyConfig
168
- ChattyAIAgent.model_rebuild()
174
+ ChattyAIAgent.model_rebuild()
@@ -7,15 +7,16 @@ independently without loading entire chat documents.
7
7
  """
8
8
 
9
9
  from letschatty.models.analytics.events.base import EventType
10
+ from enum import StrEnum
10
11
  from pydantic import BaseModel, Field, field_validator, ConfigDict
11
12
  from datetime import datetime
12
13
  from zoneinfo import ZoneInfo
13
14
  from typing import Optional, ClassVar, List, Dict, Any
14
- from enum import StrEnum
15
15
  from letschatty.models.base_models.chatty_asset_model import CompanyAssetModel, ChattyAssetPreview
16
16
  from letschatty.models.utils.types.identifier import StrObjectId
17
17
  from .chain_of_thought_in_chat import ChainOfThoughtInChatTrigger
18
18
  from .chatty_ai_mode import ChattyAIMode
19
+ from .statuses import DataCollectionStatus, PreQualifyStatus
19
20
  import logging
20
21
 
21
22
  logger = logging.getLogger(__name__)
@@ -45,38 +46,6 @@ class HumanInterventionReason(StrEnum):
45
46
  SOMETHING_WENT_WRONG = "something_went_wrong"
46
47
 
47
48
 
48
- class DataCollectionStatus(StrEnum):
49
- """
50
- Status of data collection for the AI agent in this chat.
51
- Only tracks field collection, not qualification status.
52
-
53
- - COLLECTING: Still collecting data from the user
54
- - MANDATORY_COMPLETED: All mandatory fields have been collected
55
- - ALL_COMPLETED: All fields (mandatory + optional) have been collected
56
- - CANCELLED: Data collection was cancelled
57
- """
58
- COLLECTING = "collecting"
59
- MANDATORY_COMPLETED = "mandatory_completed"
60
- ALL_COMPLETED = "all_completed"
61
- CANCELLED = "cancelled"
62
-
63
-
64
- class PreQualifyStatus(StrEnum):
65
- """
66
- Status of pre-qualification for the AI agent in this chat.
67
- Separate from data collection - tracks qualification evaluation.
68
-
69
- - PENDING: Waiting for data collection to complete
70
- - EVALUATING: Data collected, evaluating acceptance criteria
71
- - QUALIFIED: User met acceptance criteria
72
- - UNQUALIFIED: User did NOT meet acceptance criteria
73
- """
74
- PENDING = "pending"
75
- EVALUATING = "evaluating"
76
- QUALIFIED = "qualified"
77
- UNQUALIFIED = "unqualified"
78
-
79
-
80
49
  class HumanIntervention(BaseModel):
81
50
  """
82
51
  Reason for human intervention
@@ -123,6 +92,10 @@ class ChattyAIAgentInChat(CompanyAssetModel):
123
92
  default=None,
124
93
  description="If the trigger is a user message, this will be the id of the incoming message"
125
94
  )
95
+ last_reset_message_id: Optional[str] = Field(
96
+ default=None,
97
+ description="Last reset control trigger message id handled for this chat"
98
+ )
126
99
 
127
100
  # Assignment metadata
128
101
  assigned_at: datetime = Field(default_factory=lambda: datetime.now(ZoneInfo("UTC")))
@@ -352,4 +325,3 @@ class ChattyAIAgentInChat(CompanyAssetModel):
352
325
  """Cancel data collection"""
353
326
  self.data_collection_status = DataCollectionStatus.CANCELLED
354
327
  self.updated_at = datetime.now(ZoneInfo("UTC"))
355
-