letschatty 0.4.341__tar.gz → 0.4.342__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 (325) hide show
  1. {letschatty-0.4.341 → letschatty-0.4.342}/PKG-INFO +1 -1
  2. {letschatty-0.4.341 → letschatty-0.4.342}/pyproject.toml +1 -1
  3. letschatty-0.4.342/src/letschatty/models/ai_microservices/__init__.py +10 -0
  4. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/ai_microservices/expected_output.py +29 -2
  5. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/ai_microservices/lambda_events.py +137 -28
  6. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/ai_microservices/lambda_invokation_types.py +3 -1
  7. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/ai_microservices/n8n_ai_agents_payload.py +3 -1
  8. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/__init__.py +3 -2
  9. letschatty-0.4.342/src/letschatty/models/analytics/events/chat_based_events/ai_agent_execution_event.py +71 -0
  10. letschatty-0.4.342/src/letschatty/models/analytics/events/chat_based_events/chat_funnel.py +40 -0
  11. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/company_based_events/asset_events.py +2 -9
  12. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/event_type_to_classes.py +3 -6
  13. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/event_types.py +50 -9
  14. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/chat/chat.py +2 -13
  15. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/chat/chat_with_assets.py +1 -6
  16. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/chat/client.py +2 -0
  17. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/chat/continuous_conversation.py +1 -1
  18. letschatty-0.4.342/src/letschatty/models/company/CRM/funnel.py +69 -0
  19. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/__init__.py +1 -2
  20. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/ai_agents_v2/ai_agents_decision_output.py +1 -1
  21. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/ai_agents_v2/chatty_ai_agent_in_chat.py +4 -0
  22. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/ai_agents_v2/chatty_ai_mode.py +2 -2
  23. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/ai_agents_v2/get_chat_with_prompt_response.py +1 -0
  24. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/ai_agents_v2/pre_qualify_config.py +14 -2
  25. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/automation.py +19 -10
  26. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/chat_assets.py +2 -3
  27. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/company_assets.py +0 -2
  28. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/sale.py +3 -3
  29. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/data_base/collection_interface.py +101 -29
  30. letschatty-0.4.342/src/letschatty/models/data_base/mongo_connection.py +118 -0
  31. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_document.py +2 -4
  32. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_media.py +3 -4
  33. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/utils/custom_exceptions/custom_exceptions.py +14 -1
  34. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/ai_agents/smart_follow_up_context_builder_v2.py +5 -2
  35. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/chat/chat_service.py +11 -47
  36. letschatty-0.4.342/src/letschatty/services/chatty_assets/__init__.py +14 -0
  37. letschatty-0.4.342/src/letschatty/services/chatty_assets/asset_service.py +260 -0
  38. letschatty-0.4.342/src/letschatty/services/chatty_assets/assets_collections.py +137 -0
  39. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/chatty_assets/base_container.py +3 -2
  40. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/chatty_assets/base_container_with_collection.py +35 -26
  41. letschatty-0.4.342/src/letschatty/services/chatty_assets/collections/__init__.py +38 -0
  42. letschatty-0.4.342/src/letschatty/services/chatty_assets/collections/ai_agent_collection.py +19 -0
  43. letschatty-0.4.342/src/letschatty/services/chatty_assets/collections/ai_agent_in_chat_collection.py +32 -0
  44. letschatty-0.4.342/src/letschatty/services/chatty_assets/collections/ai_component_collection.py +21 -0
  45. letschatty-0.4.342/src/letschatty/services/chatty_assets/collections/chain_of_thought_collection.py +30 -0
  46. letschatty-0.4.342/src/letschatty/services/chatty_assets/collections/chat_collection.py +21 -0
  47. letschatty-0.4.342/src/letschatty/services/chatty_assets/collections/contact_point_collection.py +21 -0
  48. letschatty-0.4.342/src/letschatty/services/chatty_assets/collections/fast_answer_collection.py +21 -0
  49. letschatty-0.4.342/src/letschatty/services/chatty_assets/collections/filter_criteria_collection.py +18 -0
  50. letschatty-0.4.342/src/letschatty/services/chatty_assets/collections/flow_collection.py +20 -0
  51. letschatty-0.4.342/src/letschatty/services/chatty_assets/collections/product_collection.py +20 -0
  52. letschatty-0.4.342/src/letschatty/services/chatty_assets/collections/sale_collection.py +20 -0
  53. letschatty-0.4.342/src/letschatty/services/chatty_assets/collections/source_collection.py +21 -0
  54. letschatty-0.4.342/src/letschatty/services/chatty_assets/collections/tag_collection.py +19 -0
  55. letschatty-0.4.342/src/letschatty/services/chatty_assets/collections/topic_collection.py +21 -0
  56. letschatty-0.4.342/src/letschatty/services/chatty_assets/collections/user_collection.py +20 -0
  57. letschatty-0.4.342/src/letschatty/services/chatty_assets/example_usage.py +44 -0
  58. letschatty-0.4.342/src/letschatty/services/chatty_assets/services/__init__.py +37 -0
  59. letschatty-0.4.342/src/letschatty/services/chatty_assets/services/ai_agent_in_chat_service.py +73 -0
  60. letschatty-0.4.342/src/letschatty/services/chatty_assets/services/ai_agent_service.py +23 -0
  61. letschatty-0.4.342/src/letschatty/services/chatty_assets/services/chain_of_thought_service.py +70 -0
  62. letschatty-0.4.342/src/letschatty/services/chatty_assets/services/chat_service.py +25 -0
  63. letschatty-0.4.342/src/letschatty/services/chatty_assets/services/contact_point_service.py +29 -0
  64. letschatty-0.4.342/src/letschatty/services/chatty_assets/services/fast_answer_service.py +32 -0
  65. letschatty-0.4.342/src/letschatty/services/chatty_assets/services/filter_criteria_service.py +30 -0
  66. letschatty-0.4.342/src/letschatty/services/chatty_assets/services/flow_service.py +25 -0
  67. letschatty-0.4.342/src/letschatty/services/chatty_assets/services/product_service.py +30 -0
  68. letschatty-0.4.342/src/letschatty/services/chatty_assets/services/sale_service.py +25 -0
  69. letschatty-0.4.342/src/letschatty/services/chatty_assets/services/source_service.py +28 -0
  70. letschatty-0.4.342/src/letschatty/services/chatty_assets/services/tag_service.py +32 -0
  71. letschatty-0.4.342/src/letschatty/services/chatty_assets/services/topic_service.py +31 -0
  72. letschatty-0.4.342/src/letschatty/services/chatty_assets/services/user_service.py +32 -0
  73. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/continuous_conversation_service/continuous_conversation_helper.py +11 -0
  74. letschatty-0.4.342/src/letschatty/services/events/__init__.py +6 -0
  75. letschatty-0.4.342/src/letschatty/services/events/events_manager.py +219 -0
  76. letschatty-0.4.342/src/letschatty/services/factories/analytics/ai_agent_event_factory.py +161 -0
  77. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/analytics/events_factory.py +66 -6
  78. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/lambda_ai_orchestrartor/lambda_events_factory.py +25 -8
  79. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/messages_helpers/get_caption_or_body_or_preview.py +6 -4
  80. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/validators/analytics_validator.py +0 -11
  81. letschatty-0.4.341/src/letschatty/models/ai_microservices/__init__.py +0 -10
  82. letschatty-0.4.341/src/letschatty/models/analytics/events/chat_based_events/chat_funnel.py +0 -96
  83. letschatty-0.4.341/src/letschatty/models/company/CRM/funnel.py +0 -401
  84. letschatty-0.4.341/src/letschatty/models/data_base/mongo_connection.py +0 -35
  85. letschatty-0.4.341/src/letschatty/services/chatty_assets/__init__.py +0 -2
  86. letschatty-0.4.341/src/letschatty/services/chatty_assets/asset_service.py +0 -83
  87. letschatty-0.4.341/src/letschatty/services/events/events_manager.py +0 -2
  88. {letschatty-0.4.341 → letschatty-0.4.342}/LICENSE +0 -0
  89. {letschatty-0.4.341 → letschatty-0.4.342}/README.md +0 -0
  90. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/__init__.py +0 -0
  91. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/__init__.py +0 -0
  92. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/ai_microservices/openai_payloads.py +0 -0
  93. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/__init__.py +0 -0
  94. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/base.py +0 -0
  95. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/chat_based_events/ai_agent_chat.py +0 -0
  96. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/chat_based_events/business_area.py +0 -0
  97. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/chat_based_events/chat_based_event.py +0 -0
  98. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/chat_based_events/chat_context.py +0 -0
  99. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/chat_based_events/chat_status.py +0 -0
  100. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/chat_based_events/contact_point.py +0 -0
  101. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/chat_based_events/continuous_conversation.py +0 -0
  102. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/chat_based_events/highlight.py +0 -0
  103. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/chat_based_events/message.py +0 -0
  104. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/chat_based_events/messages_intent_context.py +0 -0
  105. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/chat_based_events/product_chat.py +0 -0
  106. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/chat_based_events/quality_scoring.py +0 -0
  107. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/chat_based_events/sale.py +0 -0
  108. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/chat_based_events/tag_chat.py +0 -0
  109. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/chat_based_events/workflow.py +0 -0
  110. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/company_based_events/company_events.py +0 -0
  111. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/events/company_based_events/user_events.py +0 -0
  112. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/metrics/__init_.py +0 -0
  113. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/metrics/daily_contact_points.py +0 -0
  114. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/metrics/daily_new_chats.py +0 -0
  115. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/metrics/daily_sent_templates_grouped.py +0 -0
  116. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/metrics/sales_roadmap.py +0 -0
  117. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/metrics/sent_templates.py +0 -0
  118. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/smart_messages/friendly_code_for_source.py +0 -0
  119. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/smart_messages/topic.py +0 -0
  120. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/smart_messages/topic_message.py +0 -0
  121. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/sources/__init__.py +0 -0
  122. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/sources/google_ad_utm_source.py +0 -0
  123. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/sources/helpers.py +0 -0
  124. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/sources/other_source.py +0 -0
  125. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/sources/pure_ad.py +0 -0
  126. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/sources/pure_ad_utm_source.py +0 -0
  127. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/sources/source_base.py +0 -0
  128. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/sources/template_source.py +0 -0
  129. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/sources/topic_default_source.py +0 -0
  130. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/sources/utm_source.py +0 -0
  131. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/sources/utms/referer_info.py +0 -0
  132. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/sources/utms/utm_query_params.py +0 -0
  133. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/analytics/sources/whatsapp_default_source.py +0 -0
  134. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/auth/jwt.py +0 -0
  135. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/base_models/__init__.py +0 -0
  136. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/base_models/ai_agent_component.py +0 -0
  137. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/base_models/chatty_asset_model.py +0 -0
  138. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/base_models/helpers.py +0 -0
  139. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/base_models/related_asset_usage_example.py +0 -0
  140. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/base_models/singleton.py +0 -0
  141. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/base_models/update_model_interface.py +0 -0
  142. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/base_models/validate_timestamps_and_id.py +0 -0
  143. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/channels/channel.py +0 -0
  144. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/chat/assets_assigned_to_chat.py +0 -0
  145. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/chat/chat_status_modifications.py +0 -0
  146. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/chat/filter_parameters.py +0 -0
  147. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/chat/flow_link_state.py +0 -0
  148. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/chat/highlight.py +0 -0
  149. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/chat/preview.py +0 -0
  150. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/chat/quality_scoring.py +0 -0
  151. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/chat/scheduled_messages.py +0 -0
  152. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/chat/temporary_chat.py +0 -0
  153. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/chat/time_left.py +0 -0
  154. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/CRM/business_area.py +0 -0
  155. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/__init__.py +0 -0
  156. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/ai_agents_v2/ai_agent_message_draft.py +0 -0
  157. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/ai_agents_v2/chain_of_thought_in_chat.py +0 -0
  158. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/ai_agents_v2/chat_example.py +0 -0
  159. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/ai_agents_v2/chat_example_test.py +0 -0
  160. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/ai_agents_v2/chatty_ai_agent.py +0 -0
  161. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/ai_agents_v2/chatty_ai_agent_config_for_automation.py +0 -0
  162. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/ai_agents_v2/context_item.py +0 -0
  163. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/ai_agents_v2/faq.py +0 -0
  164. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/ai_agents_v2/follow_up_strategy.py +0 -0
  165. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/ai_agents_v2/knowleadge_base_components.py +0 -0
  166. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/ai_agents_v2/n8n_agents_info.py +0 -0
  167. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/ai_agents_v2/n8n_schema_incoming_message_output.json +0 -0
  168. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/ai_agents_v2/n8n_schema_smart_follow_up_output.json +0 -0
  169. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/ai_agents_v2/statuses.py +0 -0
  170. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/assignment/__init__.py +0 -0
  171. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/assignment/assignment_assets.py +0 -0
  172. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/chatty_fast_answers/__init__.py +0 -0
  173. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/chatty_fast_answers/chatty_fast_answer.py +0 -0
  174. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/contact_point.py +0 -0
  175. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/filter_criteria.py +0 -0
  176. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/flow.py +0 -0
  177. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/launch/__init__.py +0 -0
  178. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/launch/launch.py +0 -0
  179. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/launch/scheduled_communication.py +0 -0
  180. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/launch/subscription.py +0 -0
  181. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/media/__init__.py +0 -0
  182. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/media/file.py +0 -0
  183. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/product.py +0 -0
  184. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/tag.py +0 -0
  185. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/users/agent_chats_snapshot.py +0 -0
  186. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/users/user.py +0 -0
  187. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/users/user_asset_permission.py +0 -0
  188. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/assets/workflow_execution.py +0 -0
  189. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/company_chats_snapshot.py +0 -0
  190. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/company_messaging_settgins.py +0 -0
  191. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/conversation_topic.py +0 -0
  192. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/empresa.py +0 -0
  193. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/form_field.py +0 -0
  194. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/insight.py +0 -0
  195. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/integrations/shopify/shopify_product_sync_status.py +0 -0
  196. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/company/notifications/notification.py +0 -0
  197. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/copilot/links.py +0 -0
  198. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/data_base/__init__.py +0 -0
  199. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/execution/__init__.py +0 -0
  200. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/execution/execution.py +0 -0
  201. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/execution/executor.py +0 -0
  202. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/forms/company/auth0_company_registration_form.py +0 -0
  203. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/forms/company/meta_register.py +0 -0
  204. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/__init__.py +0 -0
  205. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/__init__.py +0 -0
  206. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/audio.py +0 -0
  207. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/base/__init__.py +0 -0
  208. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/base/chatty_message_json.py +0 -0
  209. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/base/message_base.py +0 -0
  210. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/base/message_draft.py +0 -0
  211. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/button.py +0 -0
  212. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/central_notification.py +0 -0
  213. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/contact.py +0 -0
  214. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/document.py +0 -0
  215. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/image.py +0 -0
  216. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/interactive.py +0 -0
  217. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/location.py +0 -0
  218. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/reaction.py +0 -0
  219. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/schema/__init__.py +0 -0
  220. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_audio.py +0 -0
  221. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_button.py +0 -0
  222. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_central.py +0 -0
  223. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_contacts.py +0 -0
  224. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_image.py +0 -0
  225. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_interactive.py +0 -0
  226. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_location.py +0 -0
  227. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_reaction.py +0 -0
  228. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_sticker.py +0 -0
  229. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_text.py +0 -0
  230. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_video.py +0 -0
  231. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/schema/chatty_context/__init__.py +0 -0
  232. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/schema/chatty_context/chatty_context.py +0 -0
  233. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/schema/chatty_referal/__init__.py +0 -0
  234. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/schema/chatty_referal/chatty_referal.py +0 -0
  235. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/sticker.py +0 -0
  236. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/text.py +0 -0
  237. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/chatty_messages/video.py +0 -0
  238. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/message_templates/__init__.py +0 -0
  239. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/message_templates/chatty_template_campaign.py +0 -0
  240. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/message_templates/filled_data_from_frontend.py +0 -0
  241. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/message_templates/payload_for_sending_template.py +0 -0
  242. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/message_templates/raw_meta_template.py +0 -0
  243. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/message_templates/recipient_of_template_campaign.py +0 -0
  244. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/message_templates/required_for_frontend_templates.py +0 -0
  245. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/meta_message_model/meta_base_notification_json.py +0 -0
  246. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/meta_message_model/meta_error_json.py +0 -0
  247. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/meta_message_model/meta_inexistent_json.py +0 -0
  248. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/meta_message_model/meta_message_json.py +0 -0
  249. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/meta_message_model/meta_status_json.py +0 -0
  250. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/meta_message_model/meta_unknown_json.py +0 -0
  251. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/meta_message_model/schema/content_messages/__init__.py +0 -0
  252. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/meta_message_model/schema/content_messages/button_content.py +0 -0
  253. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/meta_message_model/schema/content_messages/contacts_content.py +0 -0
  254. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/meta_message_model/schema/content_messages/interactive_content.py +0 -0
  255. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/meta_message_model/schema/content_messages/location_content.py +0 -0
  256. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/meta_message_model/schema/content_messages/multimedia_content.py +0 -0
  257. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/meta_message_model/schema/content_messages/order_content.py +0 -0
  258. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/meta_message_model/schema/content_messages/reaction_content.py +0 -0
  259. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/meta_message_model/schema/content_messages/system_content.py +0 -0
  260. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/meta_message_model/schema/content_messages/text_content.py +0 -0
  261. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/meta_message_model/schema/values/__init__.py +0 -0
  262. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/meta_message_model/schema/values/value_errors.py +0 -0
  263. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/meta_message_model/schema/values/value_messages.py +0 -0
  264. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/messages/meta_message_model/schema/values/value_statuses.py +0 -0
  265. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/utils/__init__.py +0 -0
  266. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/utils/custom_exceptions/__init__.py +0 -0
  267. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/utils/definitions.py +0 -0
  268. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/utils/types/CRUD_operations.py +0 -0
  269. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/utils/types/__init__.py +0 -0
  270. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/utils/types/channel_types.py +0 -0
  271. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/utils/types/chats_actions.py +0 -0
  272. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/utils/types/country.py +0 -0
  273. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/utils/types/deletion_type.py +0 -0
  274. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/utils/types/executor_types.py +0 -0
  275. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/utils/types/identifier.py +0 -0
  276. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/utils/types/message_status_types.py +0 -0
  277. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/utils/types/message_types.py +0 -0
  278. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/utils/types/phone_number.py +0 -0
  279. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/utils/types/serializer_type.py +0 -0
  280. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/utils/types/source_types.py +0 -0
  281. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/models/utils/types/typealiases.py +0 -0
  282. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/__init__.py +0 -0
  283. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/ai_agents/context_builder_v2.py +0 -0
  284. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/ai_agents/cot_follow_up_examples.py +0 -0
  285. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/ai_agents/followup_schema.json +0 -0
  286. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/ai_agents/smart_follow_up_service_v2.py +0 -0
  287. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/ai_agents/tool_descriptions/assign_chat_to_ai_agent_itself.json +0 -0
  288. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/ai_agents/tool_descriptions/human_handover.json +0 -0
  289. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/ai_agents/tool_descriptions.py +0 -0
  290. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/ai_components_service.py +0 -0
  291. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/chat/chat_extractors.py +0 -0
  292. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/chat/client_service.py +0 -0
  293. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/chat/conversation_topics_service.py +0 -0
  294. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/chatty_assets/documentation_diagram.png +0 -0
  295. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/chatty_assets/readme.md +0 -0
  296. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/concurrent/concurrent.py +0 -0
  297. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/contact_points/contact_point_service.py +0 -0
  298. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/__init__.py +0 -0
  299. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/analytics/contact_point_factory.py +0 -0
  300. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/analytics/smart_messages/topics_factory.py +0 -0
  301. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/analytics/sources/helpers.py +0 -0
  302. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/analytics/sources/source_factory.py +0 -0
  303. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/chats/chat_factory.py +0 -0
  304. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/chatty_fast_answers/__init__.py +0 -0
  305. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/chatty_fast_answers/chatty_fast_answers_factory.py +0 -0
  306. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/clients/client_factory.py +0 -0
  307. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/company/__init__.py +0 -0
  308. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/company/empresa_factory.py +0 -0
  309. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/messages/__init__.py +0 -0
  310. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/messages/central_notification_factory.py +0 -0
  311. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/messages/chatty_message_factory.py +0 -0
  312. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/messages/child_db_message_factory.py +0 -0
  313. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/messages/child_request_message.py +0 -0
  314. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/messages/from_template_hot_fix.py +0 -0
  315. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/messages/message_templates/template_factory.py +0 -0
  316. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/messages/message_templates/test.py +0 -0
  317. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/meta_notifications/__init__.py +0 -0
  318. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/meta_notifications/meta_notification_factory.py +0 -0
  319. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/factories/product_factory.py +0 -0
  320. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/filter_criteria_service.py +0 -0
  321. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/messages_helpers/__init__.py +0 -0
  322. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/scheduled_messages_service/scheduled_messages_helpers.py +0 -0
  323. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/template_campaigns/template_campaign_service.py +0 -0
  324. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/users/agent_service.py +0 -0
  325. {letschatty-0.4.341 → letschatty-0.4.342}/src/letschatty/services/users/user_factory.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: letschatty
