letschatty 0.4.322__tar.gz → 0.4.348__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 (284) hide show
  1. {letschatty-0.4.322 → letschatty-0.4.348}/PKG-INFO +1 -1
  2. {letschatty-0.4.322 → letschatty-0.4.348}/pyproject.toml +1 -1
  3. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/ai_microservices/expected_output.py +8 -0
  4. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/ai_microservices/lambda_events.py +24 -5
  5. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/__init__.py +2 -1
  6. letschatty-0.4.348/src/letschatty/models/analytics/events/chat_based_events/chat_client.py +19 -0
  7. letschatty-0.4.348/src/letschatty/models/analytics/events/chat_based_events/chat_funnel.py +96 -0
  8. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/company_based_events/asset_events.py +9 -2
  9. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/event_type_to_classes.py +7 -3
  10. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/event_types.py +11 -5
  11. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/chat/chat.py +13 -2
  12. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/chat/chat_with_assets.py +6 -1
  13. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/chat/client.py +0 -2
  14. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/chat/continuous_conversation.py +1 -1
  15. letschatty-0.4.348/src/letschatty/models/company/CRM/funnel.py +401 -0
  16. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/__init__.py +2 -1
  17. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/ai_agents_v2/chain_of_thought_in_chat.py +5 -3
  18. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/ai_agents_v2/chatty_ai_agent.py +7 -1
  19. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/ai_agents_v2/chatty_ai_agent_in_chat.py +2 -34
  20. letschatty-0.4.348/src/letschatty/models/company/assets/ai_agents_v2/statuses.py +33 -0
  21. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/automation.py +10 -1
  22. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/chat_assets.py +12 -2
  23. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/company_assets.py +2 -0
  24. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/sale.py +3 -3
  25. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/form_field.py +9 -2
  26. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_document.py +4 -2
  27. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_media.py +4 -3
  28. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/utils/custom_exceptions/custom_exceptions.py +24 -0
  29. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/chat/chat_service.py +55 -12
  30. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/analytics/events_factory.py +29 -3
  31. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/validators/analytics_validator.py +11 -0
  32. letschatty-0.4.322/src/letschatty/models/analytics/events/chat_based_events/chat_funnel.py +0 -40
  33. letschatty-0.4.322/src/letschatty/models/company/CRM/funnel.py +0 -69
  34. {letschatty-0.4.322 → letschatty-0.4.348}/LICENSE +0 -0
  35. {letschatty-0.4.322 → letschatty-0.4.348}/README.md +0 -0
  36. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/__init__.py +0 -0
  37. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/__init__.py +0 -0
  38. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/ai_microservices/__init__.py +0 -0
  39. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/ai_microservices/lambda_invokation_types.py +0 -0
  40. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/ai_microservices/n8n_ai_agents_payload.py +0 -0
  41. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/ai_microservices/openai_payloads.py +0 -0
  42. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/__init__.py +0 -0
  43. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/base.py +0 -0
  44. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/chat_based_events/ai_agent_chat.py +0 -0
  45. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/chat_based_events/business_area.py +0 -0
  46. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/chat_based_events/chat_based_event.py +0 -0
  47. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/chat_based_events/chat_context.py +0 -0
  48. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/chat_based_events/chat_status.py +0 -0
  49. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/chat_based_events/contact_point.py +0 -0
  50. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/chat_based_events/continuous_conversation.py +0 -0
  51. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/chat_based_events/highlight.py +0 -0
  52. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/chat_based_events/message.py +0 -0
  53. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/chat_based_events/messages_intent_context.py +0 -0
  54. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/chat_based_events/product_chat.py +0 -0
  55. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/chat_based_events/quality_scoring.py +0 -0
  56. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/chat_based_events/sale.py +0 -0
  57. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/chat_based_events/tag_chat.py +0 -0
  58. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/chat_based_events/workflow.py +0 -0
  59. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/company_based_events/company_events.py +0 -0
  60. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/events/company_based_events/user_events.py +0 -0
  61. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/metrics/__init_.py +0 -0
  62. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/metrics/daily_contact_points.py +0 -0
  63. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/metrics/daily_new_chats.py +0 -0
  64. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/metrics/daily_sent_templates_grouped.py +0 -0
  65. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/metrics/sales_roadmap.py +0 -0
  66. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/metrics/sent_templates.py +0 -0
  67. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/smart_messages/friendly_code_for_source.py +0 -0
  68. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/smart_messages/topic.py +0 -0
  69. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/smart_messages/topic_message.py +0 -0
  70. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/sources/__init__.py +0 -0
  71. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/sources/google_ad_utm_source.py +0 -0
  72. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/sources/helpers.py +0 -0
  73. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/sources/other_source.py +0 -0
  74. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/sources/pure_ad.py +0 -0
  75. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/sources/pure_ad_utm_source.py +0 -0
  76. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/sources/source_base.py +0 -0
  77. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/sources/template_source.py +0 -0
  78. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/sources/topic_default_source.py +0 -0
  79. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/sources/utm_source.py +0 -0
  80. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/sources/utms/referer_info.py +0 -0
  81. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/sources/utms/utm_query_params.py +0 -0
  82. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/analytics/sources/whatsapp_default_source.py +0 -0
  83. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/auth/jwt.py +0 -0
  84. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/base_models/__init__.py +0 -0
  85. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/base_models/ai_agent_component.py +0 -0
  86. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/base_models/chatty_asset_model.py +0 -0
  87. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/base_models/helpers.py +0 -0
  88. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/base_models/related_asset_usage_example.py +0 -0
  89. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/base_models/singleton.py +0 -0
  90. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/base_models/update_model_interface.py +0 -0
  91. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/base_models/validate_timestamps_and_id.py +0 -0
  92. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/channels/channel.py +0 -0
  93. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/chat/assets_assigned_to_chat.py +0 -0
  94. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/chat/chat_status_modifications.py +0 -0
  95. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/chat/filter_parameters.py +0 -0
  96. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/chat/flow_link_state.py +0 -0
  97. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/chat/highlight.py +0 -0
  98. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/chat/preview.py +0 -0
  99. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/chat/quality_scoring.py +0 -0
  100. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/chat/scheduled_messages.py +0 -0
  101. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/chat/temporary_chat.py +0 -0
  102. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/chat/time_left.py +0 -0
  103. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/CRM/business_area.py +0 -0
  104. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/__init__.py +0 -0
  105. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/ai_agents_v2/ai_agent_message_draft.py +0 -0
  106. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/ai_agents_v2/ai_agents_decision_output.py +0 -0
  107. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/ai_agents_v2/chat_example.py +0 -0
  108. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/ai_agents_v2/chat_example_test.py +0 -0
  109. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/ai_agents_v2/chatty_ai_agent_config_for_automation.py +0 -0
  110. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/ai_agents_v2/chatty_ai_mode.py +0 -0
  111. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/ai_agents_v2/context_item.py +0 -0
  112. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/ai_agents_v2/faq.py +0 -0
  113. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/ai_agents_v2/follow_up_strategy.py +0 -0
  114. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/ai_agents_v2/get_chat_with_prompt_response.py +0 -0
  115. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/ai_agents_v2/knowleadge_base_components.py +0 -0
  116. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/ai_agents_v2/n8n_agents_info.py +0 -0
  117. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/ai_agents_v2/n8n_schema_incoming_message_output.json +0 -0
  118. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/ai_agents_v2/n8n_schema_smart_follow_up_output.json +0 -0
  119. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/ai_agents_v2/pre_qualify_config.py +0 -0
  120. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/assignment/__init__.py +0 -0
  121. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/assignment/assignment_assets.py +0 -0
  122. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/chatty_fast_answers/__init__.py +0 -0
  123. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/chatty_fast_answers/chatty_fast_answer.py +0 -0
  124. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/contact_point.py +0 -0
  125. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/filter_criteria.py +0 -0
  126. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/flow.py +0 -0
  127. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/launch/__init__.py +0 -0
  128. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/launch/launch.py +0 -0
  129. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/launch/scheduled_communication.py +0 -0
  130. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/launch/subscription.py +0 -0
  131. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/media/__init__.py +0 -0
  132. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/media/file.py +0 -0
  133. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/product.py +0 -0
  134. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/tag.py +0 -0
  135. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/users/agent_chats_snapshot.py +0 -0
  136. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/users/user.py +0 -0
  137. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/users/user_asset_permission.py +0 -0
  138. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/assets/workflow_execution.py +0 -0
  139. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/company_chats_snapshot.py +0 -0
  140. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/company_messaging_settgins.py +0 -0
  141. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/conversation_topic.py +0 -0
  142. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/empresa.py +0 -0
  143. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/insight.py +0 -0
  144. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/company/notifications/notification.py +0 -0
  145. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/copilot/links.py +0 -0
  146. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/data_base/__init__.py +0 -0
  147. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/data_base/collection_interface.py +0 -0
  148. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/data_base/mongo_connection.py +0 -0
  149. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/execution/__init__.py +0 -0
  150. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/execution/execution.py +0 -0
  151. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/execution/executor.py +0 -0
  152. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/forms/company/auth0_company_registration_form.py +0 -0
  153. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/forms/company/meta_register.py +0 -0
  154. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/__init__.py +0 -0
  155. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/__init__.py +0 -0
  156. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/audio.py +0 -0
  157. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/base/__init__.py +0 -0
  158. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/base/chatty_message_json.py +0 -0
  159. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/base/message_base.py +0 -0
  160. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/base/message_draft.py +0 -0
  161. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/button.py +0 -0
  162. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/central_notification.py +0 -0
  163. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/contact.py +0 -0
  164. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/document.py +0 -0
  165. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/image.py +0 -0
  166. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/interactive.py +0 -0
  167. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/location.py +0 -0
  168. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/reaction.py +0 -0
  169. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/schema/__init__.py +0 -0
  170. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_audio.py +0 -0
  171. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_button.py +0 -0
  172. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_central.py +0 -0
  173. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_contacts.py +0 -0
  174. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_image.py +0 -0
  175. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_interactive.py +0 -0
  176. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_location.py +0 -0
  177. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_reaction.py +0 -0
  178. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_sticker.py +0 -0
  179. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_text.py +0 -0
  180. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_video.py +0 -0
  181. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/schema/chatty_context/__init__.py +0 -0
  182. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/schema/chatty_context/chatty_context.py +0 -0
  183. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/schema/chatty_referal/__init__.py +0 -0
  184. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/schema/chatty_referal/chatty_referal.py +0 -0
  185. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/sticker.py +0 -0
  186. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/text.py +0 -0
  187. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/chatty_messages/video.py +0 -0
  188. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/message_templates/__init__.py +0 -0
  189. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/message_templates/chatty_template_campaign.py +0 -0
  190. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/message_templates/filled_data_from_frontend.py +0 -0
  191. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/message_templates/payload_for_sending_template.py +0 -0
  192. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/message_templates/raw_meta_template.py +0 -0
  193. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/message_templates/recipient_of_template_campaign.py +0 -0
  194. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/message_templates/required_for_frontend_templates.py +0 -0
  195. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/meta_message_model/meta_base_notification_json.py +0 -0
  196. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/meta_message_model/meta_error_json.py +0 -0
  197. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/meta_message_model/meta_inexistent_json.py +0 -0
  198. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/meta_message_model/meta_message_json.py +0 -0
  199. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/meta_message_model/meta_status_json.py +0 -0
  200. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/meta_message_model/meta_unknown_json.py +0 -0
  201. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/meta_message_model/schema/content_messages/__init__.py +0 -0
  202. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/meta_message_model/schema/content_messages/button_content.py +0 -0
  203. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/meta_message_model/schema/content_messages/contacts_content.py +0 -0
  204. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/meta_message_model/schema/content_messages/interactive_content.py +0 -0
  205. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/meta_message_model/schema/content_messages/location_content.py +0 -0
  206. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/meta_message_model/schema/content_messages/multimedia_content.py +0 -0
  207. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/meta_message_model/schema/content_messages/order_content.py +0 -0
  208. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/meta_message_model/schema/content_messages/reaction_content.py +0 -0
  209. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/meta_message_model/schema/content_messages/system_content.py +0 -0
  210. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/meta_message_model/schema/content_messages/text_content.py +0 -0
  211. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/meta_message_model/schema/values/__init__.py +0 -0
  212. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/meta_message_model/schema/values/value_errors.py +0 -0
  213. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/meta_message_model/schema/values/value_messages.py +0 -0
  214. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/messages/meta_message_model/schema/values/value_statuses.py +0 -0
  215. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/utils/__init__.py +0 -0
  216. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/utils/custom_exceptions/__init__.py +0 -0
  217. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/utils/definitions.py +0 -0
  218. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/utils/types/CRUD_operations.py +0 -0
  219. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/utils/types/__init__.py +0 -0
  220. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/utils/types/channel_types.py +0 -0
  221. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/utils/types/chats_actions.py +0 -0
  222. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/utils/types/country.py +0 -0
  223. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/utils/types/deletion_type.py +0 -0
  224. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/utils/types/executor_types.py +0 -0
  225. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/utils/types/identifier.py +0 -0
  226. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/utils/types/message_status_types.py +0 -0
  227. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/utils/types/message_types.py +0 -0
  228. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/utils/types/phone_number.py +0 -0
  229. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/utils/types/serializer_type.py +0 -0
  230. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/utils/types/source_types.py +0 -0
  231. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/models/utils/types/typealiases.py +0 -0
  232. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/__init__.py +0 -0
  233. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/ai_agents/context_builder_v2.py +0 -0
  234. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/ai_agents/cot_follow_up_examples.py +0 -0
  235. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/ai_agents/followup_schema.json +0 -0
  236. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/ai_agents/smart_follow_up_context_builder_v2.py +0 -0
  237. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/ai_agents/smart_follow_up_service_v2.py +0 -0
  238. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/ai_agents/tool_descriptions/assign_chat_to_ai_agent_itself.json +0 -0
  239. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/ai_agents/tool_descriptions/human_handover.json +0 -0
  240. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/ai_agents/tool_descriptions.py +0 -0
  241. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/ai_components_service.py +0 -0
  242. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/chat/chat_extractors.py +0 -0
  243. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/chat/client_service.py +0 -0
  244. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/chat/conversation_topics_service.py +0 -0
  245. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/chatty_assets/__init__.py +0 -0
  246. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/chatty_assets/asset_service.py +0 -0
  247. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/chatty_assets/base_container.py +0 -0
  248. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/chatty_assets/base_container_with_collection.py +0 -0
  249. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/chatty_assets/documentation_diagram.png +0 -0
  250. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/chatty_assets/readme.md +0 -0
  251. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/concurrent/concurrent.py +0 -0
  252. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/contact_points/contact_point_service.py +0 -0
  253. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/continuous_conversation_service/continuous_conversation_helper.py +0 -0
  254. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/events/events_manager.py +0 -0
  255. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/__init__.py +0 -0
  256. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/analytics/contact_point_factory.py +0 -0
  257. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/analytics/smart_messages/topics_factory.py +0 -0
  258. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/analytics/sources/helpers.py +0 -0
  259. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/analytics/sources/source_factory.py +0 -0
  260. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/chats/chat_factory.py +0 -0
  261. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/chatty_fast_answers/__init__.py +0 -0
  262. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/chatty_fast_answers/chatty_fast_answers_factory.py +0 -0
  263. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/clients/client_factory.py +0 -0
  264. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/company/__init__.py +0 -0
  265. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/company/empresa_factory.py +0 -0
  266. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/lambda_ai_orchestrartor/lambda_events_factory.py +0 -0
  267. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/messages/__init__.py +0 -0
  268. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/messages/central_notification_factory.py +0 -0
  269. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/messages/chatty_message_factory.py +0 -0
  270. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/messages/child_db_message_factory.py +0 -0
  271. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/messages/child_request_message.py +0 -0
  272. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/messages/from_template_hot_fix.py +0 -0
  273. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/messages/message_templates/template_factory.py +0 -0
  274. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/messages/message_templates/test.py +0 -0
  275. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/meta_notifications/__init__.py +0 -0
  276. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/meta_notifications/meta_notification_factory.py +0 -0
  277. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/factories/product_factory.py +0 -0
  278. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/filter_criteria_service.py +0 -0
  279. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/messages_helpers/__init__.py +0 -0
  280. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/messages_helpers/get_caption_or_body_or_preview.py +0 -0
  281. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/scheduled_messages_service/scheduled_messages_helpers.py +0 -0
  282. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/template_campaigns/template_campaign_service.py +0 -0
  283. {letschatty-0.4.322 → letschatty-0.4.348}/src/letschatty/services/users/agent_service.py +0 -0
  284. {letschatty-0.4.322 → letschatty-0.4.348}/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.322
