django-cfg 1.4.21__py3-none-any.whl → 1.4.23__py3-none-any.whl
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.
- django_cfg/__init__.py +4 -4
- django_cfg/apps/accounts/__init__.py +1 -1
- django_cfg/apps/accounts/__models.py +30 -29
- django_cfg/apps/accounts/admin/__init__.py +14 -3
- django_cfg/apps/accounts/admin/activity_admin.py +19 -19
- django_cfg/apps/accounts/admin/filters.py +7 -6
- django_cfg/apps/accounts/admin/group_admin.py +10 -16
- django_cfg/apps/accounts/admin/inlines.py +21 -19
- django_cfg/apps/accounts/admin/otp_admin.py +12 -12
- django_cfg/apps/accounts/admin/registration_admin.py +24 -24
- django_cfg/apps/accounts/admin/resources.py +49 -48
- django_cfg/apps/accounts/admin/twilio_admin.py +37 -37
- django_cfg/apps/accounts/admin/user_admin.py +45 -41
- django_cfg/apps/accounts/management/commands/otp_test.py +11 -11
- django_cfg/apps/accounts/managers/__init__.py +1 -1
- django_cfg/apps/accounts/managers/user_manager.py +6 -7
- django_cfg/apps/accounts/migrations/0001_initial.py +3 -2
- django_cfg/apps/accounts/models/__init__.py +15 -16
- django_cfg/apps/accounts/models/activity.py +5 -5
- django_cfg/apps/accounts/models/integrations.py +15 -15
- django_cfg/apps/accounts/models/registration.py +3 -2
- django_cfg/apps/accounts/models/user.py +3 -2
- django_cfg/apps/accounts/serializers/__init__.py +10 -3
- django_cfg/apps/accounts/serializers/otp.py +5 -4
- django_cfg/apps/accounts/serializers/profile.py +4 -5
- django_cfg/apps/accounts/serializers/webhook.py +13 -13
- django_cfg/apps/accounts/services/activity_service.py +13 -12
- django_cfg/apps/accounts/services/otp_service.py +16 -14
- django_cfg/apps/accounts/signals.py +18 -16
- django_cfg/apps/accounts/urls.py +10 -5
- django_cfg/apps/accounts/utils/notifications.py +22 -22
- django_cfg/apps/accounts/views/__init__.py +1 -1
- django_cfg/apps/accounts/views/otp.py +15 -14
- django_cfg/apps/accounts/views/profile.py +14 -10
- django_cfg/apps/accounts/views/webhook.py +46 -48
- django_cfg/apps/agents/__init__.py +3 -3
- django_cfg/apps/agents/admin/__init__.py +1 -1
- django_cfg/apps/agents/admin/execution_admin.py +68 -72
- django_cfg/apps/agents/admin/registry_admin.py +50 -54
- django_cfg/apps/agents/admin/toolsets_admin.py +63 -67
- django_cfg/apps/agents/apps.py +3 -3
- django_cfg/apps/agents/core/__init__.py +4 -4
- django_cfg/apps/agents/core/dependencies.py +24 -23
- django_cfg/apps/agents/core/django_agent.py +41 -39
- django_cfg/apps/agents/core/exceptions.py +12 -12
- django_cfg/apps/agents/core/models.py +16 -15
- django_cfg/apps/agents/core/orchestrator.py +58 -58
- django_cfg/apps/agents/examples/simple_example.py +24 -19
- django_cfg/apps/agents/integration/__init__.py +1 -1
- django_cfg/apps/agents/integration/middleware.py +12 -11
- django_cfg/apps/agents/integration/registry.py +52 -49
- django_cfg/apps/agents/integration/signals.py +5 -5
- django_cfg/apps/agents/management/commands/create_agent.py +39 -38
- django_cfg/apps/agents/management/commands/orchestrator_status.py +40 -39
- django_cfg/apps/agents/managers/__init__.py +8 -3
- django_cfg/apps/agents/managers/execution.py +42 -41
- django_cfg/apps/agents/managers/registry.py +40 -39
- django_cfg/apps/agents/managers/toolsets.py +87 -86
- django_cfg/apps/agents/migrations/0001_initial.py +2 -1
- django_cfg/apps/agents/models/__init__.py +2 -2
- django_cfg/apps/agents/models/execution.py +43 -42
- django_cfg/apps/agents/models/registry.py +46 -45
- django_cfg/apps/agents/models/toolsets.py +63 -62
- django_cfg/apps/agents/patterns/__init__.py +5 -5
- django_cfg/apps/agents/patterns/content_agents.py +17 -16
- django_cfg/apps/agents/toolsets/__init__.py +3 -3
- django_cfg/apps/agents/toolsets/cache_toolset.py +56 -55
- django_cfg/apps/agents/toolsets/django_toolset.py +43 -42
- django_cfg/apps/agents/toolsets/file_toolset.py +64 -63
- django_cfg/apps/agents/toolsets/orm_toolset.py +75 -74
- django_cfg/apps/agents/urls.py +3 -2
- django_cfg/apps/api/commands/urls.py +1 -0
- django_cfg/apps/api/commands/views.py +23 -26
- django_cfg/apps/api/endpoints/checker.py +5 -4
- django_cfg/apps/api/endpoints/drf_views.py +2 -2
- django_cfg/apps/api/endpoints/tests.py +6 -5
- django_cfg/apps/api/endpoints/urls.py +2 -1
- django_cfg/apps/api/endpoints/views.py +1 -0
- django_cfg/apps/api/health/drf_views.py +6 -6
- django_cfg/apps/api/health/urls.py +2 -1
- django_cfg/apps/api/health/views.py +41 -41
- django_cfg/{modules/django_ipc_client → apps/ipc}/__init__.py +6 -6
- django_cfg/apps/ipc/apps.py +28 -0
- django_cfg/apps/ipc/serializers/__init__.py +19 -0
- django_cfg/apps/ipc/serializers/serializers.py +229 -0
- django_cfg/apps/ipc/services/__init__.py +7 -0
- django_cfg/apps/ipc/services/client/__init__.py +23 -0
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/client.py +7 -6
- django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/exceptions.py +1 -1
- django_cfg/{modules/django_ipc_client/dashboard → apps/ipc/services}/monitor.py +23 -5
- django_cfg/{modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js → apps/ipc/static/django_cfg_ipc/js/dashboard.mjs} +131 -63
- django_cfg/{modules/django_ipc_client/dashboard/templates/django_ipc_dashboard → apps/ipc/templates/django_cfg_ipc}/base.html +5 -10
- django_cfg/apps/ipc/templates/django_cfg_ipc/dashboard.html +202 -0
- django_cfg/apps/ipc/urls.py +21 -0
- django_cfg/apps/ipc/urls_admin.py +20 -0
- django_cfg/apps/ipc/views/__init__.py +8 -0
- django_cfg/apps/ipc/views/dashboard.py +15 -0
- django_cfg/apps/ipc/views/viewsets.py +245 -0
- django_cfg/apps/knowbase/admin/__init__.py +2 -2
- django_cfg/apps/knowbase/admin/actions/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +2 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +81 -84
- django_cfg/apps/knowbase/admin/chat_admin.py +70 -72
- django_cfg/apps/knowbase/admin/document_admin.py +10 -11
- django_cfg/apps/knowbase/admin/external_data_admin.py +69 -71
- django_cfg/apps/knowbase/admin/helpers/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/helpers/configs.py +2 -2
- django_cfg/apps/knowbase/admin/helpers/statistics.py +1 -1
- django_cfg/apps/knowbase/apps.py +13 -13
- django_cfg/apps/knowbase/config/__init__.py +7 -6
- django_cfg/apps/knowbase/config/constance_fields.py +14 -12
- django_cfg/apps/knowbase/config/constance_settings.py +32 -31
- django_cfg/apps/knowbase/config/settings.py +28 -28
- django_cfg/apps/knowbase/examples/external_data_usage.py +35 -32
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +33 -32
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +11 -13
- django_cfg/apps/knowbase/managers/__init__.py +2 -2
- django_cfg/apps/knowbase/managers/archive.py +86 -85
- django_cfg/apps/knowbase/managers/base.py +5 -5
- django_cfg/apps/knowbase/managers/chat.py +29 -28
- django_cfg/apps/knowbase/managers/document.py +39 -39
- django_cfg/apps/knowbase/managers/external_data.py +74 -73
- django_cfg/apps/knowbase/migrations/0001_initial.py +2 -1
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +2 -1
- django_cfg/apps/knowbase/mixins/__init__.py +4 -4
- django_cfg/apps/knowbase/mixins/config/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/config/meta_config.py +1 -1
- django_cfg/apps/knowbase/mixins/config.py +19 -18
- django_cfg/apps/knowbase/mixins/creator.py +7 -7
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +29 -28
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +6 -5
- django_cfg/apps/knowbase/mixins/generators/__init__.py +1 -1
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +2 -2
- django_cfg/apps/knowbase/mixins/service.py +47 -45
- django_cfg/apps/knowbase/models/__init__.py +7 -7
- django_cfg/apps/knowbase/models/archive.py +72 -72
- django_cfg/apps/knowbase/models/base.py +12 -13
- django_cfg/apps/knowbase/models/chat.py +20 -19
- django_cfg/apps/knowbase/models/document.py +37 -35
- django_cfg/apps/knowbase/models/external_data.py +41 -42
- django_cfg/apps/knowbase/serializers/__init__.py +7 -7
- django_cfg/apps/knowbase/serializers/archive_serializers.py +50 -42
- django_cfg/apps/knowbase/serializers/chat_serializers.py +16 -15
- django_cfg/apps/knowbase/serializers/document_serializers.py +13 -12
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +31 -31
- django_cfg/apps/knowbase/serializers/public_serializers.py +10 -9
- django_cfg/apps/knowbase/services/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/__init__.py +7 -7
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +1 -1
- django_cfg/apps/knowbase/services/archive/archive_service.py +109 -112
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +3 -3
- django_cfg/apps/knowbase/services/archive/chunking/base.py +1 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +5 -4
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +6 -5
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +4 -3
- django_cfg/apps/knowbase/services/archive/chunking_service.py +3 -7
- django_cfg/apps/knowbase/services/archive/context/__init__.py +1 -1
- django_cfg/apps/knowbase/services/archive/context/builders.py +2 -1
- django_cfg/apps/knowbase/services/archive/context/models.py +2 -1
- django_cfg/apps/knowbase/services/archive/exceptions.py +5 -5
- django_cfg/apps/knowbase/services/archive/extraction_service.py +111 -110
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +80 -77
- django_cfg/apps/knowbase/services/base.py +11 -9
- django_cfg/apps/knowbase/services/chat_service.py +40 -39
- django_cfg/apps/knowbase/services/document_service.py +28 -27
- django_cfg/apps/knowbase/services/embedding/__init__.py +9 -9
- django_cfg/apps/knowbase/services/embedding/async_processor.py +38 -40
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +45 -42
- django_cfg/apps/knowbase/services/embedding/batch_result.py +7 -6
- django_cfg/apps/knowbase/services/embedding/models.py +52 -51
- django_cfg/apps/knowbase/services/embedding/processors.py +24 -23
- django_cfg/apps/knowbase/services/embedding/utils.py +17 -17
- django_cfg/apps/knowbase/services/prompt_builder.py +24 -23
- django_cfg/apps/knowbase/services/search_service.py +52 -49
- django_cfg/apps/knowbase/signals/__init__.py +2 -5
- django_cfg/apps/knowbase/signals/archive_signals.py +35 -34
- django_cfg/apps/knowbase/signals/chat_signals.py +6 -5
- django_cfg/apps/knowbase/signals/document_signals.py +22 -22
- django_cfg/apps/knowbase/signals/external_data_signals.py +22 -22
- django_cfg/apps/knowbase/tasks/__init__.py +6 -7
- django_cfg/apps/knowbase/tasks/archive_tasks.py +41 -41
- django_cfg/apps/knowbase/tasks/document_processing.py +49 -44
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +46 -44
- django_cfg/apps/knowbase/tasks/maintenance.py +26 -24
- django_cfg/apps/knowbase/urls.py +3 -2
- django_cfg/apps/knowbase/urls_admin.py +6 -3
- django_cfg/apps/knowbase/urls_system.py +4 -5
- django_cfg/apps/knowbase/utils/chunk_settings.py +22 -20
- django_cfg/apps/knowbase/utils/text_processing.py +76 -75
- django_cfg/apps/knowbase/utils/validation.py +9 -9
- django_cfg/apps/knowbase/views/__init__.py +5 -5
- django_cfg/apps/knowbase/views/archive_views.py +90 -87
- django_cfg/apps/knowbase/views/base.py +9 -12
- django_cfg/apps/knowbase/views/chat_views.py +32 -32
- django_cfg/apps/knowbase/views/document_views.py +27 -28
- django_cfg/apps/knowbase/views/public_views.py +19 -19
- django_cfg/apps/leads/admin/leads_admin.py +41 -45
- django_cfg/apps/leads/admin/resources.py +14 -14
- django_cfg/apps/leads/admin.py +7 -9
- django_cfg/apps/leads/apps.py +1 -1
- django_cfg/apps/leads/models.py +17 -17
- django_cfg/apps/leads/serializers.py +5 -4
- django_cfg/apps/leads/signals.py +7 -7
- django_cfg/apps/leads/tests.py +47 -47
- django_cfg/apps/leads/urls.py +2 -2
- django_cfg/apps/leads/views.py +11 -11
- django_cfg/apps/maintenance/__init__.py +3 -3
- django_cfg/apps/maintenance/admin/__init__.py +1 -1
- django_cfg/apps/maintenance/admin/api_key_admin.py +36 -36
- django_cfg/apps/maintenance/admin/log_admin.py +35 -37
- django_cfg/apps/maintenance/admin/scheduled_admin.py +47 -51
- django_cfg/apps/maintenance/admin/site_admin.py +49 -52
- django_cfg/apps/maintenance/apps.py +2 -2
- django_cfg/apps/maintenance/management/commands/maintenance.py +53 -52
- django_cfg/apps/maintenance/management/commands/process_scheduled_maintenance.py +44 -44
- django_cfg/apps/maintenance/management/commands/sync_cloudflare.py +32 -32
- django_cfg/apps/maintenance/managers/__init__.py +1 -1
- django_cfg/apps/maintenance/managers/cloudflare_site_manager.py +39 -38
- django_cfg/apps/maintenance/managers/maintenance_log_manager.py +32 -31
- django_cfg/apps/maintenance/migrations/0001_initial.py +1 -0
- django_cfg/apps/maintenance/models/__init__.py +2 -2
- django_cfg/apps/maintenance/models/cloudflare_api_key.py +15 -15
- django_cfg/apps/maintenance/models/cloudflare_site.py +24 -22
- django_cfg/apps/maintenance/models/maintenance_log.py +15 -14
- django_cfg/apps/maintenance/models/scheduled_maintenance.py +53 -52
- django_cfg/apps/maintenance/services/__init__.py +3 -3
- django_cfg/apps/maintenance/services/bulk_operations_service.py +68 -68
- django_cfg/apps/maintenance/services/maintenance_service.py +59 -58
- django_cfg/apps/maintenance/services/scheduled_maintenance_service.py +52 -52
- django_cfg/apps/maintenance/services/site_sync_service.py +64 -65
- django_cfg/apps/maintenance/utils/__init__.py +1 -1
- django_cfg/apps/maintenance/utils/retry_utils.py +17 -17
- django_cfg/apps/newsletter/admin/__init__.py +12 -16
- django_cfg/apps/newsletter/admin/newsletter_admin.py +90 -87
- django_cfg/apps/newsletter/admin/resources.py +29 -29
- django_cfg/apps/newsletter/admin.py +39 -32
- django_cfg/apps/newsletter/management/commands/test_newsletter.py +3 -3
- django_cfg/apps/newsletter/managers/__init__.py +1 -1
- django_cfg/apps/newsletter/migrations/0001_initial.py +2 -1
- django_cfg/apps/newsletter/models.py +34 -33
- django_cfg/apps/newsletter/serializers.py +13 -13
- django_cfg/apps/newsletter/services/email_service.py +42 -40
- django_cfg/apps/newsletter/signals.py +4 -3
- django_cfg/apps/newsletter/urls.py +7 -7
- django_cfg/apps/newsletter/views/__init__.py +14 -19
- django_cfg/apps/newsletter/views/campaigns.py +19 -19
- django_cfg/apps/newsletter/views/emails.py +20 -20
- django_cfg/apps/newsletter/views/newsletters.py +5 -5
- django_cfg/apps/newsletter/views/subscriptions.py +24 -24
- django_cfg/apps/newsletter/views/tracking.py +6 -5
- django_cfg/apps/payments/admin/__init__.py +6 -5
- django_cfg/apps/payments/admin/api_keys_admin.py +43 -45
- django_cfg/apps/payments/admin/balance_admin.py +41 -47
- django_cfg/apps/payments/admin/currencies_admin.py +60 -62
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +14 -28
- django_cfg/apps/payments/admin/filters.py +59 -59
- django_cfg/apps/payments/admin/networks_admin.py +36 -50
- django_cfg/apps/payments/admin/payments_admin.py +47 -49
- django_cfg/apps/payments/admin/subscriptions_admin.py +30 -32
- django_cfg/apps/payments/admin/tariffs_admin.py +37 -42
- django_cfg/apps/payments/admin_interface/serializers/__init__.py +12 -13
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +28 -27
- django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +4 -5
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +407 -3
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +13 -13
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +5 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +105 -49
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +4 -1
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +16 -8
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +16 -8
- django_cfg/apps/payments/admin_interface/views/__init__.py +8 -9
- django_cfg/apps/payments/admin_interface/views/api/__init__.py +3 -3
- django_cfg/apps/payments/admin_interface/views/api/payments.py +52 -54
- django_cfg/apps/payments/admin_interface/views/api/stats.py +33 -30
- django_cfg/apps/payments/admin_interface/views/api/users.py +10 -11
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +46 -51
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +9 -9
- django_cfg/apps/payments/admin_interface/views/base.py +17 -19
- django_cfg/apps/payments/admin_interface/views/dashboard.py +10 -10
- django_cfg/apps/payments/admin_interface/views/forms.py +21 -20
- django_cfg/apps/payments/apps.py +7 -6
- django_cfg/apps/payments/config/__init__.py +4 -4
- django_cfg/apps/payments/config/django_cfg_integration.py +22 -21
- django_cfg/apps/payments/config/helpers.py +14 -12
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +85 -86
- django_cfg/apps/payments/management/commands/currency_stats.py +84 -87
- django_cfg/apps/payments/management/commands/manage_currencies.py +59 -58
- django_cfg/apps/payments/management/commands/manage_providers.py +103 -105
- django_cfg/apps/payments/management/commands/process_pending_payments.py +67 -70
- django_cfg/apps/payments/management/commands/test_providers.py +83 -84
- django_cfg/apps/payments/middleware/__init__.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +77 -78
- django_cfg/apps/payments/middleware/rate_limiting.py +72 -72
- django_cfg/apps/payments/middleware/usage_tracking.py +66 -64
- django_cfg/apps/payments/migrations/0001_initial.py +2 -1
- django_cfg/apps/payments/models/__init__.py +11 -12
- django_cfg/apps/payments/models/api_keys.py +29 -27
- django_cfg/apps/payments/models/balance.py +38 -38
- django_cfg/apps/payments/models/base.py +12 -11
- django_cfg/apps/payments/models/currencies.py +53 -52
- django_cfg/apps/payments/models/managers/__init__.py +13 -14
- django_cfg/apps/payments/models/managers/api_key_managers.py +55 -53
- django_cfg/apps/payments/models/managers/balance_managers.py +98 -97
- django_cfg/apps/payments/models/managers/currency_managers.py +70 -69
- django_cfg/apps/payments/models/managers/payment_managers.py +113 -111
- django_cfg/apps/payments/models/managers/subscription_managers.py +99 -97
- django_cfg/apps/payments/models/payments.py +167 -73
- django_cfg/apps/payments/models/subscriptions.py +56 -54
- django_cfg/apps/payments/models/tariffs.py +35 -34
- django_cfg/apps/payments/services/__init__.py +33 -36
- django_cfg/apps/payments/services/cache/__init__.py +7 -1
- django_cfg/apps/payments/services/cache_service/__init__.py +22 -20
- django_cfg/apps/payments/services/cache_service/api_key_cache.py +6 -5
- django_cfg/apps/payments/services/cache_service/interfaces.py +5 -5
- django_cfg/apps/payments/services/cache_service/keys.py +8 -8
- django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +8 -7
- django_cfg/apps/payments/services/cache_service/simple_cache.py +17 -14
- django_cfg/apps/payments/services/core/__init__.py +3 -3
- django_cfg/apps/payments/services/core/balance_service.py +69 -65
- django_cfg/apps/payments/services/core/base.py +25 -22
- django_cfg/apps/payments/services/core/currency/__init__.py +1 -1
- django_cfg/apps/payments/services/core/currency/currency_converter.py +2 -0
- django_cfg/apps/payments/services/core/currency_service.py +68 -66
- django_cfg/apps/payments/services/core/operations/__init__.py +1 -1
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +2 -1
- django_cfg/apps/payments/services/core/operations/payment_creator.py +2 -1
- django_cfg/apps/payments/services/core/operations/status_checker.py +2 -1
- django_cfg/apps/payments/services/core/payment_service.py +10 -7
- django_cfg/apps/payments/services/core/providers/provider_client.py +2 -2
- django_cfg/apps/payments/services/core/subscription_service.py +77 -74
- django_cfg/apps/payments/services/core/utils/data_converter.py +1 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +1 -0
- django_cfg/apps/payments/services/core/webhook_service.py +67 -63
- django_cfg/apps/payments/services/integrations/__init__.py +3 -3
- django_cfg/apps/payments/services/integrations/ngrok_service.py +1 -0
- django_cfg/apps/payments/services/integrations/providers_config.py +3 -2
- django_cfg/apps/payments/services/providers/base.py +59 -57
- django_cfg/apps/payments/services/providers/models/__init__.py +7 -14
- django_cfg/apps/payments/services/providers/models/base.py +15 -15
- django_cfg/apps/payments/services/providers/models/providers.py +13 -12
- django_cfg/apps/payments/services/providers/models/universal.py +6 -5
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +4 -4
- django_cfg/apps/payments/services/providers/nowpayments/config.py +9 -8
- django_cfg/apps/payments/services/providers/nowpayments/models.py +15 -15
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +2 -2
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +26 -26
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +3 -2
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +95 -99
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +41 -40
- django_cfg/apps/payments/services/providers/registry.py +65 -63
- django_cfg/apps/payments/services/providers/sync_service.py +50 -50
- django_cfg/apps/payments/services/types/__init__.py +21 -22
- django_cfg/apps/payments/services/types/data.py +14 -13
- django_cfg/apps/payments/services/types/requests.py +21 -22
- django_cfg/apps/payments/services/types/responses.py +16 -15
- django_cfg/apps/payments/services/types/webhooks.py +30 -30
- django_cfg/apps/payments/signals/__init__.py +4 -6
- django_cfg/apps/payments/signals/api_key_signals.py +33 -32
- django_cfg/apps/payments/signals/balance_signals.py +28 -26
- django_cfg/apps/payments/signals/payment_signals.py +29 -28
- django_cfg/apps/payments/signals/subscription_signals.py +39 -38
- django_cfg/apps/payments/static/payments/js/ngrok-status.js +12 -8
- django_cfg/apps/payments/static/payments/js/payment-detail.js +1 -1
- django_cfg/apps/payments/static/payments/js/payment-form.js +3 -3
- django_cfg/apps/payments/static/payments/js/payment-list.js +13 -6
- django_cfg/apps/payments/static/payments/js/webhook-dashboard-mjs.js +241 -0
- django_cfg/apps/payments/tasks/__init__.py +11 -12
- django_cfg/apps/payments/tasks/types.py +10 -9
- django_cfg/apps/payments/tasks/usage_tracking.py +44 -46
- django_cfg/apps/payments/templatetags/payment_tags.py +27 -27
- django_cfg/apps/payments/urls.py +31 -14
- django_cfg/apps/payments/urls_admin.py +10 -10
- django_cfg/apps/payments/views/api/__init__.py +32 -33
- django_cfg/apps/payments/views/api/api_keys.py +62 -62
- django_cfg/apps/payments/views/api/balances.py +63 -64
- django_cfg/apps/payments/views/api/base.py +52 -52
- django_cfg/apps/payments/views/api/currencies.py +75 -63
- django_cfg/apps/payments/views/api/payments.py +73 -74
- django_cfg/apps/payments/views/api/subscriptions.py +71 -72
- django_cfg/apps/payments/views/api/webhooks.py +85 -84
- django_cfg/apps/payments/views/overview/__init__.py +7 -7
- django_cfg/apps/payments/views/overview/serializers.py +13 -14
- django_cfg/apps/payments/views/overview/services.py +66 -67
- django_cfg/apps/payments/views/overview/urls.py +2 -1
- django_cfg/apps/payments/views/overview/views.py +31 -31
- django_cfg/apps/payments/views/serializers/__init__.py +35 -36
- django_cfg/apps/payments/views/serializers/api_keys.py +59 -57
- django_cfg/apps/payments/views/serializers/balances.py +34 -33
- django_cfg/apps/payments/views/serializers/currencies.py +36 -34
- django_cfg/apps/payments/views/serializers/payments.py +48 -47
- django_cfg/apps/payments/views/serializers/subscriptions.py +50 -45
- django_cfg/apps/payments/views/serializers/webhooks.py +17 -16
- django_cfg/apps/support/admin/__init__.py +3 -3
- django_cfg/apps/support/admin/resources.py +26 -26
- django_cfg/apps/support/admin/support_admin.py +44 -48
- django_cfg/apps/support/admin.py +16 -15
- django_cfg/apps/support/apps.py +1 -1
- django_cfg/apps/support/managers/message_manager.py +4 -4
- django_cfg/apps/support/managers/ticket_manager.py +13 -12
- django_cfg/apps/support/migrations/0001_initial.py +2 -1
- django_cfg/apps/support/models.py +3 -1
- django_cfg/apps/support/serializers.py +4 -2
- django_cfg/apps/support/signals.py +12 -10
- django_cfg/apps/support/urls.py +4 -3
- django_cfg/apps/support/utils/support_email_service.py +11 -9
- django_cfg/apps/support/views/__init__.py +3 -3
- django_cfg/apps/support/views/admin.py +9 -9
- django_cfg/apps/support/views/api.py +10 -9
- django_cfg/apps/support/views/chat.py +14 -14
- django_cfg/apps/tasks/admin/tasks_admin.py +65 -74
- django_cfg/apps/tasks/apps.py +2 -2
- django_cfg/apps/tasks/serializers.py +6 -6
- django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +44 -20
- django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +7 -5
- django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +5 -3
- django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +5 -3
- django_cfg/apps/tasks/tasks/demo_tasks.py +12 -11
- django_cfg/apps/tasks/templates/tasks/components/tasks_mjs_integration.html +269 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard-improved.html +168 -0
- django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +21 -2
- django_cfg/apps/tasks/urls.py +3 -2
- django_cfg/apps/tasks/urls_admin.py +1 -0
- django_cfg/apps/tasks/utils/simulator.py +49 -52
- django_cfg/apps/tasks/views/api.py +75 -73
- django_cfg/apps/tasks/views/dashboard.py +5 -4
- django_cfg/apps/urls.py +20 -11
- django_cfg/apps.py +6 -5
- django_cfg/cli/commands/create_project.py +7 -6
- django_cfg/cli/commands/info.py +25 -25
- django_cfg/cli/utils.py +27 -27
- django_cfg/config.py +1 -1
- django_cfg/core/__init__.py +8 -8
- django_cfg/core/base/config_model.py +13 -12
- django_cfg/core/builders/apps_builder.py +2 -2
- django_cfg/core/builders/middleware_builder.py +1 -1
- django_cfg/core/builders/security_builder.py +1 -1
- django_cfg/core/config.py +2 -2
- django_cfg/core/environment/detector.py +27 -28
- django_cfg/core/exceptions.py +1 -1
- django_cfg/core/generation/core_generators/settings.py +1 -1
- django_cfg/core/generation/core_generators/static.py +11 -5
- django_cfg/core/generation/core_generators/templates.py +1 -1
- django_cfg/core/generation/data_generators/__init__.py +1 -1
- django_cfg/core/generation/data_generators/cache.py +1 -1
- django_cfg/core/generation/data_generators/database.py +1 -1
- django_cfg/core/generation/generation.py +1 -3
- django_cfg/core/generation/integration_generators/__init__.py +2 -2
- django_cfg/core/generation/integration_generators/api.py +12 -2
- django_cfg/core/generation/integration_generators/sessions.py +1 -1
- django_cfg/core/generation/integration_generators/tailwind.py +1 -1
- django_cfg/core/generation/integration_generators/tasks.py +1 -1
- django_cfg/core/generation/integration_generators/third_party.py +1 -1
- django_cfg/core/generation/orchestrator.py +1 -1
- django_cfg/core/generation/protocols.py +1 -1
- django_cfg/core/generation/utility_generators/__init__.py +1 -1
- django_cfg/core/generation/utility_generators/email.py +1 -1
- django_cfg/core/generation/utility_generators/i18n.py +1 -1
- django_cfg/core/generation/utility_generators/limits.py +1 -1
- django_cfg/core/generation/utility_generators/logging.py +1 -1
- django_cfg/core/generation/utility_generators/security.py +1 -1
- django_cfg/core/generation/utils/helpers.py +1 -1
- django_cfg/core/integration/__init__.py +5 -5
- django_cfg/core/integration/commands_collector.py +38 -39
- django_cfg/core/integration/display/__init__.py +2 -2
- django_cfg/core/integration/display/base.py +30 -30
- django_cfg/core/integration/display/ngrok.py +35 -36
- django_cfg/core/integration/display/startup.py +149 -139
- django_cfg/core/integration/url_integration.py +10 -10
- django_cfg/core/integration/version_checker.py +20 -19
- django_cfg/core/services/config_service.py +4 -4
- django_cfg/core/state/__init__.py +1 -1
- django_cfg/core/state/registry.py +1 -1
- django_cfg/core/types/__init__.py +8 -1
- django_cfg/core/validation.py +36 -39
- django_cfg/management/commands/check_endpoints.py +3 -1
- django_cfg/management/commands/check_settings.py +3 -1
- django_cfg/management/commands/clear_constance.py +3 -1
- django_cfg/management/commands/create_token.py +3 -1
- django_cfg/management/commands/generate_clients.py +3 -1
- django_cfg/management/commands/migrate_all.py +3 -1
- django_cfg/management/commands/rundramatiq.py +3 -1
- django_cfg/management/commands/rundramatiq_simulator.py +3 -1
- django_cfg/management/commands/runserver_ngrok.py +3 -1
- django_cfg/management/commands/show_config.py +3 -1
- django_cfg/management/commands/superuser.py +3 -1
- django_cfg/management/commands/task_clear.py +3 -1
- django_cfg/management/commands/task_status.py +3 -1
- django_cfg/management/commands/test_email.py +3 -1
- django_cfg/management/commands/test_telegram.py +3 -1
- django_cfg/management/commands/test_twilio.py +3 -1
- django_cfg/management/commands/validate_openapi.py +3 -1
- django_cfg/middleware/pagination.py +8 -8
- django_cfg/middleware/public_endpoints.py +24 -23
- django_cfg/middleware/user_activity.py +27 -25
- django_cfg/models/__init__.py +19 -20
- django_cfg/models/api/__init__.py +4 -4
- django_cfg/models/api/config.py +23 -21
- django_cfg/models/api/cors.py +17 -16
- django_cfg/models/api/drf/__init__.py +1 -1
- django_cfg/models/api/drf/config.py +2 -1
- django_cfg/models/api/drf/redoc.py +2 -1
- django_cfg/models/api/drf/spectacular.py +4 -2
- django_cfg/models/api/drf/swagger.py +2 -1
- django_cfg/models/api/jwt.py +37 -36
- django_cfg/models/api/keys.py +13 -12
- django_cfg/models/api/limits.py +31 -30
- django_cfg/models/base/config.py +40 -41
- django_cfg/models/base/module.py +8 -8
- django_cfg/models/django/__init__.py +1 -1
- django_cfg/models/django/constance.py +8 -7
- django_cfg/models/django/environment.py +5 -3
- django_cfg/models/django/openapi.py +6 -16
- django_cfg/models/django/revolution_legacy.py +17 -16
- django_cfg/models/infrastructure/__init__.py +1 -1
- django_cfg/models/infrastructure/cache.py +46 -45
- django_cfg/models/infrastructure/database/config.py +4 -6
- django_cfg/models/infrastructure/database/converters.py +1 -1
- django_cfg/models/infrastructure/database/parsers.py +1 -1
- django_cfg/models/infrastructure/database/validators.py +1 -1
- django_cfg/models/infrastructure/logging.py +59 -57
- django_cfg/models/infrastructure/security.py +26 -24
- django_cfg/models/ngrok/auth.py +2 -1
- django_cfg/models/ngrok/config.py +3 -2
- django_cfg/models/ngrok/tunnel.py +2 -1
- django_cfg/models/payments/__init__.py +1 -1
- django_cfg/models/payments/api_keys.py +3 -1
- django_cfg/models/payments/config.py +4 -1
- django_cfg/models/payments/providers/base.py +2 -1
- django_cfg/models/payments/providers/nowpayments.py +3 -1
- django_cfg/models/services/__init__.py +1 -1
- django_cfg/models/services/base.py +2 -1
- django_cfg/models/services/email.py +28 -26
- django_cfg/models/services/telegram.py +2 -1
- django_cfg/models/tasks/__init__.py +2 -2
- django_cfg/models/tasks/backends.py +4 -3
- django_cfg/models/tasks/config.py +6 -4
- django_cfg/models/tasks/utils.py +3 -3
- django_cfg/modules/base.py +18 -17
- django_cfg/modules/django_admin/__init__.py +14 -15
- django_cfg/modules/django_admin/decorators/__init__.py +1 -1
- django_cfg/modules/django_admin/decorators/actions.py +8 -7
- django_cfg/modules/django_admin/decorators/display.py +9 -7
- django_cfg/modules/django_admin/icons/__init__.py +1 -1
- django_cfg/modules/django_admin/icons/constants.py +27 -27
- django_cfg/modules/django_admin/icons/generate_icons.py +54 -54
- django_cfg/modules/django_admin/management/commands/check_endpoints.py +5 -3
- django_cfg/modules/django_admin/management/commands/check_settings.py +40 -44
- django_cfg/modules/django_admin/management/commands/clear_constance.py +29 -30
- django_cfg/modules/django_admin/management/commands/create_token.py +42 -42
- django_cfg/modules/django_admin/management/commands/list_urls.py +37 -38
- django_cfg/modules/django_admin/management/commands/migrate_all.py +13 -15
- django_cfg/modules/django_admin/management/commands/migrator.py +17 -17
- django_cfg/modules/django_admin/management/commands/script.py +58 -60
- django_cfg/modules/django_admin/management/commands/show_config.py +32 -30
- django_cfg/modules/django_admin/management/commands/show_urls.py +46 -44
- django_cfg/modules/django_admin/management/commands/superuser.py +47 -48
- django_cfg/modules/django_admin/management/commands/tree.py +50 -54
- django_cfg/modules/django_admin/mixins/display_mixin.py +16 -15
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +9 -8
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +25 -24
- django_cfg/modules/django_admin/models/__init__.py +4 -4
- django_cfg/modules/django_admin/models/action_models.py +3 -1
- django_cfg/modules/django_admin/models/badge_models.py +4 -2
- django_cfg/modules/django_admin/models/base.py +3 -3
- django_cfg/modules/django_admin/models/display_models.py +1 -0
- django_cfg/modules/django_admin/utils/badges.py +27 -26
- django_cfg/modules/django_admin/utils/displays.py +49 -49
- django_cfg/modules/django_client/apps.py +21 -3
- django_cfg/modules/django_client/core/__init__.py +9 -10
- django_cfg/modules/django_client/core/archive/manager.py +2 -2
- django_cfg/modules/django_client/core/cli/main.py +1 -3
- django_cfg/modules/django_client/core/config/config.py +3 -1
- django_cfg/modules/django_client/core/config/group.py +1 -0
- django_cfg/modules/django_client/core/config/service.py +2 -1
- django_cfg/modules/django_client/core/generator/__init__.py +1 -1
- django_cfg/modules/django_client/core/generator/base.py +2 -2
- django_cfg/modules/django_client/core/generator/python/async_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/python/files_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/generator.py +4 -4
- django_cfg/modules/django_client/core/generator/python/models_generator.py +1 -1
- django_cfg/modules/django_client/core/generator/python/operations_generator.py +2 -2
- django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +1 -1
- django_cfg/modules/django_client/core/generator/typescript/client_generator.py +3 -1
- django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +14 -13
- django_cfg/modules/django_client/core/generator/typescript/files_generator.py +1 -0
- django_cfg/modules/django_client/core/generator/typescript/generator.py +6 -6
- django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/models_generator.py +2 -1
- django_cfg/modules/django_client/core/generator/typescript/naming.py +2 -3
- django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +12 -10
- django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +3 -2
- django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +14 -6
- django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +4 -10
- django_cfg/modules/django_client/core/groups/__init__.py +1 -1
- django_cfg/modules/django_client/core/groups/detector.py +2 -1
- django_cfg/modules/django_client/core/groups/manager.py +2 -1
- django_cfg/modules/django_client/core/ir/schema.py +1 -1
- django_cfg/modules/django_client/core/parser/base.py +0 -2
- django_cfg/modules/django_client/core/parser/models/schema.py +1 -1
- django_cfg/modules/django_client/core/validation/__init__.py +1 -1
- django_cfg/modules/django_client/core/validation/fixer.py +1 -2
- django_cfg/modules/django_client/core/validation/reporter.py +2 -2
- django_cfg/modules/django_client/core/validation/safety.py +1 -1
- django_cfg/modules/django_client/management/commands/generate_client.py +14 -11
- django_cfg/modules/django_client/management/commands/validate_openapi.py +4 -6
- django_cfg/modules/django_client/spectacular/__init__.py +1 -1
- django_cfg/modules/django_client/spectacular/async_detection.py +3 -2
- django_cfg/modules/django_client/spectacular/enum_naming.py +1 -1
- django_cfg/modules/django_client/spectacular/schema.py +5 -5
- django_cfg/modules/django_client/system/__init__.py +24 -0
- django_cfg/modules/django_client/system/base_generator.py +123 -0
- django_cfg/modules/django_client/system/generate_mjs_clients.py +174 -0
- django_cfg/modules/django_client/system/mjs_generator.py +219 -0
- django_cfg/modules/django_client/system/schema_parser.py +195 -0
- django_cfg/modules/django_client/system/templates/api_client.js.j2 +87 -0
- django_cfg/modules/django_client/system/templates/app_index.js.j2 +13 -0
- django_cfg/modules/django_client/system/templates/base_client.js.j2 +166 -0
- django_cfg/modules/django_client/system/templates/main_index.js.j2 +80 -0
- django_cfg/modules/django_client/system/templates/types.js.j2 +24 -0
- django_cfg/modules/django_client/urls.py +3 -2
- django_cfg/modules/django_currency/__init__.py +17 -18
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/coinpaprika_client.py +48 -48
- django_cfg/modules/django_currency/clients/hybrid_client.py +76 -75
- django_cfg/modules/django_currency/core/__init__.py +7 -13
- django_cfg/modules/django_currency/core/converter.py +25 -24
- django_cfg/modules/django_currency/core/models.py +9 -8
- django_cfg/modules/django_currency/database/__init__.py +4 -4
- django_cfg/modules/django_currency/database/database_loader.py +65 -66
- django_cfg/modules/django_currency/examples/example_database_usage.py +29 -28
- django_cfg/modules/django_currency/utils/cache.py +10 -11
- django_cfg/modules/django_dashboard/__init__.py +4 -5
- django_cfg/modules/django_dashboard/components.py +11 -7
- django_cfg/modules/django_dashboard/debug.py +1 -3
- django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +3 -3
- django_cfg/modules/django_dashboard/sections/base.py +2 -1
- django_cfg/modules/django_dashboard/sections/commands.py +3 -2
- django_cfg/modules/django_dashboard/sections/documentation.py +8 -6
- django_cfg/modules/django_dashboard/sections/overview.py +13 -9
- django_cfg/modules/django_dashboard/sections/stats.py +2 -2
- django_cfg/modules/django_dashboard/sections/system.py +2 -1
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +12 -4
- django_cfg/modules/django_email/management/commands/test_email.py +8 -7
- django_cfg/modules/django_email/service.py +5 -4
- django_cfg/modules/django_health/service.py +46 -44
- django_cfg/modules/django_import_export/__init__.py +7 -3
- django_cfg/modules/django_llm/__init__.py +3 -2
- django_cfg/modules/django_llm/example.py +58 -56
- django_cfg/modules/django_llm/llm/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/cache.py +21 -20
- django_cfg/modules/django_llm/llm/client.py +9 -9
- django_cfg/modules/django_llm/llm/costs.py +14 -14
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +1 -1
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +1 -2
- django_cfg/modules/django_llm/llm/extractor.py +8 -8
- django_cfg/modules/django_llm/llm/models.py +5 -5
- django_cfg/modules/django_llm/llm/models_api/models_query.py +2 -2
- django_cfg/modules/django_llm/llm/models_cache.py +91 -92
- django_cfg/modules/django_llm/llm/providers/config_builder.py +1 -1
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +2 -1
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +1 -1
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +2 -2
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +1 -1
- django_cfg/modules/django_llm/llm/responses/response_builder.py +2 -2
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +1 -1
- django_cfg/modules/django_llm/llm/tokenizer.py +10 -9
- django_cfg/modules/django_llm/translator/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/cache.py +36 -35
- django_cfg/modules/django_llm/translator/detectors/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +0 -1
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +1 -1
- django_cfg/modules/django_llm/translator/translator.py +5 -4
- django_cfg/modules/django_llm/translator/translators/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/translators/json_translator.py +1 -1
- django_cfg/modules/django_llm/translator/utils/__init__.py +1 -1
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +0 -1
- django_cfg/modules/django_logging/__init__.py +1 -1
- django_cfg/modules/django_logging/django_logger.py +33 -34
- django_cfg/modules/django_logging/logger.py +3 -7
- django_cfg/modules/django_ngrok/__init__.py +7 -7
- django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +33 -30
- django_cfg/modules/django_ngrok/service.py +33 -32
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +4 -36
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +1 -1
- django_cfg/modules/django_tasks/__init__.py +5 -5
- django_cfg/modules/django_tasks/dramatiq_setup.py +1 -1
- django_cfg/modules/django_tasks/factory.py +1 -1
- django_cfg/modules/django_tasks/management/commands/rundramatiq.py +39 -40
- django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +79 -80
- django_cfg/modules/django_tasks/management/commands/task_clear.py +34 -34
- django_cfg/modules/django_tasks/management/commands/task_status.py +34 -34
- django_cfg/modules/django_tasks/service.py +4 -3
- django_cfg/modules/django_tasks/settings.py +1 -1
- django_cfg/modules/django_telegram/__init__.py +4 -4
- django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -5
- django_cfg/modules/django_telegram/service.py +4 -3
- django_cfg/modules/django_telegram/utils.py +1 -1
- django_cfg/modules/django_twilio/__init__.py +15 -16
- django_cfg/modules/django_twilio/_imports.py +1 -1
- django_cfg/modules/django_twilio/base.py +9 -5
- django_cfg/modules/django_twilio/email_otp.py +4 -3
- django_cfg/modules/django_twilio/exceptions.py +36 -36
- django_cfg/modules/django_twilio/management/commands/test_twilio.py +6 -7
- django_cfg/modules/django_twilio/models.py +54 -53
- django_cfg/modules/django_twilio/sendgrid_service.py +70 -72
- django_cfg/modules/django_twilio/simple_service.py +42 -41
- django_cfg/modules/django_twilio/sms.py +1 -0
- django_cfg/modules/django_twilio/twilio_service.py +79 -83
- django_cfg/modules/django_twilio/unified.py +6 -5
- django_cfg/modules/django_twilio/utils.py +2 -3
- django_cfg/modules/django_twilio/whatsapp.py +3 -2
- django_cfg/modules/django_unfold/__init__.py +7 -6
- django_cfg/modules/django_unfold/callbacks/actions.py +6 -5
- django_cfg/modules/django_unfold/callbacks/apizones.py +122 -0
- django_cfg/modules/django_unfold/callbacks/base.py +9 -8
- django_cfg/modules/django_unfold/callbacks/charts.py +36 -37
- django_cfg/modules/django_unfold/callbacks/commands.py +2 -2
- django_cfg/modules/django_unfold/callbacks/main.py +27 -27
- django_cfg/modules/django_unfold/callbacks/statistics.py +12 -12
- django_cfg/modules/django_unfold/callbacks/system.py +5 -5
- django_cfg/modules/django_unfold/callbacks/users.py +4 -4
- django_cfg/modules/django_unfold/dashboard.py +29 -29
- django_cfg/modules/django_unfold/models/__init__.py +23 -8
- django_cfg/modules/django_unfold/models/config.py +84 -81
- django_cfg/modules/django_unfold/models/dashboard.py +20 -19
- django_cfg/modules/django_unfold/models/dropdown.py +6 -4
- django_cfg/modules/django_unfold/models/navigation.py +6 -4
- django_cfg/modules/django_unfold/models/tabs.py +4 -3
- django_cfg/modules/django_unfold/models.py +2 -3
- django_cfg/modules/django_unfold/system_monitor.py +27 -25
- django_cfg/modules/django_unfold/tailwind.py +12 -14
- django_cfg/modules/django_unfold/utils.py +7 -6
- django_cfg/pyproject.toml +1 -1
- django_cfg/registry/__init__.py +3 -3
- django_cfg/registry/core.py +8 -8
- django_cfg/registry/modules.py +2 -2
- django_cfg/registry/services.py +2 -2
- django_cfg/registry/third_party.py +3 -3
- django_cfg/routing/__init__.py +3 -3
- django_cfg/routing/callbacks.py +27 -26
- django_cfg/routing/routers.py +2 -2
- django_cfg/static/js/api/accounts/client.mjs +69 -0
- django_cfg/static/js/api/accounts/index.mjs +13 -0
- django_cfg/static/js/api/base.mjs +166 -0
- django_cfg/static/js/api/index.mjs +100 -0
- django_cfg/static/js/api/ipc/client.mjs +74 -0
- django_cfg/static/js/api/ipc/index.mjs +13 -0
- django_cfg/static/js/api/leads/client.mjs +71 -0
- django_cfg/static/js/api/leads/index.mjs +13 -0
- django_cfg/static/js/api/newsletter/client.mjs +109 -0
- django_cfg/static/js/api/newsletter/index.mjs +13 -0
- django_cfg/static/js/api/payments/client.mjs +1264 -0
- django_cfg/static/js/api/payments/index.mjs +13 -0
- django_cfg/static/js/api/support/client.mjs +84 -0
- django_cfg/static/js/api/support/index.mjs +13 -0
- django_cfg/static/js/api/tasks/client.mjs +74 -0
- django_cfg/static/js/api/tasks/index.mjs +13 -0
- django_cfg/static/js/api/types.mjs +729 -0
- django_cfg/static/js/api-loader.mjs +169 -0
- django_cfg/templates/admin/snippets/zones/zones_table.html +4 -3
- django_cfg/templatetags/django_cfg.py +4 -4
- django_cfg/utils/path_resolution.py +49 -50
- django_cfg/utils/smart_defaults.py +27 -29
- django_cfg/utils/version_check.py +14 -14
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/METADATA +1 -1
- django_cfg-1.4.23.dist-info/RECORD +1137 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +0 -408
- django_cfg/modules/django_ipc_client/dashboard/README.md +0 -517
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +0 -439
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +0 -11
- django_cfg/modules/django_ipc_client/dashboard/apps.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +0 -200
- django_cfg/modules/django_ipc_client/dashboard/urls.py +0 -22
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +0 -9
- django_cfg/modules/django_ipc_client/dashboard/views.py +0 -251
- django_cfg/modules/django_rpc_old/POETRY.md +0 -344
- django_cfg/modules/django_rpc_old/README.md +0 -397
- django_cfg/modules/django_rpc_old/TESTING.md +0 -358
- django_cfg/modules/django_rpc_old/__init__.py +0 -39
- django_cfg/modules/django_rpc_old/client.py +0 -531
- django_cfg/modules/django_rpc_old/config.py +0 -279
- django_cfg/modules/django_rpc_old/exceptions.py +0 -172
- django_cfg/modules/django_unfold/callbacks/revolution.py +0 -81
- django_cfg-1.4.21.dist-info/RECORD +0 -1111
- /django_cfg/{modules/django_ipc_client → apps/ipc}/README.md +0 -0
- /django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/config.py +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.23.dist-info}/licenses/LICENSE +0 -0
@@ -5,24 +5,27 @@ This module provides the main batch processing engine for generating
|
|
5
5
|
embeddings with optimized API calls and database operations.
|
6
6
|
"""
|
7
7
|
|
8
|
-
import time
|
9
8
|
import logging
|
10
|
-
|
9
|
+
import time
|
10
|
+
from typing import List, Optional
|
11
11
|
|
12
|
-
from django_cfg.apps.knowbase.
|
13
|
-
from django_cfg.apps.knowbase.
|
12
|
+
from django_cfg.apps.knowbase.config.settings import get_cache_settings
|
13
|
+
from django_cfg.apps.knowbase.utils.chunk_settings import (
|
14
|
+
get_embedding_batch_size,
|
15
|
+
get_embedding_model,
|
16
|
+
)
|
14
17
|
from django_cfg.modules.django_llm.llm.client import LLMClient
|
15
18
|
|
16
|
-
from .models import ChunkData, EmbeddingResult, BatchProcessingResult, ProcessingConfig, ChunkType
|
17
|
-
from .processors import DocumentChunkProcessor, ArchiveChunkProcessor, ExternalDataChunkProcessor
|
18
19
|
from .batch_result import BatchResultBuilder
|
20
|
+
from .models import BatchProcessingResult, ChunkData, ChunkType, EmbeddingResult
|
21
|
+
from .processors import ArchiveChunkProcessor, DocumentChunkProcessor, ExternalDataChunkProcessor
|
19
22
|
|
20
23
|
logger = logging.getLogger(__name__)
|
21
24
|
|
22
25
|
|
23
26
|
class OptimizedEmbeddingProcessor:
|
24
27
|
"""High-performance embedding processor with batch operations."""
|
25
|
-
|
28
|
+
|
26
29
|
def __init__(self, batch_size: Optional[int] = None, embedding_model: Optional[str] = None):
|
27
30
|
"""
|
28
31
|
Initialize the processor.
|
@@ -34,7 +37,7 @@ class OptimizedEmbeddingProcessor:
|
|
34
37
|
# Use Constance settings if not provided
|
35
38
|
self.batch_size = min(batch_size or get_embedding_batch_size(), 100) # Conservative limit for stability
|
36
39
|
self.embedding_model = embedding_model or get_embedding_model()
|
37
|
-
|
40
|
+
|
38
41
|
# Initialize LLM client with OpenAI only for embeddings
|
39
42
|
# OpenRouter doesn't support embedding models, so we use OpenAI directly
|
40
43
|
# Use auto-configured LLMClient with explicit OpenAI preference for embeddings
|
@@ -46,16 +49,16 @@ class OptimizedEmbeddingProcessor:
|
|
46
49
|
cache_ttl=cache_settings.cache_ttl,
|
47
50
|
max_cache_size=cache_settings.max_cache_size
|
48
51
|
)
|
49
|
-
|
52
|
+
|
50
53
|
# Processors for different chunk types
|
51
54
|
self.processors = {
|
52
55
|
ChunkType.DOCUMENT: DocumentChunkProcessor(),
|
53
56
|
ChunkType.ARCHIVE: ArchiveChunkProcessor(),
|
54
57
|
ChunkType.EXTERNAL_DATA: ExternalDataChunkProcessor()
|
55
58
|
}
|
56
|
-
|
59
|
+
|
57
60
|
logger.info(f"🚀 OptimizedEmbeddingProcessor initialized: batch_size={self.batch_size}, model={self.embedding_model}")
|
58
|
-
|
61
|
+
|
59
62
|
def process_chunks_batch(self, chunks: List[ChunkData]) -> BatchProcessingResult:
|
60
63
|
"""
|
61
64
|
Process multiple chunks with optimized batch operations.
|
@@ -69,53 +72,53 @@ class OptimizedEmbeddingProcessor:
|
|
69
72
|
start_time = time.time()
|
70
73
|
total_chunks = len(chunks)
|
71
74
|
result_builder = BatchResultBuilder(total_chunks)
|
72
|
-
|
75
|
+
|
73
76
|
logger.info(f"🔮 Starting batch processing of {total_chunks} chunks")
|
74
|
-
|
77
|
+
|
75
78
|
# Process in batches
|
76
79
|
for i in range(0, total_chunks, self.batch_size):
|
77
80
|
batch = chunks[i:i + self.batch_size]
|
78
81
|
batch_num = (i // self.batch_size) + 1
|
79
82
|
total_batches = (total_chunks + self.batch_size - 1) // self.batch_size
|
80
|
-
|
83
|
+
|
81
84
|
logger.info(f"🔮 Processing batch {batch_num}/{total_batches} ({len(batch)} chunks)")
|
82
|
-
|
85
|
+
|
83
86
|
try:
|
84
87
|
batch_results = self._process_single_batch(batch)
|
85
88
|
result_builder.add_batch_results(batch_results)
|
86
|
-
|
89
|
+
|
87
90
|
# Small delay between batches to respect rate limits
|
88
91
|
if i + self.batch_size < total_chunks:
|
89
92
|
time.sleep(0.5)
|
90
|
-
|
93
|
+
|
91
94
|
except Exception as e:
|
92
95
|
error_msg = f"Batch {batch_num} failed: {str(e)}"
|
93
96
|
logger.error(f"❌ {error_msg}")
|
94
97
|
result_builder.add_batch_error(error_msg, len(batch))
|
95
|
-
|
98
|
+
|
96
99
|
processing_time = time.time() - start_time
|
97
100
|
result = result_builder.build(processing_time)
|
98
|
-
|
101
|
+
|
99
102
|
# Log using Pydantic model's summary
|
100
103
|
summary = result.model_dump_summary()
|
101
104
|
logger.info(f"🎉 Batch processing completed: {summary}")
|
102
105
|
logger.info(f"📊 Performance: {summary['chunks_per_second']} chunks/sec, {summary['avg_cost_per_chunk']} per chunk")
|
103
|
-
|
106
|
+
|
104
107
|
return result
|
105
|
-
|
108
|
+
|
106
109
|
def _process_single_batch(self, batch: List[ChunkData]) -> List[EmbeddingResult]:
|
107
110
|
"""Process a single batch of chunks and return list of EmbeddingResult."""
|
108
|
-
|
111
|
+
|
109
112
|
# Prepare content for all chunks
|
110
113
|
prepared_contents = []
|
111
114
|
chunk_mapping = {} # Map index to chunk
|
112
|
-
|
115
|
+
|
113
116
|
for idx, chunk in enumerate(batch):
|
114
117
|
processor = self.processors.get(chunk.parent_type)
|
115
118
|
if not processor:
|
116
119
|
logger.warning(f"⚠️ Unknown chunk type: {chunk.parent_type}")
|
117
120
|
continue
|
118
|
-
|
121
|
+
|
119
122
|
try:
|
120
123
|
content = processor.prepare_content_for_embedding(chunk)
|
121
124
|
if content and content.strip():
|
@@ -125,7 +128,7 @@ class OptimizedEmbeddingProcessor:
|
|
125
128
|
logger.warning(f"⚠️ Empty content for chunk {chunk.id}")
|
126
129
|
except Exception as e:
|
127
130
|
logger.error(f"❌ Failed to prepare content for chunk {chunk.id}: {e}")
|
128
|
-
|
131
|
+
|
129
132
|
if not prepared_contents:
|
130
133
|
# Return failed results for all chunks
|
131
134
|
return [
|
@@ -136,24 +139,24 @@ class OptimizedEmbeddingProcessor:
|
|
136
139
|
)
|
137
140
|
for chunk in batch
|
138
141
|
]
|
139
|
-
|
142
|
+
|
140
143
|
# Generate embeddings in batch
|
141
144
|
try:
|
142
145
|
embedding_results = self._generate_batch_embeddings(prepared_contents)
|
143
|
-
|
146
|
+
|
144
147
|
# Process and save results
|
145
148
|
final_results = []
|
146
|
-
|
149
|
+
|
147
150
|
for idx, embedding_result in enumerate(embedding_results):
|
148
151
|
if idx not in chunk_mapping:
|
149
152
|
continue
|
150
|
-
|
153
|
+
|
151
154
|
chunk = chunk_mapping[idx]
|
152
155
|
processor = self.processors[chunk.parent_type]
|
153
|
-
|
156
|
+
|
154
157
|
# Set the chunk_id in the result
|
155
158
|
embedding_result.chunk_id = chunk.id
|
156
|
-
|
159
|
+
|
157
160
|
if embedding_result.success:
|
158
161
|
try:
|
159
162
|
logger.debug(f"🔄 Attempting to save embedding for chunk {chunk.id} (type: {chunk.parent_type})")
|
@@ -171,9 +174,9 @@ class OptimizedEmbeddingProcessor:
|
|
171
174
|
final_results.append(failed_result)
|
172
175
|
else:
|
173
176
|
final_results.append(embedding_result)
|
174
|
-
|
177
|
+
|
175
178
|
return final_results
|
176
|
-
|
179
|
+
|
177
180
|
except Exception as e:
|
178
181
|
error_msg = f"Batch embedding generation failed: {e}"
|
179
182
|
logger.error(f"❌ {error_msg}")
|
@@ -186,12 +189,12 @@ class OptimizedEmbeddingProcessor:
|
|
186
189
|
)
|
187
190
|
for chunk in batch
|
188
191
|
]
|
189
|
-
|
192
|
+
|
190
193
|
def _generate_batch_embeddings(self, contents: List[str]) -> List[EmbeddingResult]:
|
191
194
|
"""Generate embeddings for multiple contents using LLMClient."""
|
192
|
-
|
195
|
+
|
193
196
|
results = []
|
194
|
-
|
197
|
+
|
195
198
|
try:
|
196
199
|
# Use LLMClient's generate_embedding method for each content
|
197
200
|
# This handles both OpenAI and OpenRouter properly
|
@@ -202,7 +205,7 @@ class OptimizedEmbeddingProcessor:
|
|
202
205
|
text=content,
|
203
206
|
model=self.embedding_model
|
204
207
|
)
|
205
|
-
|
208
|
+
|
206
209
|
results.append(EmbeddingResult(
|
207
210
|
chunk_id="", # Will be set by caller
|
208
211
|
embedding=embedding_response.embedding,
|
@@ -210,7 +213,7 @@ class OptimizedEmbeddingProcessor:
|
|
210
213
|
cost=embedding_response.cost,
|
211
214
|
success=True
|
212
215
|
))
|
213
|
-
|
216
|
+
|
214
217
|
except Exception as e:
|
215
218
|
logger.error(f"❌ Failed to generate embedding for content {idx}: {e}")
|
216
219
|
results.append(EmbeddingResult(
|
@@ -221,19 +224,19 @@ class OptimizedEmbeddingProcessor:
|
|
221
224
|
success=False,
|
222
225
|
error=str(e)
|
223
226
|
))
|
224
|
-
|
227
|
+
|
225
228
|
successful_count = len([r for r in results if r.success])
|
226
229
|
logger.info(f"🎯 Generated {successful_count}/{len(results)} embeddings successfully")
|
227
|
-
|
230
|
+
|
228
231
|
# Log details of each result
|
229
232
|
for i, result in enumerate(results):
|
230
233
|
if result.success:
|
231
234
|
logger.debug(f" ✅ Result {i}: {result.tokens} tokens, ${result.cost:.4f}, embedding_len={len(result.embedding)}")
|
232
235
|
else:
|
233
236
|
logger.debug(f" ❌ Result {i}: {result.error}")
|
234
|
-
|
237
|
+
|
235
238
|
return results
|
236
|
-
|
239
|
+
|
237
240
|
except Exception as e:
|
238
241
|
logger.error(f"❌ Batch embedding generation failed: {e}")
|
239
242
|
# Return failed results for all contents
|
@@ -6,12 +6,13 @@ from individual batch operations without using raw dicts.
|
|
6
6
|
"""
|
7
7
|
|
8
8
|
from typing import List
|
9
|
+
|
9
10
|
from .models import BatchProcessingResult, EmbeddingResult
|
10
11
|
|
11
12
|
|
12
13
|
class BatchResultBuilder:
|
13
14
|
"""Builder for BatchProcessingResult to avoid raw dict usage."""
|
14
|
-
|
15
|
+
|
15
16
|
def __init__(self, total_chunks: int):
|
16
17
|
self.total_chunks = total_chunks
|
17
18
|
self.successful_chunks = 0
|
@@ -20,7 +21,7 @@ class BatchResultBuilder:
|
|
20
21
|
self.total_cost = 0.0
|
21
22
|
self.errors: List[str] = []
|
22
23
|
self.start_time: float = 0.0
|
23
|
-
|
24
|
+
|
24
25
|
def add_successful_result(self, result: EmbeddingResult) -> None:
|
25
26
|
"""Add a successful embedding result."""
|
26
27
|
if result.success:
|
@@ -29,12 +30,12 @@ class BatchResultBuilder:
|
|
29
30
|
self.total_cost += result.cost
|
30
31
|
else:
|
31
32
|
self.add_failed_result(result.error or "Unknown error")
|
32
|
-
|
33
|
+
|
33
34
|
def add_failed_result(self, error: str) -> None:
|
34
35
|
"""Add a failed result."""
|
35
36
|
self.failed_chunks += 1
|
36
37
|
self.errors.append(error)
|
37
|
-
|
38
|
+
|
38
39
|
def add_batch_results(self, results: List[EmbeddingResult]) -> None:
|
39
40
|
"""Add multiple results from a batch."""
|
40
41
|
for result in results:
|
@@ -42,12 +43,12 @@ class BatchResultBuilder:
|
|
42
43
|
self.add_successful_result(result)
|
43
44
|
else:
|
44
45
|
self.add_failed_result(result.error or "Unknown error")
|
45
|
-
|
46
|
+
|
46
47
|
def add_batch_error(self, error: str, chunk_count: int) -> None:
|
47
48
|
"""Add an error that affected an entire batch."""
|
48
49
|
self.failed_chunks += chunk_count
|
49
50
|
self.errors.append(error)
|
50
|
-
|
51
|
+
|
51
52
|
def build(self, processing_time: float) -> BatchProcessingResult:
|
52
53
|
"""Build the final BatchProcessingResult."""
|
53
54
|
return BatchProcessingResult(
|
@@ -5,9 +5,10 @@ This module defines the core data structures used throughout
|
|
5
5
|
the embedding processing pipeline using Pydantic for type safety.
|
6
6
|
"""
|
7
7
|
|
8
|
-
from typing import List, Dict, Any, Optional
|
9
|
-
from pydantic import BaseModel, Field, field_validator, ValidationInfo
|
10
8
|
from enum import Enum
|
9
|
+
from typing import Any, Dict, List, Optional
|
10
|
+
|
11
|
+
from pydantic import BaseModel, Field, ValidationInfo, field_validator
|
11
12
|
|
12
13
|
|
13
14
|
class ChunkType(str, Enum):
|
@@ -23,25 +24,25 @@ class ChunkData(BaseModel):
|
|
23
24
|
id: str = Field(..., description="Unique chunk identifier")
|
24
25
|
content: str = Field(..., min_length=1, description="Chunk content text")
|
25
26
|
context_metadata: Optional[Dict[str, Any]] = Field(
|
26
|
-
default=None,
|
27
|
+
default=None,
|
27
28
|
description="Additional context metadata for the chunk"
|
28
29
|
)
|
29
30
|
parent_id: Optional[str] = Field(
|
30
|
-
default=None,
|
31
|
+
default=None,
|
31
32
|
description="ID of the parent document or archive"
|
32
33
|
)
|
33
34
|
parent_type: ChunkType = Field(
|
34
|
-
default=ChunkType.UNKNOWN,
|
35
|
+
default=ChunkType.UNKNOWN,
|
35
36
|
description="Type of parent content"
|
36
37
|
)
|
37
|
-
|
38
|
+
|
38
39
|
@field_validator('content')
|
39
40
|
@classmethod
|
40
41
|
def content_must_not_be_empty(cls, v):
|
41
42
|
if not v or not v.strip():
|
42
43
|
raise ValueError('Content cannot be empty')
|
43
44
|
return v.strip()
|
44
|
-
|
45
|
+
|
45
46
|
class Config:
|
46
47
|
use_enum_values = True
|
47
48
|
|
@@ -50,33 +51,33 @@ class EmbeddingResult(BaseModel):
|
|
50
51
|
"""Result of embedding generation."""
|
51
52
|
chunk_id: str = Field(..., description="ID of the processed chunk")
|
52
53
|
embedding: List[float] = Field(
|
53
|
-
default_factory=list,
|
54
|
+
default_factory=list,
|
54
55
|
description="Generated embedding vector"
|
55
56
|
)
|
56
57
|
tokens: int = Field(
|
57
|
-
default=0,
|
58
|
-
ge=0,
|
58
|
+
default=0,
|
59
|
+
ge=0,
|
59
60
|
description="Number of tokens used"
|
60
61
|
)
|
61
62
|
cost: float = Field(
|
62
|
-
default=0.0,
|
63
|
-
ge=0.0,
|
63
|
+
default=0.0,
|
64
|
+
ge=0.0,
|
64
65
|
description="Processing cost in USD"
|
65
66
|
)
|
66
67
|
success: bool = Field(
|
67
|
-
default=True,
|
68
|
+
default=True,
|
68
69
|
description="Whether embedding generation was successful"
|
69
70
|
)
|
70
71
|
error: Optional[str] = Field(
|
71
|
-
default=None,
|
72
|
+
default=None,
|
72
73
|
description="Error message if processing failed"
|
73
74
|
)
|
74
75
|
processing_time: Optional[float] = Field(
|
75
|
-
default=None,
|
76
|
-
ge=0.0,
|
76
|
+
default=None,
|
77
|
+
ge=0.0,
|
77
78
|
description="Time taken to process this chunk in seconds"
|
78
79
|
)
|
79
|
-
|
80
|
+
|
80
81
|
@field_validator('embedding')
|
81
82
|
@classmethod
|
82
83
|
def validate_embedding_dimension(cls, v):
|
@@ -84,7 +85,7 @@ class EmbeddingResult(BaseModel):
|
|
84
85
|
# Warning, not error - allow different dimensions
|
85
86
|
pass
|
86
87
|
return v
|
87
|
-
|
88
|
+
|
88
89
|
class Config:
|
89
90
|
validate_assignment = True
|
90
91
|
|
@@ -92,40 +93,40 @@ class EmbeddingResult(BaseModel):
|
|
92
93
|
class BatchProcessingResult(BaseModel):
|
93
94
|
"""Result of batch processing."""
|
94
95
|
total_chunks: int = Field(
|
95
|
-
...,
|
96
|
-
ge=0,
|
96
|
+
...,
|
97
|
+
ge=0,
|
97
98
|
description="Total number of chunks processed"
|
98
99
|
)
|
99
100
|
successful_chunks: int = Field(
|
100
|
-
...,
|
101
|
-
ge=0,
|
101
|
+
...,
|
102
|
+
ge=0,
|
102
103
|
description="Number of successfully processed chunks"
|
103
104
|
)
|
104
105
|
failed_chunks: int = Field(
|
105
|
-
...,
|
106
|
-
ge=0,
|
106
|
+
...,
|
107
|
+
ge=0,
|
107
108
|
description="Number of failed chunks"
|
108
109
|
)
|
109
110
|
total_tokens: int = Field(
|
110
|
-
default=0,
|
111
|
-
ge=0,
|
111
|
+
default=0,
|
112
|
+
ge=0,
|
112
113
|
description="Total tokens used across all chunks"
|
113
114
|
)
|
114
115
|
total_cost: float = Field(
|
115
|
-
default=0.0,
|
116
|
-
ge=0.0,
|
116
|
+
default=0.0,
|
117
|
+
ge=0.0,
|
117
118
|
description="Total processing cost in USD"
|
118
119
|
)
|
119
120
|
processing_time: float = Field(
|
120
|
-
...,
|
121
|
-
ge=0.0,
|
121
|
+
...,
|
122
|
+
ge=0.0,
|
122
123
|
description="Total processing time in seconds"
|
123
124
|
)
|
124
125
|
errors: List[str] = Field(
|
125
|
-
default_factory=list,
|
126
|
+
default_factory=list,
|
126
127
|
description="List of error messages"
|
127
128
|
)
|
128
|
-
|
129
|
+
|
129
130
|
# Computed properties
|
130
131
|
@property
|
131
132
|
def success_rate(self) -> float:
|
@@ -133,28 +134,28 @@ class BatchProcessingResult(BaseModel):
|
|
133
134
|
if self.total_chunks == 0:
|
134
135
|
return 0.0
|
135
136
|
return (self.successful_chunks / self.total_chunks) * 100.0
|
136
|
-
|
137
|
+
|
137
138
|
@property
|
138
139
|
def chunks_per_second(self) -> float:
|
139
140
|
"""Calculate processing speed."""
|
140
141
|
if self.processing_time == 0:
|
141
142
|
return 0.0
|
142
143
|
return self.total_chunks / self.processing_time
|
143
|
-
|
144
|
+
|
144
145
|
@property
|
145
146
|
def average_cost_per_chunk(self) -> float:
|
146
147
|
"""Calculate average cost per successfully processed chunk."""
|
147
148
|
if self.successful_chunks == 0:
|
148
149
|
return 0.0
|
149
150
|
return self.total_cost / self.successful_chunks
|
150
|
-
|
151
|
+
|
151
152
|
@property
|
152
153
|
def average_tokens_per_chunk(self) -> float:
|
153
154
|
"""Calculate average tokens per successfully processed chunk."""
|
154
155
|
if self.successful_chunks == 0:
|
155
156
|
return 0.0
|
156
157
|
return self.total_tokens / self.successful_chunks
|
157
|
-
|
158
|
+
|
158
159
|
@field_validator('successful_chunks', 'failed_chunks')
|
159
160
|
@classmethod
|
160
161
|
def validate_chunk_counts(cls, v, info: ValidationInfo):
|
@@ -175,10 +176,10 @@ class BatchProcessingResult(BaseModel):
|
|
175
176
|
f'must equal total chunks ({info.data["total_chunks"]})'
|
176
177
|
)
|
177
178
|
return v
|
178
|
-
|
179
|
+
|
179
180
|
class Config:
|
180
181
|
validate_assignment = True
|
181
|
-
|
182
|
+
|
182
183
|
def model_dump_summary(self) -> Dict[str, Any]:
|
183
184
|
"""Get a summary dict for logging."""
|
184
185
|
return {
|
@@ -198,9 +199,9 @@ class BatchProcessingResult(BaseModel):
|
|
198
199
|
class ProcessingConfig(BaseModel):
|
199
200
|
"""Configuration for embedding processing."""
|
200
201
|
batch_size: int = Field(
|
201
|
-
default=100,
|
202
|
-
ge=1,
|
203
|
-
le=2048,
|
202
|
+
default=100,
|
203
|
+
ge=1,
|
204
|
+
le=2048,
|
204
205
|
description="Number of chunks to process in one batch"
|
205
206
|
)
|
206
207
|
embedding_model: str = Field(
|
@@ -208,26 +209,26 @@ class ProcessingConfig(BaseModel):
|
|
208
209
|
description="OpenAI embedding model to use"
|
209
210
|
)
|
210
211
|
max_retries: int = Field(
|
211
|
-
default=3,
|
212
|
-
ge=0,
|
213
|
-
le=10,
|
212
|
+
default=3,
|
213
|
+
ge=0,
|
214
|
+
le=10,
|
214
215
|
description="Maximum number of retries for failed requests"
|
215
216
|
)
|
216
217
|
retry_delay: float = Field(
|
217
|
-
default=1.0,
|
218
|
-
ge=0.0,
|
218
|
+
default=1.0,
|
219
|
+
ge=0.0,
|
219
220
|
description="Delay between retries in seconds"
|
220
221
|
)
|
221
222
|
rate_limit_delay: float = Field(
|
222
|
-
default=0.5,
|
223
|
-
ge=0.0,
|
223
|
+
default=0.5,
|
224
|
+
ge=0.0,
|
224
225
|
description="Delay between batches to respect rate limits"
|
225
226
|
)
|
226
227
|
timeout_seconds: int = Field(
|
227
|
-
default=60,
|
228
|
-
ge=1,
|
228
|
+
default=60,
|
229
|
+
ge=1,
|
229
230
|
description="Timeout for API requests in seconds"
|
230
231
|
)
|
231
|
-
|
232
|
+
|
232
233
|
class Config:
|
233
234
|
validate_assignment = True
|
@@ -8,7 +8,8 @@ document and archive chunks with their specific requirements.
|
|
8
8
|
import logging
|
9
9
|
from typing import Protocol
|
10
10
|
|
11
|
-
from django_cfg.apps.knowbase.models import
|
11
|
+
from django_cfg.apps.knowbase.models import ArchiveItemChunk, DocumentChunk, ExternalDataChunk
|
12
|
+
|
12
13
|
from .models import ChunkData, EmbeddingResult
|
13
14
|
|
14
15
|
logger = logging.getLogger(__name__)
|
@@ -16,11 +17,11 @@ logger = logging.getLogger(__name__)
|
|
16
17
|
|
17
18
|
class ChunkProcessor(Protocol):
|
18
19
|
"""Protocol for chunk processors."""
|
19
|
-
|
20
|
+
|
20
21
|
def prepare_content_for_embedding(self, chunk: ChunkData) -> str:
|
21
22
|
"""Prepare chunk content for embedding generation."""
|
22
23
|
...
|
23
|
-
|
24
|
+
|
24
25
|
def save_embedding_result(self, chunk_id: str, result: EmbeddingResult) -> None:
|
25
26
|
"""Save embedding result to database."""
|
26
27
|
...
|
@@ -28,25 +29,25 @@ class ChunkProcessor(Protocol):
|
|
28
29
|
|
29
30
|
class DocumentChunkProcessor:
|
30
31
|
"""Processor for document chunks."""
|
31
|
-
|
32
|
+
|
32
33
|
def prepare_content_for_embedding(self, chunk: ChunkData) -> str:
|
33
34
|
"""Prepare document chunk content for embedding."""
|
34
35
|
return chunk.content.strip()
|
35
|
-
|
36
|
+
|
36
37
|
def save_embedding_result(self, chunk_id: str, result: EmbeddingResult) -> None:
|
37
38
|
"""Save embedding result for document chunk."""
|
38
39
|
try:
|
39
40
|
logger.debug(f"🔍 Looking for document chunk with id: {chunk_id}")
|
40
41
|
chunk = DocumentChunk.objects.get(id=chunk_id)
|
41
42
|
logger.debug(f"📄 Found document chunk: {chunk.id}, current embedding length: {len(chunk.embedding) if chunk.embedding is not None and len(chunk.embedding) > 0 else 0}")
|
42
|
-
|
43
|
+
|
43
44
|
chunk.embedding = result.embedding
|
44
45
|
chunk.token_count = result.tokens
|
45
46
|
chunk.embedding_cost = result.cost
|
46
47
|
chunk.save(update_fields=['embedding', 'token_count', 'embedding_cost'])
|
47
|
-
|
48
|
+
|
48
49
|
logger.info(f"✅ Document chunk {chunk_id} embedding saved: {result.tokens} tokens, ${result.cost:.4f}, embedding_len={len(result.embedding)}")
|
49
|
-
|
50
|
+
|
50
51
|
except DocumentChunk.DoesNotExist:
|
51
52
|
logger.error(f"❌ Document chunk {chunk_id} not found")
|
52
53
|
raise
|
@@ -57,15 +58,15 @@ class DocumentChunkProcessor:
|
|
57
58
|
|
58
59
|
class ArchiveChunkProcessor:
|
59
60
|
"""Processor for archive chunks."""
|
60
|
-
|
61
|
+
|
61
62
|
def prepare_content_for_embedding(self, chunk: ChunkData) -> str:
|
62
63
|
"""Prepare archive chunk content for embedding with context."""
|
63
64
|
content = chunk.content
|
64
65
|
context = chunk.context_metadata or {}
|
65
|
-
|
66
|
+
|
66
67
|
# Build context prefix for better embeddings
|
67
68
|
context_parts = []
|
68
|
-
|
69
|
+
|
69
70
|
if context.get('file_path'):
|
70
71
|
context_parts.append(f"File: {context['file_path']}")
|
71
72
|
if context.get('function_name'):
|
@@ -74,13 +75,13 @@ class ArchiveChunkProcessor:
|
|
74
75
|
context_parts.append(f"Class: {context['class_name']}")
|
75
76
|
if context.get('language'):
|
76
77
|
context_parts.append(f"Language: {context['language']}")
|
77
|
-
|
78
|
+
|
78
79
|
if context_parts:
|
79
80
|
context_prefix = " | ".join(context_parts)
|
80
81
|
enhanced_content = f"{context_prefix}\n\n{content}"
|
81
82
|
else:
|
82
83
|
enhanced_content = content
|
83
|
-
|
84
|
+
|
84
85
|
# Ensure content is not too long for embedding model
|
85
86
|
max_length = 8000 # Conservative limit
|
86
87
|
if len(enhanced_content) > max_length:
|
@@ -97,9 +98,9 @@ class ArchiveChunkProcessor:
|
|
97
98
|
else:
|
98
99
|
# Subtract 3 for "..." suffix
|
99
100
|
enhanced_content = content[:max_length - 3] + "..."
|
100
|
-
|
101
|
+
|
101
102
|
return enhanced_content.strip()
|
102
|
-
|
103
|
+
|
103
104
|
def save_embedding_result(self, chunk_id: str, result: EmbeddingResult) -> None:
|
104
105
|
"""Save embedding result for archive chunk."""
|
105
106
|
try:
|
@@ -108,15 +109,15 @@ class ArchiveChunkProcessor:
|
|
108
109
|
chunk.token_count = result.tokens
|
109
110
|
chunk.embedding_cost = result.cost
|
110
111
|
chunk.save(update_fields=['embedding', 'token_count', 'embedding_cost'])
|
111
|
-
|
112
|
+
|
112
113
|
# Update parent item statistics
|
113
114
|
item = chunk.item
|
114
115
|
item.total_tokens += result.tokens
|
115
116
|
item.processing_cost += result.cost
|
116
117
|
item.save(update_fields=['total_tokens', 'processing_cost'])
|
117
|
-
|
118
|
+
|
118
119
|
logger.debug(f"✅ Archive chunk {chunk_id} embedding saved: {result.tokens} tokens, ${result.cost:.4f}")
|
119
|
-
|
120
|
+
|
120
121
|
except ArchiveItemChunk.DoesNotExist:
|
121
122
|
logger.error(f"❌ Archive chunk {chunk_id} not found")
|
122
123
|
raise
|
@@ -124,25 +125,25 @@ class ArchiveChunkProcessor:
|
|
124
125
|
|
125
126
|
class ExternalDataChunkProcessor:
|
126
127
|
"""Processor for external data chunks."""
|
127
|
-
|
128
|
+
|
128
129
|
def prepare_content_for_embedding(self, chunk: ChunkData) -> str:
|
129
130
|
"""Prepare external data chunk content for embedding."""
|
130
131
|
return chunk.content.strip()
|
131
|
-
|
132
|
+
|
132
133
|
def save_embedding_result(self, chunk_id: str, result: EmbeddingResult) -> None:
|
133
134
|
"""Save embedding result for external data chunk."""
|
134
135
|
try:
|
135
136
|
logger.debug(f"🔍 Looking for external data chunk with id: {chunk_id}")
|
136
137
|
chunk = ExternalDataChunk.objects.get(id=chunk_id)
|
137
138
|
logger.debug(f"🔗 Found external data chunk: {chunk.id}, current embedding length: {len(chunk.embedding) if chunk.embedding is not None and len(chunk.embedding) > 0 else 0}")
|
138
|
-
|
139
|
+
|
139
140
|
chunk.embedding = result.embedding
|
140
141
|
chunk.token_count = result.tokens
|
141
142
|
chunk.embedding_cost = result.cost
|
142
143
|
chunk.save(update_fields=['embedding', 'token_count', 'embedding_cost'])
|
143
|
-
|
144
|
+
|
144
145
|
logger.info(f"✅ External data chunk {chunk_id} embedding saved: {result.tokens} tokens, ${result.cost:.4f}, embedding_len={len(result.embedding)}")
|
145
|
-
|
146
|
+
|
146
147
|
except ExternalDataChunk.DoesNotExist:
|
147
148
|
logger.error(f"❌ External data chunk {chunk_id} not found")
|
148
149
|
raise
|