3
- Version: 0.4.341
3
+ Version: 0.4.342
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.341" # Or whichever is your latest version
3
+ version = "0.4.342" # 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")
@@ -194,4 +195,30 @@ class ExpectedOutputIncomingMessage(BaseModel):
194
195
 
195
196
 
196
197
  class ExpectedOutputSmartFollowUp(BaseModel):
197
- action: Optional[str] = None
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,17 +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, ExpectedOutputSmartFollowUp, IncomingMessageAIDecision
9
- from ...models.company.assets.ai_agents_v2.ai_agents_decision_output import IncomingMessageDecisionAction
10
- from ...models.company.assets.ai_agents_v2.chatty_ai_agent_in_chat import HumanInterventionReason
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
11
11
 
12
12
  class SmartTaggingCallbackMetadata(BaseModel):
13
13
  chat_id: StrObjectId
14
14
  company_id: StrObjectId
15
+ trigger: ChainOfThoughtInChatTrigger
15
16
 
16
17
  class ComparisonAnalysisCallbackMetadata(BaseModel):
17
18
  test_case_id: StrObjectId
@@ -23,21 +24,8 @@ class InteractionCallbackMetadata(BaseModel):
23
24
  ai_agent_id: StrObjectId
24
25
  company_id: StrObjectId
