letschatty 0.4.332__tar.gz → 0.4.349__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.
- {letschatty-0.4.332 → letschatty-0.4.349}/PKG-INFO +1 -1
- {letschatty-0.4.332 → letschatty-0.4.349}/pyproject.toml +1 -1
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/ai_microservices/expected_output.py +8 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/ai_microservices/lambda_events.py +24 -5
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/__init__.py +2 -1
- letschatty-0.4.349/src/letschatty/models/analytics/events/chat_based_events/chat_client.py +19 -0
- letschatty-0.4.349/src/letschatty/models/analytics/events/chat_based_events/chat_funnel.py +96 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/company_based_events/asset_events.py +6 -2
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/event_type_to_classes.py +3 -3
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/event_types.py +11 -5
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/chat/chat.py +13 -2
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/chat/chat_with_assets.py +6 -1
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/chat/client.py +0 -2
- letschatty-0.4.349/src/letschatty/models/company/CRM/funnel.py +401 -0
- letschatty-0.4.349/src/letschatty/models/company/__init__.py +9 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/ai_agents_v2/chain_of_thought_in_chat.py +5 -3
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/ai_agents_v2/chatty_ai_agent.py +7 -1
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/ai_agents_v2/chatty_ai_agent_in_chat.py +2 -34
- letschatty-0.4.349/src/letschatty/models/company/assets/ai_agents_v2/statuses.py +33 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/automation.py +10 -1
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/chat_assets.py +12 -2
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/company_assets.py +2 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/sale.py +3 -3
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/empresa.py +2 -1
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/form_field.py +9 -2
- letschatty-0.4.349/src/letschatty/models/company/integrations/product_sync_status.py +28 -0
- letschatty-0.4.349/src/letschatty/models/company/integrations/shopify/company_shopify_integration.py +62 -0
- letschatty-0.4.349/src/letschatty/models/company/integrations/shopify/shopify_product_sync_status.py +18 -0
- letschatty-0.4.349/src/letschatty/models/company/integrations/shopify/shopify_webhook_topics.py +40 -0
- letschatty-0.4.349/src/letschatty/models/company/integrations/sync_status_enum.py +9 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_document.py +4 -2
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_media.py +4 -3
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/utils/custom_exceptions/custom_exceptions.py +24 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/chat/chat_service.py +55 -12
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/analytics/events_factory.py +29 -3
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/validators/analytics_validator.py +11 -0
- letschatty-0.4.332/src/letschatty/models/analytics/events/chat_based_events/chat_funnel.py +0 -40
- letschatty-0.4.332/src/letschatty/models/company/CRM/funnel.py +0 -69
- letschatty-0.4.332/src/letschatty/models/company/__init__.py +0 -3
- {letschatty-0.4.332 → letschatty-0.4.349}/LICENSE +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/README.md +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/ai_microservices/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/ai_microservices/lambda_invokation_types.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/ai_microservices/n8n_ai_agents_payload.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/ai_microservices/openai_payloads.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/base.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/chat_based_events/ai_agent_chat.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/chat_based_events/business_area.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/chat_based_events/chat_based_event.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/chat_based_events/chat_context.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/chat_based_events/chat_status.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/chat_based_events/contact_point.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/chat_based_events/continuous_conversation.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/chat_based_events/highlight.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/chat_based_events/message.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/chat_based_events/messages_intent_context.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/chat_based_events/product_chat.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/chat_based_events/quality_scoring.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/chat_based_events/sale.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/chat_based_events/tag_chat.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/chat_based_events/workflow.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/company_based_events/company_events.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/company_based_events/user_events.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/metrics/__init_.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/metrics/daily_contact_points.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/metrics/daily_new_chats.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/metrics/daily_sent_templates_grouped.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/metrics/sales_roadmap.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/metrics/sent_templates.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/smart_messages/friendly_code_for_source.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/smart_messages/topic.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/smart_messages/topic_message.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/sources/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/sources/google_ad_utm_source.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/sources/helpers.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/sources/other_source.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/sources/pure_ad.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/sources/pure_ad_utm_source.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/sources/source_base.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/sources/template_source.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/sources/topic_default_source.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/sources/utm_source.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/sources/utms/referer_info.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/sources/utms/utm_query_params.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/sources/whatsapp_default_source.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/auth/jwt.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/base_models/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/base_models/ai_agent_component.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/base_models/chatty_asset_model.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/base_models/helpers.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/base_models/related_asset_usage_example.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/base_models/singleton.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/base_models/update_model_interface.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/base_models/validate_timestamps_and_id.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/channels/channel.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/chat/assets_assigned_to_chat.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/chat/chat_status_modifications.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/chat/continuous_conversation.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/chat/filter_parameters.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/chat/flow_link_state.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/chat/highlight.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/chat/preview.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/chat/quality_scoring.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/chat/scheduled_messages.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/chat/temporary_chat.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/chat/time_left.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/CRM/business_area.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/ai_agents_v2/ai_agent_message_draft.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/ai_agents_v2/ai_agents_decision_output.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/ai_agents_v2/chat_example.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/ai_agents_v2/chat_example_test.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/ai_agents_v2/chatty_ai_agent_config_for_automation.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/ai_agents_v2/chatty_ai_mode.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/ai_agents_v2/context_item.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/ai_agents_v2/faq.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/ai_agents_v2/follow_up_strategy.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/ai_agents_v2/get_chat_with_prompt_response.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/ai_agents_v2/knowleadge_base_components.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/ai_agents_v2/n8n_agents_info.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/ai_agents_v2/n8n_schema_incoming_message_output.json +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/ai_agents_v2/n8n_schema_smart_follow_up_output.json +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/ai_agents_v2/pre_qualify_config.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/assignment/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/assignment/assignment_assets.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/chatty_fast_answers/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/chatty_fast_answers/chatty_fast_answer.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/contact_point.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/filter_criteria.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/flow.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/launch/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/launch/launch.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/launch/scheduled_communication.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/launch/subscription.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/media/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/media/file.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/product.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/tag.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/users/agent_chats_snapshot.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/users/user.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/users/user_asset_permission.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/assets/workflow_execution.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/company_chats_snapshot.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/company_messaging_settgins.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/conversation_topic.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/insight.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/company/notifications/notification.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/copilot/links.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/data_base/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/data_base/collection_interface.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/data_base/mongo_connection.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/execution/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/execution/execution.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/execution/executor.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/forms/company/auth0_company_registration_form.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/forms/company/meta_register.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/audio.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/base/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/base/chatty_message_json.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/base/message_base.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/base/message_draft.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/button.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/central_notification.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/contact.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/document.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/image.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/interactive.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/location.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/reaction.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/schema/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_audio.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_button.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_central.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_contacts.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_image.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_interactive.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_location.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_reaction.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_sticker.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_text.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/schema/chatty_content/content_video.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/schema/chatty_context/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/schema/chatty_context/chatty_context.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/schema/chatty_referal/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/schema/chatty_referal/chatty_referal.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/sticker.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/text.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/chatty_messages/video.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/message_templates/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/message_templates/chatty_template_campaign.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/message_templates/filled_data_from_frontend.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/message_templates/payload_for_sending_template.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/message_templates/raw_meta_template.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/message_templates/recipient_of_template_campaign.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/message_templates/required_for_frontend_templates.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/meta_message_model/meta_base_notification_json.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/meta_message_model/meta_error_json.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/meta_message_model/meta_inexistent_json.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/meta_message_model/meta_message_json.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/meta_message_model/meta_status_json.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/meta_message_model/meta_unknown_json.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/meta_message_model/schema/content_messages/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/meta_message_model/schema/content_messages/button_content.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/meta_message_model/schema/content_messages/contacts_content.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/meta_message_model/schema/content_messages/interactive_content.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/meta_message_model/schema/content_messages/location_content.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/meta_message_model/schema/content_messages/multimedia_content.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/meta_message_model/schema/content_messages/order_content.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/meta_message_model/schema/content_messages/reaction_content.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/meta_message_model/schema/content_messages/system_content.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/meta_message_model/schema/content_messages/text_content.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/meta_message_model/schema/values/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/meta_message_model/schema/values/value_errors.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/meta_message_model/schema/values/value_messages.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/messages/meta_message_model/schema/values/value_statuses.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/utils/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/utils/custom_exceptions/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/utils/definitions.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/utils/types/CRUD_operations.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/utils/types/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/utils/types/channel_types.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/utils/types/chats_actions.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/utils/types/country.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/utils/types/deletion_type.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/utils/types/executor_types.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/utils/types/identifier.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/utils/types/message_status_types.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/utils/types/message_types.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/utils/types/phone_number.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/utils/types/serializer_type.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/utils/types/source_types.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/utils/types/typealiases.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/ai_agents/context_builder_v2.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/ai_agents/cot_follow_up_examples.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/ai_agents/followup_schema.json +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/ai_agents/smart_follow_up_context_builder_v2.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/ai_agents/smart_follow_up_service_v2.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/ai_agents/tool_descriptions/assign_chat_to_ai_agent_itself.json +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/ai_agents/tool_descriptions/human_handover.json +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/ai_agents/tool_descriptions.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/ai_components_service.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/chat/chat_extractors.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/chat/client_service.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/chat/conversation_topics_service.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/chatty_assets/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/chatty_assets/asset_service.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/chatty_assets/base_container.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/chatty_assets/base_container_with_collection.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/chatty_assets/documentation_diagram.png +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/chatty_assets/readme.md +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/concurrent/concurrent.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/contact_points/contact_point_service.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/continuous_conversation_service/continuous_conversation_helper.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/events/events_manager.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/analytics/contact_point_factory.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/analytics/smart_messages/topics_factory.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/analytics/sources/helpers.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/analytics/sources/source_factory.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/chats/chat_factory.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/chatty_fast_answers/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/chatty_fast_answers/chatty_fast_answers_factory.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/clients/client_factory.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/company/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/company/empresa_factory.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/lambda_ai_orchestrartor/lambda_events_factory.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/messages/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/messages/central_notification_factory.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/messages/chatty_message_factory.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/messages/child_db_message_factory.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/messages/child_request_message.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/messages/from_template_hot_fix.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/messages/message_templates/template_factory.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/messages/message_templates/test.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/meta_notifications/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/meta_notifications/meta_notification_factory.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/factories/product_factory.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/filter_criteria_service.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/messages_helpers/__init__.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/messages_helpers/get_caption_or_body_or_preview.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/scheduled_messages_service/scheduled_messages_helpers.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/template_campaigns/template_campaign_service.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/users/agent_service.py +0 -0
- {letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/services/users/user_factory.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "letschatty"
|
|
3
|
-
version = "0.4.
|
|
3
|
+
version = "0.4.349" # 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"
|
{letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/ai_microservices/expected_output.py
RENAMED
|
@@ -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
|
{letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/ai_microservices/lambda_events.py
RENAMED
|
@@ -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
|
|
64
|
-
if isinstance(
|
|
65
|
-
|
|
66
|
-
|
|
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
|
{letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/__init__.py
RENAMED
|
@@ -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
|
|
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,
|
|
@@ -80,8 +83,9 @@ class AssetEvent(Event):
|
|
|
80
83
|
|
|
81
84
|
@model_validator(mode='after')
|
|
82
85
|
def validate_data_fields(self):
|
|
83
|
-
|
|
84
|
-
|
|
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")
|
|
85
89
|
return self
|
|
86
90
|
|
|
87
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
|
|
45
|
-
# Funnel-level events
|
|
45
|
+
#CHAT FUNNEL EVENTS
|
|
46
46
|
EventType.CHAT_FUNNEL_STARTED : ChatFunnelEvent,
|
|
47
|
-
EventType.
|
|
47
|
+
EventType.CHAT_FUNNEL_STAGE_CHANGED : ChatFunnelEvent,
|
|
48
48
|
EventType.CHAT_FUNNEL_COMPLETED : ChatFunnelEvent,
|
|
49
49
|
EventType.CHAT_FUNNEL_ABANDONED : ChatFunnelEvent,
|
|
50
50
|
|
{letschatty-0.4.332 → letschatty-0.4.349}/src/letschatty/models/analytics/events/event_types.py
RENAMED
|
@@ -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
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
#
|
|
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
|
-
|
|
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
|
}
|