3
+ Version: 0.4.348
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.322" # Or whichever is your latest version
3
+ version = "0.4.348" # 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"
@@ -169,6 +169,12 @@ class ExpectedOutputIncomingMessage(BaseModel):
169
169
  action: IncomingMessageDecisionAction
170
170
  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
171
  chain_of_thought: ChainOfThoughtInChatRequest = Field(description="REQUIRED: Your reasoning process and response decision explanation")
172
+ confidence: Optional[int] = Field(
173
+ default=None,
174
+ ge=0,
175
+ le=100,
176
+ description="Confidence level 0-100"
177
+ )
172
178
 
173
179
  def to_incoming_message_decision_output(self) -> IncomingMessageAIDecision:
174
180
  messages_drafts = [
@@ -187,3 +193,5 @@ class ExpectedOutputIncomingMessage(BaseModel):
187
193
  return incoming_decision
188
194
 
189
195
 
196
+ class ExpectedOutputSmartFollowUp(BaseModel):
197
+ action: Optional[str] = None
@@ -5,8 +5,9 @@ from typing import Dict, Any, List, Optional
5
5
  from letschatty.models.base_models.ai_agent_component import AiAgentComponentType
6
6
  from letschatty.models.utils.types.identifier import StrObjectId
7
7
  from .lambda_invokation_types import InvokationType, LambdaAiEvent
8
- from .expected_output import ExpectedOutputIncomingMessage, ExpectedOutputSmartTag, ExpectedOutputQualityTest, IncomingMessageAIDecision
8
+ from .expected_output import ExpectedOutputIncomingMessage, ExpectedOutputSmartTag, ExpectedOutputQualityTest, ExpectedOutputSmartFollowUp, IncomingMessageAIDecision
9
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
10
11
 
11
12
  class SmartTaggingCallbackMetadata(BaseModel):
12
13
  chat_id: StrObjectId
@@ -60,10 +61,23 @@ class SmartTaggingCallbackEvent(LambdaAiEvent):
60
61
  callback_metadata: SmartTaggingCallbackMetadata
61
62
 
62
63
  @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
64
+ def normalize_data(cls, values):
65
+ if not isinstance(values, dict):
66
+ return values
67
+
68
+ data = values.get("data")
69
+ if isinstance(data, str):
70
+ import json
71
+ try:
72
+ data = json.loads(data)
73
+ values["data"] = data
74
+ except (json.JSONDecodeError, TypeError):
75
+ return values
76
+
77
+ if isinstance(data, dict) and "chain_of_thought" in data:
78
+ data["chain_of_thought"]["chatty_ai_agent_id"] = "000000000000000000000000"
79
+
80
+ return values
67
81
 
68
82
  class ChatData(BaseModel):
69
83
  chat_id: StrObjectId
@@ -77,6 +91,11 @@ class FollowUpEvent(LambdaAiEvent):
77
91
  type: InvokationType = InvokationType.FOLLOW_UP
78
92
  data: ChatData
79
93
 
94
+
95
+ class SmartFollowUpDecisionOutputEvent(LambdaAiEvent):
96
+ type: InvokationType = InvokationType.FOLLOW_UP
97
+ data: ExpectedOutputSmartFollowUp
98
+
80
99
  class QualityTestEventData(BaseModel):
81
100
  chat_example_id: StrObjectId
82
101
  company_id: StrObjectId
@@ -3,8 +3,9 @@ from .chat_based_events.contact_point import ContactPointEvent, ContactPointData
3
3
  from .chat_based_events.business_area import ChatBusinessAreaEvent, BusinessAreaData
4
4
  from .chat_based_events.workflow import WorkflowEvent, WorkflowEventData
5
5
  from .chat_based_events.chat_status import ChatStatusEvent, ChatStatusEventData, ChatStatusModification, ChatCreatedFrom
6
+ from .chat_based_events.chat_client import ChatClientEvent
6
7
  from .chat_based_events.chat_funnel import ChatFunnelEvent, FunnelEventData
7
- from ...company.CRM.funnel import ClientFunnel, StageTransition
8
+ from ...company.CRM.funnel import ChatFunnel, StageTransition, ActiveFunnel
8
9
  from .company_based_events.user_events import UserEvent, UserEventData
9
10
  from .chat_based_events.quality_scoring import QualityScoringEvent
10
11
  from .chat_based_events.message import MessageEvent, MessageData
@@ -0,0 +1,19 @@
1
+ from ..base import Event
2
+ from ..event_types import EventType
3
+ from .chat_based_event import CustomerEventData
4
+ from typing import ClassVar
5
+ import json
6
+
7
+
8
+ class ChatClientEvent(Event):
9
+ """Emitted when the client (contact/customer) data on a chat is updated."""
10
+ data: CustomerEventData
11
+
12
+ VALID_TYPES: ClassVar[set] = {
13
+ EventType.CHAT_CLIENT_UPDATED,
14
+ }
15
+
16
+ def model_dump_json(self, *args, **kwargs):
17
+ dump = json.loads(super().model_dump_json(*args, **kwargs))
18
+ dump['data'] = self.data.model_dump_json()
19
+ return dump
@@ -0,0 +1,96 @@
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 StageTransition
8
+ import json
9
+
10
+
11
+ class FunnelEventData(CustomerEventData):
12
+ """
13
+ Event data for chat funnel events.
14
+
15
+ Fields required per event type:
16
+ - STARTED: funnel_id, chat_funnel_id, stage_transition
17
+ - STAGE_CHANGED: funnel_id, chat_funnel_id, stage_transition (with time_in_previous_stage_seconds)
18
+ - COMPLETED: funnel_id, chat_funnel_id, time_in_funnel_seconds, time_in_last_stage_seconds
19
+ - ABANDONED: funnel_id, chat_funnel_id, time_in_funnel_seconds, time_in_last_stage_seconds
20
+ """
21
+ funnel_id: StrObjectId = Field(description="The funnel the chat is in")
22
+ chat_funnel_id: StrObjectId = Field(description="Reference to the ChatFunnel record")
23
+
24
+ # For STARTED and STAGE_CHANGED events
25
+ stage_transition: Optional[StageTransition] = Field(
26
+ default=None,
27
+ description="The stage transition details (for STARTED and STAGE_CHANGED)"
28
+ )
29
+
30
+ # For COMPLETED and ABANDONED events
31
+ time_in_funnel_seconds: Optional[int] = Field(
32
+ default=None,
33
+ description="Total time spent in the funnel (for COMPLETED and ABANDONED)"
34
+ )
35
+ time_in_last_stage_seconds: Optional[int] = Field(
36
+ default=None,
37
+ description="Time spent in the last stage before completion/abandonment"
38
+ )
39
+
40
+
41
+ class ChatFunnelEvent(Event):
42
+ """
43
+ Event for tracking chat funnel lifecycle.
44
+
45
+ Events:
46
+ - CHAT_FUNNEL_STARTED: Chat entered a funnel
47
+ - CHAT_FUNNEL_STAGE_CHANGED: Chat moved between stages
48
+ - CHAT_FUNNEL_COMPLETED: Chat completed the funnel
49
+ - CHAT_FUNNEL_ABANDONED: Chat abandoned the funnel
50
+ """
51
+ data: FunnelEventData
52
+
53
+ VALID_TYPES: ClassVar[set] = {
54
+ EventType.CHAT_FUNNEL_STARTED,
55
+ EventType.CHAT_FUNNEL_STAGE_CHANGED,
56
+ EventType.CHAT_FUNNEL_COMPLETED,
57
+ EventType.CHAT_FUNNEL_ABANDONED
58
+ }
59
+
60
+ @field_validator('data')
61
+ def validate_data_fields(cls, v: FunnelEventData, info: ValidationInfo):
62
+ """Validate that appropriate fields are set based on event type"""
63
+ event_type = info.data.get('type')
64
+
65
+ # STARTED: requires stage_transition
66
+ if event_type == EventType.CHAT_FUNNEL_STARTED:
67
+ if v.stage_transition is None:
68
+ raise ValueError("stage_transition must be set for CHAT_FUNNEL_STARTED events")
69
+
70
+ # STAGE_CHANGED: requires stage_transition with time_in_previous_stage_seconds
71
+ elif event_type == EventType.CHAT_FUNNEL_STAGE_CHANGED:
72
+ if v.stage_transition is None:
73
+ raise ValueError("stage_transition must be set for CHAT_FUNNEL_STAGE_CHANGED events")
74
+ if v.stage_transition.time_in_previous_stage_seconds is None:
75
+ raise ValueError("time_in_previous_stage_seconds must be set in stage_transition for CHAT_FUNNEL_STAGE_CHANGED events")
76
+
77
+ # COMPLETED: requires time metrics
78
+ elif event_type == EventType.CHAT_FUNNEL_COMPLETED:
79
+ if v.time_in_funnel_seconds is None:
80
+ raise ValueError("time_in_funnel_seconds must be set for CHAT_FUNNEL_COMPLETED events")
81
+ if v.time_in_last_stage_seconds is None:
82
+ raise ValueError("time_in_last_stage_seconds must be set for CHAT_FUNNEL_COMPLETED events")
83
+
84
+ # ABANDONED: requires time metrics
85
+ elif event_type == EventType.CHAT_FUNNEL_ABANDONED:
86
+ if v.time_in_funnel_seconds is None:
87
+ raise ValueError("time_in_funnel_seconds must be set for CHAT_FUNNEL_ABANDONED events")
88
+ if v.time_in_last_stage_seconds is None:
89
+ raise ValueError("time_in_last_stage_seconds must be set for CHAT_FUNNEL_ABANDONED events")
90
+
91
+ return v
92
+
93
+ def model_dump_json(self, *args, **kwargs):
94
+ dump = json.loads(super().model_dump_json(*args, **kwargs))
95
+ dump['data'] = self.data.model_dump_json()
96
+ return dump
@@ -58,6 +58,9 @@ 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,
61
64
  EventType.WORKFLOW_CREATED,
62
65
  EventType.WORKFLOW_UPDATED,
63
66
  EventType.WORKFLOW_DELETED,
@@ -70,6 +73,9 @@ class AssetEvent(Event):
70
73
  EventType.FILTER_CRITERIA_CREATED,
71
74
  EventType.FILTER_CRITERIA_UPDATED,
72
75
  EventType.FILTER_CRITERIA_DELETED,
76
+ EventType.FORM_FIELD_CREATED,
77
+ EventType.FORM_FIELD_UPDATED,
78
+ EventType.FORM_FIELD_DELETED,
73
79
  EventType.COMPANY_CREATED,
74
80
  EventType.COMPANY_UPDATED,
75
81
  EventType.COMPANY_DELETED
@@ -77,8 +83,9 @@ class AssetEvent(Event):
77
83
 
78
84
  @model_validator(mode='after')
79
85
  def validate_data_fields(self):
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")
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")
82
89
  return self
83
90
 
84
91
  def model_dump_json(self, *args, **kwargs):
@@ -8,6 +8,7 @@ EVENT_TO_TYPE_CLASSES = {
8
8
  EventType.CHAT_CREATED : ChatStatusEvent,
9
9
  EventType.CHAT_STATUS_UPDATED : ChatStatusEvent,
10
10
  EventType.CHAT_DELETED : ChatStatusEvent,
11
+ EventType.CHAT_CLIENT_UPDATED : ChatClientEvent,
11
12
  #TAGS
12
13
  EventType.TAG_ASSIGNED : TagChatEvent,
13
14
  EventType.TAG_REMOVED : TagChatEvent,
@@ -41,10 +42,9 @@ EVENT_TO_TYPE_CLASSES = {
41
42
  #CONTINUOUS CONVERSATION
42
43
  EventType.CONTINUOUS_CONVERSATION_CREATED : ContinuousConversationEvent,
43
44
  EventType.CONTINUOUS_CONVERSATION_UPDATED : ContinuousConversationEvent,
44
- #FUNNEL STAGES
45
- # Funnel-level events
45
+ #CHAT FUNNEL EVENTS
46
46
  EventType.CHAT_FUNNEL_STARTED : ChatFunnelEvent,
47
- EventType.CHAT_FUNNEL_UPDATED : ChatFunnelEvent,
47
+ EventType.CHAT_FUNNEL_STAGE_CHANGED : ChatFunnelEvent,
48
48
  EventType.CHAT_FUNNEL_COMPLETED : ChatFunnelEvent,
49
49
  EventType.CHAT_FUNNEL_ABANDONED : ChatFunnelEvent,
50
50
 
@@ -86,6 +86,10 @@ 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,
89
93
  #AGENTS
90
94
  EventType.USER_CREATED : UserEvent,
91
95
  EventType.USER_UPDATED : UserEvent,
@@ -5,6 +5,8 @@ class EventType(StrEnum):
5
5
  CHAT_CREATED = "chat.created"
6
6
  CHAT_STATUS_UPDATED = "chat.status_updated"
7
7
  CHAT_DELETED = "chat.deleted"
8
+ ##CHAT CLIENT EVENTS
9
+ CHAT_CLIENT_UPDATED = "chat.client.updated"
8
10
  #TAGS
9
11
  TAG_ASSIGNED = "chat.tag.assigned"
10
12
  TAG_REMOVED = "chat.tag.removed"
@@ -42,10 +44,9 @@ class EventType(StrEnum):
42
44
  #CONTINUOUS CONVERSATION
43
45
  CONTINUOUS_CONVERSATION_CREATED = "chat.continuous_conversation.created"
44
46
  CONTINUOUS_CONVERSATION_UPDATED = "chat.continuous_conversation.updated"
45
- #FUNNEL STAGES
46
- # Funnel-level events
47
- CHAT_FUNNEL_STARTED = "chat.funnel.started" # New
48
- CHAT_FUNNEL_UPDATED = "chat.funnel.updated"
47
+ #CHAT FUNNEL EVENTS
48
+ CHAT_FUNNEL_STARTED = "chat.funnel.started"
49
+ CHAT_FUNNEL_STAGE_CHANGED = "chat.funnel.stage_changed"
49
50
  CHAT_FUNNEL_COMPLETED = "chat.funnel.completed"
50
51
  CHAT_FUNNEL_ABANDONED = "chat.funnel.abandoned"
51
52
 
@@ -84,13 +85,18 @@ class EventType(StrEnum):
84
85
  FAST_ANSWER_CREATED = "company.fast_answer.created"
85
86
  FAST_ANSWER_UPDATED = "company.fast_answer.updated"
86
87
  FAST_ANSWER_DELETED = "company.fast_answer.deleted"
87
- #FUNNEL STAGES
88
+ #FUNNELS
88
89
  FUNNEL_CREATED = "company.funnel.created"
89
90
  FUNNEL_UPDATED = "company.funnel.updated"
90
91
  FUNNEL_DELETED = "company.funnel.deleted"
92
+ #FUNNEL STAGES
91
93
  FUNNEL_STAGE_CREATED = "company.funnel_stage.created"
92
94
  FUNNEL_STAGE_UPDATED = "company.funnel_stage.updated"
93
95
  FUNNEL_STAGE_DELETED = "company.funnel_stage.deleted"
96
+ #FUNNEL MEMBERS
97
+ FUNNEL_MEMBER_ADDED = "company.funnel_member.added"
98
+ FUNNEL_MEMBER_UPDATED = "company.funnel_member.updated"
99
+ FUNNEL_MEMBER_REMOVED = "company.funnel_member.removed"
94
100
  #BUSINESS AREA
95
101
  BUSINESS_AREA_CREATED = "company.business_area.created"
96
102
  BUSINESS_AREA_UPDATED = "company.business_area.updated"
@@ -19,6 +19,7 @@ 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
22
23
  import json
23
24
  import logging
24
25
  logger = logging.getLogger(__name__)
@@ -47,6 +48,7 @@ class Chat(CompanyAssetModel):
47
48
  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")
48
49
  suggested_messages: List[MessageDraft] = Field(default_factory=list)
49
50
  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")
50
52
  model_config = ConfigDict(extra="ignore")
51
53
 
52
54
  @property
@@ -267,7 +269,17 @@ class Chat(CompanyAssetModel):
267
269
  @property
268
270
  def bought_product_ids(self) -> List[StrObjectId]:
269
271
  """Get all sale ids in the chat"""
270
- return [sale.product_id for sale in self.sales]
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
271
283
 
272
284
  @property
273
285
  def products(self) -> List[AssignedAssetToChat]:
@@ -364,4 +376,3 @@ class Chat(CompanyAssetModel):
364
376
  dump["last_message"] = self.last_message.model_dump_json(serializer=SerializerType.DATABASE) if self.last_message else None
365
377
  dump["flow_states"] = [flow_state.model_dump_json(serializer=SerializerType.DATABASE) for flow_state in self.flow_states]
366
378
  return dump
367
-
@@ -1,6 +1,6 @@
1
-
2
1
  from .chat import Chat
3
2
  from letschatty.models.company.assets import TagPreview, FlowPreview, ContactPoint, Sale, ChattyAIAgentPreview, ProductPreview
3
+ from letschatty.models.company.CRM.funnel import ActiveFunnel
4
4
 
5
5
  from letschatty.models.utils.types.serializer_type import SerializerType
6
6
  from pydantic import BaseModel
@@ -15,3 +15,8 @@ class ChatWithAssets(BaseModel):
15
15
  contact_points: List[ContactPoint]
16
16
  flows_links_states: List[FlowPreview]
17
17
  chatty_ai_agent: Optional[ChattyAIAgentPreview]
18
+
19
+ @property
20
+ def active_funnel(self) -> Optional[ActiveFunnel]:
21
+ """Convenience property to access the chat's active funnel"""
22
+ return self.chat.active_funnel
@@ -5,7 +5,6 @@ from ..utils.types.identifier import StrObjectId
5
5
  from .quality_scoring import QualityScore
6
6
  from .highlight import Highlight
7
7
  from ..company.assets.chat_assets import AssignedAssetToChat, SaleAssignedToChat, ContactPointAssignedToChat
8
- from ..company.CRM.funnel import ClientFunnel
9
8
  from ..utils.types.serializer_type import SerializerType
10
9
 
11
10
  class Client(CompanyAssetModel):
@@ -23,7 +22,6 @@ class Client(CompanyAssetModel):
23
22
  contact_points: List[ContactPointAssignedToChat] = Field(default=list())
24
23
  business_area: Optional[StrObjectId] = Field(default=None, description="It's a business related area, that works as a queue for the chats")
25
24
  external_id: Optional[str] = Field(default=None)
26
- funnels : List[ClientFunnel] = Field(default=list())
27
25
  exclude_fields = {
28
26
  SerializerType.FRONTEND: {"products", "tags", "sales", "contact_points", "highlights"}
29
27
  }
@@ -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=datetime.now(ZoneInfo("UTC")) + timedelta(days=10))
33
+ expires_at: datetime = Field(default_factory=lambda: 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)