25
26
  interaction_index: int
26
-
27
- class IncomingMessageCallbackMetadata(BaseModel):
28
- chat_id: StrObjectId
29
- company_id: StrObjectId
30
- ai_agent_id: StrObjectId
31
- cot_id: StrObjectId
32
- trigger: str
33
- # Trigger info is in: incoming_message_ids for user_message,
34
- # triggered_by_user_id for manual_trigger, smart_follow_up_id for follow_up
35
- triggered_by_user_id: Optional[StrObjectId] = None
36
-
37
- class IncomingMessageCallbackEvent(LambdaAiEvent):
38
- type: InvokationType = InvokationType.INCOMING_MESSAGE_CALLBACK
39
- data: IncomingMessageAIDecision
40
- callback_metadata: IncomingMessageCallbackMetadata
27
+ trigger: ChainOfThoughtInChatTrigger
28
+ chain_of_thought_id: StrObjectId
41
29
 
42
30
  class QualityTestCallbackEvent(LambdaAiEvent):
43
31
  type: InvokationType = InvokationType.SINGLE_QUALITY_TEST_CALLBACK
@@ -55,6 +43,50 @@ class QualityTestInteractionCallbackEvent(LambdaAiEvent):
55
43
  data["data"]["chain_of_thought"]["chatty_ai_agent_id"] = data["callback_metadata"]["ai_agent_id"]
56
44
  return data
57
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
+
58
90
  class SmartTaggingCallbackEvent(LambdaAiEvent):
59
91
  type: InvokationType = InvokationType.SMART_TAGGING_CALLBACK
60
92
  data: ExpectedOutputSmartTag
@@ -149,11 +181,9 @@ class DoubleCheckerCallbackMetadata(BaseModel):
149
181
  company_id: StrObjectId
150
182
  ai_agent_id: StrObjectId
151
183
  incoming_messages_ids: List[str]
152
- # Trigger info
153
- trigger: str
154
- # Trigger info is in: incoming_messages_ids for user_message,
155
- # triggered_by_user_id for manual_trigger, smart_follow_up_id for follow_up
156
- triggered_by_user_id: Optional[StrObjectId] = None
184
+ trigger: ChainOfThoughtInChatTrigger
185
+ chain_of_thought_id: StrObjectId
186
+
157
187
 
158
188
  class DoubleCheckerForIncomingMessagesAnswerEvent(LambdaAiEvent):
159
189
  type: InvokationType = InvokationType.DOUBLE_CHECKER_FOR_INCOMING_MESSAGES_ANSWER
@@ -161,13 +191,73 @@ class DoubleCheckerForIncomingMessagesAnswerEvent(LambdaAiEvent):
161
191
 
162
192
  class DoubleCheckerForIncomingMessagesAnswerCallbackEvent(LambdaAiEvent):
163
193
  type: InvokationType = InvokationType.DOUBLE_CHECKER_FOR_INCOMING_MESSAGES_ANSWER_CALLBACK
164
- data: DoubleCheckerForIncomingMessagesAnswerData
194
+ data: ExpectedOutputIncomingMessage
165
195
  callback_metadata: DoubleCheckerCallbackMetadata
166
196
 
167
- 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"""
168
246
  chat_id: StrObjectId
169
247
  company_id: StrObjectId
170
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
171
261
 
172
262
 
173
263
  # New AI Agent Context Building Events (for new architecture)
@@ -202,7 +292,7 @@ class GetChatWithPromptForFollowUpEventData(BaseModel):
202
292
  """Data for get chat with prompt for follow-up event"""
203
293
  chat_id: StrObjectId
204
294
  company_id: StrObjectId
205
- smart_follow_up_id: StrObjectId
295
+ smart_follow_up_id: Optional[StrObjectId] = Field(default=None, description="Smart follow-up ID")
206
296
  # Trigger information
207
297
  trigger: ChainOfThoughtInChatTrigger
208
298
  # trigger_id is derived from: smart_follow_up_id
@@ -322,7 +412,8 @@ class EscalateAIAgentInChatEventData(BaseModel):
322
412
  """Data for escalating an AI agent (requiring human intervention)"""
323
413
  chat_id: StrObjectId
324
414
  company_id: StrObjectId
325
- 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")
326
417
 
327
418
 
328
419
  class EscalateAIAgentInChatEvent(LambdaAiEvent):
@@ -354,6 +445,24 @@ class UnescalateAIAgentInChatEvent(LambdaAiEvent):
354
445
  data: UnescalateAIAgentInChatEventData
355
446
 
356
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
357
466
  # Launch Events
358
467
 
359
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)
@@ -4,7 +4,7 @@ from .chat_based_events.business_area import ChatBusinessAreaEvent, BusinessArea
4
4
  from .chat_based_events.workflow import WorkflowEvent, WorkflowEventData
5
5
  from .chat_based_events.chat_status import ChatStatusEvent, ChatStatusEventData, ChatStatusModification, ChatCreatedFrom
6
6
  from .chat_based_events.chat_funnel import ChatFunnelEvent, FunnelEventData
7
- from ...company.CRM.funnel import ChatFunnel, StageTransition, ActiveFunnel
7
+ from ...company.CRM.funnel import ClientFunnel, StageTransition
8
8
  from .company_based_events.user_events import UserEvent, UserEventData
9
9
  from .chat_based_events.quality_scoring import QualityScoringEvent
10
10
  from .chat_based_events.message import MessageEvent, MessageData
@@ -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
+ }
@@ -0,0 +1,40 @@
1
+ from typing import ClassVar, Optional
2
+ from pydantic import Field, field_validator, ValidationInfo
3
+ from ..base import Event
4
+ from ..event_types import EventType
5
+ from .chat_based_event import CustomerEventData
6
+ from ....utils.types.identifier import StrObjectId
7
+ from ....company.CRM.funnel import ClientFunnel, StageTransition
8
+ import json
9
+
10
+ class FunnelEventData(CustomerEventData):
11
+ funnel_id: StrObjectId
12
+ funnel_stage_transition: StageTransition
13
+ time_in_funnel_seconds: Optional[int] = None
14
+
15
+ class ChatFunnelEvent(Event):
16
+ """Event for tracking chat funnel stage transitions"""
17
+ data: FunnelEventData
18
+
19
+ # Define valid event types for this event class
20
+ VALID_TYPES: ClassVar[set] = {
21
+ EventType.CHAT_FUNNEL_UPDATED,
22
+ EventType.CHAT_FUNNEL_STARTED,
23
+ EventType.CHAT_FUNNEL_COMPLETED,
24
+ EventType.CHAT_FUNNEL_ABANDONED
25
+ }
26
+
27
+
28
+ @field_validator('data')
29
+ def validate_data_fields(cls, v: FunnelEventData, info: ValidationInfo):
30
+ """Validate that appropriate fields are set based on event type"""
31
+ if info.data.get('type') == EventType.CHAT_FUNNEL_UPDATED and v.time_in_funnel_seconds is None:
32
+ raise ValueError("time_in_funnel_seconds must be set for CHAT_FUNNEL_UPDATED events")
33
+ if info.data.get('type') == EventType.CHAT_FUNNEL_UPDATED and v.funnel_stage_transition.time_in_previous_stage_seconds is None:
34
+ raise ValueError("time_in_previous_stage_seconds must be set for CHAT_FUNNEL_UPDATED events")
35
+ return v
36
+
37
+ def model_dump_json(self, *args, **kwargs):
38
+ dump = json.loads(super().model_dump_json(*args, **kwargs))
39
+ dump['data'] = self.data.model_dump_json()
40
+ return dump
@@ -58,9 +58,6 @@ class AssetEvent(Event):
58
58
  EventType.FUNNEL_STAGE_CREATED,
59
59
  EventType.FUNNEL_STAGE_UPDATED,
60
60
  EventType.FUNNEL_STAGE_DELETED,
61
- EventType.FUNNEL_MEMBER_ADDED,
62
- EventType.FUNNEL_MEMBER_UPDATED,
63
- EventType.FUNNEL_MEMBER_REMOVED,
64
61
  EventType.WORKFLOW_CREATED,
65
62
  EventType.WORKFLOW_UPDATED,
66
63
  EventType.WORKFLOW_DELETED,
@@ -73,9 +70,6 @@ class AssetEvent(Event):
73
70
  EventType.FILTER_CRITERIA_CREATED,
74
71
  EventType.FILTER_CRITERIA_UPDATED,
75
72
  EventType.FILTER_CRITERIA_DELETED,
76
- EventType.FORM_FIELD_CREATED,
77
- EventType.FORM_FIELD_UPDATED,
78
- EventType.FORM_FIELD_DELETED,
79
73
  EventType.COMPANY_CREATED,
80
74
  EventType.COMPANY_UPDATED,
81
75
  EventType.COMPANY_DELETED
@@ -83,9 +77,8 @@ class AssetEvent(Event):
83
77
 
84
78
  @model_validator(mode='after')
85
79
  def validate_data_fields(self):
86
- # Asset is not required for deleted/removed events
87
- if "deleted" not in self.type.value and "removed" not in self.type.value and not self.data.asset:
88
- raise ValueError("asset must be set for all events except DELETED/REMOVED")
80
+ if "deleted" not in self.type.value and not self.data.asset:
81
+ raise ValueError("asset must be set for all events except DELETED")
89
82
  return self
90
83
 
91
84
  def model_dump_json(self, *args, **kwargs):
@@ -41,9 +41,10 @@ EVENT_TO_TYPE_CLASSES = {
41
41
  #CONTINUOUS CONVERSATION
42
42
  EventType.CONTINUOUS_CONVERSATION_CREATED : ContinuousConversationEvent,
43
43
  EventType.CONTINUOUS_CONVERSATION_UPDATED : ContinuousConversationEvent,
44
- #CHAT FUNNEL EVENTS
44
+ #FUNNEL STAGES
45
+ # Funnel-level events
45
46
  EventType.CHAT_FUNNEL_STARTED : ChatFunnelEvent,
46
- EventType.CHAT_FUNNEL_STAGE_CHANGED : ChatFunnelEvent,
47
+ EventType.CHAT_FUNNEL_UPDATED : ChatFunnelEvent,
47
48
  EventType.CHAT_FUNNEL_COMPLETED : ChatFunnelEvent,
48
49
  EventType.CHAT_FUNNEL_ABANDONED : ChatFunnelEvent,
49
50
 
@@ -85,10 +86,6 @@ EVENT_TO_TYPE_CLASSES = {
85
86
  EventType.WORKFLOW_CREATED : AssetEvent,
86
87
  EventType.WORKFLOW_UPDATED : AssetEvent,
87
88
  EventType.WORKFLOW_DELETED : AssetEvent,
88
- #FORM FIELDS
89
- EventType.FORM_FIELD_CREATED : AssetEvent,
90
- EventType.FORM_FIELD_UPDATED : AssetEvent,
91
- EventType.FORM_FIELD_DELETED : AssetEvent,
92
89
  #AGENTS
93
90
  EventType.USER_CREATED : UserEvent,
94
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"
@@ -42,9 +87,10 @@ class EventType(StrEnum):
42
87
  #CONTINUOUS CONVERSATION
43
88
  CONTINUOUS_CONVERSATION_CREATED = "chat.continuous_conversation.created"
44
89
  CONTINUOUS_CONVERSATION_UPDATED = "chat.continuous_conversation.updated"
45
- #CHAT FUNNEL EVENTS
46
- CHAT_FUNNEL_STARTED = "chat.funnel.started"
47
- CHAT_FUNNEL_STAGE_CHANGED = "chat.funnel.stage_changed"
90
+ #FUNNEL STAGES
91
+ # Funnel-level events
92
+ CHAT_FUNNEL_STARTED = "chat.funnel.started" # New
93
+ CHAT_FUNNEL_UPDATED = "chat.funnel.updated"
48
94
  CHAT_FUNNEL_COMPLETED = "chat.funnel.completed"
49
95
  CHAT_FUNNEL_ABANDONED = "chat.funnel.abandoned"
50
96
 
@@ -83,18 +129,13 @@ class EventType(StrEnum):
83
129
  FAST_ANSWER_CREATED = "company.fast_answer.created"
84
130
  FAST_ANSWER_UPDATED = "company.fast_answer.updated"
85
131
  FAST_ANSWER_DELETED = "company.fast_answer.deleted"
86
- #FUNNELS
132
+ #FUNNEL STAGES
87
133
  FUNNEL_CREATED = "company.funnel.created"
88
134
  FUNNEL_UPDATED = "company.funnel.updated"
89
135
  FUNNEL_DELETED = "company.funnel.deleted"
90
- #FUNNEL STAGES
91
136
  FUNNEL_STAGE_CREATED = "company.funnel_stage.created"
92
137
  FUNNEL_STAGE_UPDATED = "company.funnel_stage.updated"
93
138
  FUNNEL_STAGE_DELETED = "company.funnel_stage.deleted"
94
- #FUNNEL MEMBERS
95
- FUNNEL_MEMBER_ADDED = "company.funnel_member.added"
96
- FUNNEL_MEMBER_UPDATED = "company.funnel_member.updated"
97
- FUNNEL_MEMBER_REMOVED = "company.funnel_member.removed"
98
139
  #BUSINESS AREA
99
140
  BUSINESS_AREA_CREATED = "company.business_area.created"
100
141
  BUSINESS_AREA_UPDATED = "company.business_area.updated"
@@ -19,7 +19,6 @@ from ..utils.custom_exceptions.custom_exceptions import MissingAIAgentForSmartFo
19
19
  from .time_left import TimeLeft
20
20
  from ..company.conversation_topic import TopicTimelineEntry
21
21
  from ..company.form_field import CollectedData
22
- from ..company.CRM.funnel import ActiveFunnel
23
22
  import json
24
23
  import logging
25
24
  logger = logging.getLogger(__name__)
@@ -48,7 +47,6 @@ class Chat(CompanyAssetModel):
48
47
  chatty_ai_agent: Optional[ChattyAIAgentAssignedToChat] = Field(default=None, description="The id of the chatty ai agent that might or might not be assigned to the chat")
49
48
  suggested_messages: List[MessageDraft] = Field(default_factory=list)
50
49
  topics_timeline: List[TopicTimelineEntry] = Field(default_factory=list, description="Timeline of conversation topics throughout the conversation")
51
- active_funnel: Optional[ActiveFunnel] = Field(default=None, description="Current active funnel for this chat")
52
50
  model_config = ConfigDict(extra="ignore")
53
51
 
54
52
  @property
@@ -269,17 +267,7 @@ class Chat(CompanyAssetModel):
269
267
  @property
270
268
  def bought_product_ids(self) -> List[StrObjectId]:
271
269
  """Get all sale ids in the chat"""
272
- product_ids: List[StrObjectId] = []
273
- for sale in self.sales:
274
- sale_product_ids = getattr(sale, "product_ids", None)
275
- if sale_product_ids:
276
- for product_id in sale_product_ids:
277
- if product_id not in product_ids:
278
- product_ids.append(product_id)
279
- elif sale.product_id:
280
- if sale.product_id not in product_ids:
281
- product_ids.append(sale.product_id)
282
- return product_ids
270
+ return [sale.product_id for sale in self.sales]
283
271
 
284
272
  @property
285
273
  def products(self) -> List[AssignedAssetToChat]:
@@ -376,3 +364,4 @@ class Chat(CompanyAssetModel):
376
364
  dump["last_message"] = self.last_message.model_dump_json(serializer=SerializerType.DATABASE) if self.last_message else None
377
365
  dump["flow_states"] = [flow_state.model_dump_json(serializer=SerializerType.DATABASE) for flow_state in self.flow_states]
378
366
  return dump
367
+