django-cfg 1.4.20__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/migrations/0003_alter_documentarchive_archive_type.py +29 -0
- 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 +35 -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 +36 -35
- 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 +12 -13
- 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.20.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.20.dist-info/RECORD +0 -1110
- /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.20.dist-info → django_cfg-1.4.23.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.20.dist-info → django_cfg-1.4.23.dist-info}/licenses/LICENSE +0 -0
@@ -5,8 +5,9 @@ Auto-configuring LLM and translation service that integrates with DjangoConfig.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
# from .service import DjangoLLM, LLMError, LLMConfigError # Removed - using LLMClient directly
|
8
|
+
from .llm import LLMCache, LLMClient
|
8
9
|
from .translator import DjangoTranslator, TranslationError
|
9
|
-
|
10
|
+
|
10
11
|
|
11
12
|
# Convenience functions
|
12
13
|
def chat_completion(
|
@@ -62,7 +63,7 @@ def get_available_models() -> list:
|
|
62
63
|
|
63
64
|
# Export public API
|
64
65
|
__all__ = [
|
65
|
-
'DjangoTranslator',
|
66
|
+
'DjangoTranslator',
|
66
67
|
'LLMClient',
|
67
68
|
'LLMCache',
|
68
69
|
'TranslationError',
|
@@ -7,13 +7,15 @@ Demonstrates LLM and translation functionality with django-cfg integration.
|
|
7
7
|
import asyncio
|
8
8
|
import json
|
9
9
|
from pathlib import Path
|
10
|
-
|
10
|
+
|
11
|
+
from django_cfg import DjangoConfig, DjangoLLM, DjangoTranslator, LLMConfig, TelegramConfig
|
12
|
+
|
11
13
|
|
12
14
|
class ExampleConfig(DjangoConfig):
|
13
15
|
"""Example configuration with LLM support."""
|
14
|
-
|
16
|
+
|
15
17
|
project_name: str = "LLM Example Project"
|
16
|
-
|
18
|
+
|
17
19
|
# LLM configuration
|
18
20
|
llm: LLMConfig = LLMConfig(
|
19
21
|
provider="openrouter",
|
@@ -24,7 +26,7 @@ class ExampleConfig(DjangoConfig):
|
|
24
26
|
cost_tracking=True,
|
25
27
|
usage_alerts=True
|
26
28
|
)
|
27
|
-
|
29
|
+
|
28
30
|
# Optional: Telegram for alerts
|
29
31
|
telegram: TelegramConfig = TelegramConfig(
|
30
32
|
bot_token="${TELEGRAM_BOT_TOKEN}",
|
@@ -36,25 +38,25 @@ async def example_llm_usage():
|
|
36
38
|
"""Example LLM usage."""
|
37
39
|
print("🤖 Testing Django LLM Module...")
|
38
40
|
print("=" * 50)
|
39
|
-
|
41
|
+
|
40
42
|
# Import after config is set
|
41
43
|
from django_cfg.modules.django_llm import DjangoLLM, chat_completion
|
42
|
-
|
44
|
+
|
43
45
|
# Initialize LLM service
|
44
46
|
llm = DjangoLLM()
|
45
|
-
|
47
|
+
|
46
48
|
if not llm.is_configured:
|
47
49
|
print("❌ LLM service is not configured. Please set OPENROUTER_API_KEY.")
|
48
50
|
return
|
49
|
-
|
51
|
+
|
50
52
|
print("✅ LLM service is configured")
|
51
|
-
|
53
|
+
|
52
54
|
# Test chat completion
|
53
55
|
print("\n💬 Chat Completion:")
|
54
56
|
messages = [
|
55
57
|
{"role": "user", "content": "What is the capital of France?"}
|
56
58
|
]
|
57
|
-
|
59
|
+
|
58
60
|
try:
|
59
61
|
response = llm.chat_completion(messages)
|
60
62
|
print(f"✅ Response: {response.get('content', 'No content')}")
|
@@ -62,7 +64,7 @@ async def example_llm_usage():
|
|
62
64
|
print(f"💰 Cost: ${response.get('cost_usd', 0):.6f}")
|
63
65
|
except Exception as e:
|
64
66
|
print(f"❌ Chat completion failed: {e}")
|
65
|
-
|
67
|
+
|
66
68
|
# Test text generation
|
67
69
|
print("\n📝 Text Generation:")
|
68
70
|
try:
|
@@ -70,18 +72,18 @@ async def example_llm_usage():
|
|
70
72
|
print(f"✅ Generated text:\n{text}")
|
71
73
|
except Exception as e:
|
72
74
|
print(f"❌ Text generation failed: {e}")
|
73
|
-
|
75
|
+
|
74
76
|
# Test JSON generation
|
75
77
|
print("\n📋 JSON Generation:")
|
76
78
|
try:
|
77
79
|
json_data = llm.generate_json(
|
78
80
|
"Create a JSON object with information about a car: make, model, year, price"
|
79
81
|
)
|
80
|
-
print(
|
82
|
+
print("✅ Generated JSON:")
|
81
83
|
print(json.dumps(json_data, indent=2))
|
82
84
|
except Exception as e:
|
83
85
|
print(f"❌ JSON generation failed: {e}")
|
84
|
-
|
86
|
+
|
85
87
|
# Test convenience function
|
86
88
|
print("\n🚀 Convenience Function:")
|
87
89
|
try:
|
@@ -91,7 +93,7 @@ async def example_llm_usage():
|
|
91
93
|
print(f"✅ Convenience response: {response.get('content', 'No content')}")
|
92
94
|
except Exception as e:
|
93
95
|
print(f"❌ Convenience function failed: {e}")
|
94
|
-
|
96
|
+
|
95
97
|
# Get statistics
|
96
98
|
print("\n📊 Statistics:")
|
97
99
|
stats = llm.get_stats()
|
@@ -105,17 +107,17 @@ async def example_translation_usage():
|
|
105
107
|
"""Example translation usage."""
|
106
108
|
print("\n🌐 Testing Django Translation Module...")
|
107
109
|
print("=" * 50)
|
108
|
-
|
109
|
-
|
110
|
+
|
111
|
+
|
110
112
|
# Initialize translator
|
111
113
|
translator = DjangoTranslator()
|
112
|
-
|
114
|
+
|
113
115
|
if not translator.is_configured:
|
114
116
|
print("❌ Translation service is not configured. Please set OPENROUTER_API_KEY.")
|
115
117
|
return
|
116
|
-
|
118
|
+
|
117
119
|
print("✅ Translation service is configured")
|
118
|
-
|
120
|
+
|
119
121
|
# Test simple translation
|
120
122
|
print("\n🔤 Simple Translation:")
|
121
123
|
try:
|
@@ -127,7 +129,7 @@ async def example_translation_usage():
|
|
127
129
|
print(f"✅ Korean to English: {translated}")
|
128
130
|
except Exception as e:
|
129
131
|
print(f"❌ Translation failed: {e}")
|
130
|
-
|
132
|
+
|
131
133
|
# Test CJK translation
|
132
134
|
print("\n🈳 CJK Translation:")
|
133
135
|
cjk_texts = [
|
@@ -135,7 +137,7 @@ async def example_translation_usage():
|
|
135
137
|
("これは良い車です", "ja", "Japanese"),
|
136
138
|
("이것은 좋은 차입니다", "ko", "Korean")
|
137
139
|
]
|
138
|
-
|
140
|
+
|
139
141
|
for text, lang, lang_name in cjk_texts:
|
140
142
|
try:
|
141
143
|
translated = translator.translate(
|
@@ -146,7 +148,7 @@ async def example_translation_usage():
|
|
146
148
|
print(f"✅ {lang_name}: {text} → {translated}")
|
147
149
|
except Exception as e:
|
148
150
|
print(f"❌ {lang_name} translation failed: {e}")
|
149
|
-
|
151
|
+
|
150
152
|
# Test JSON translation
|
151
153
|
print("\n📄 JSON Translation:")
|
152
154
|
car_data = {
|
@@ -157,7 +159,7 @@ async def example_translation_usage():
|
|
157
159
|
"price": "$25,000", # Should be skipped
|
158
160
|
"id": "CAR_12345" # Should be skipped
|
159
161
|
}
|
160
|
-
|
162
|
+
|
161
163
|
try:
|
162
164
|
translated_data = translator.translate_json(
|
163
165
|
data=car_data,
|
@@ -168,14 +170,14 @@ async def example_translation_usage():
|
|
168
170
|
print(json.dumps(translated_data, indent=2, ensure_ascii=False))
|
169
171
|
except Exception as e:
|
170
172
|
print(f"❌ JSON translation failed: {e}")
|
171
|
-
|
173
|
+
|
172
174
|
# Test convenience functions
|
173
175
|
print("\n🚀 Convenience Functions:")
|
174
176
|
try:
|
175
177
|
# Quick text translation
|
176
178
|
quick_text = translate_text("Bonjour le monde", target_language="en", source_language="fr")
|
177
179
|
print(f"✅ Quick translation: {quick_text}")
|
178
|
-
|
180
|
+
|
179
181
|
# Quick JSON translation
|
180
182
|
quick_json = translate_json(
|
181
183
|
{"greeting": "Hola mundo", "url": "https://example.com"},
|
@@ -184,7 +186,7 @@ async def example_translation_usage():
|
|
184
186
|
print(f"✅ Quick JSON: {quick_json}")
|
185
187
|
except Exception as e:
|
186
188
|
print(f"❌ Convenience functions failed: {e}")
|
187
|
-
|
189
|
+
|
188
190
|
# Get translation statistics
|
189
191
|
print("\n📊 Translation Statistics:")
|
190
192
|
stats = translator.get_stats()
|
@@ -199,36 +201,36 @@ async def example_cache_management():
|
|
199
201
|
"""Example cache management."""
|
200
202
|
print("\n💾 Testing Cache Management...")
|
201
203
|
print("=" * 50)
|
202
|
-
|
204
|
+
|
203
205
|
from django_cfg.modules.django_llm import DjangoLLM
|
204
|
-
|
206
|
+
|
205
207
|
llm = DjangoLLM()
|
206
|
-
|
208
|
+
|
207
209
|
if not llm.is_configured:
|
208
210
|
print("❌ LLM service is not configured.")
|
209
211
|
return
|
210
|
-
|
212
|
+
|
211
213
|
# Get cache information
|
212
214
|
print("📋 Cache Information:")
|
213
215
|
config_info = llm.get_config_info()
|
214
216
|
cache_info = config_info.get('cache_info', {})
|
215
|
-
|
217
|
+
|
216
218
|
print(f"Cache directory: {config_info.get('cache_directory')}")
|
217
219
|
print(f"Memory cache size: {cache_info.get('memory_cache', {}).get('size', 0)}")
|
218
220
|
print(f"File cache exists: {cache_info.get('file_cache', {}).get('exists', False)}")
|
219
|
-
|
221
|
+
|
220
222
|
# Test cache export
|
221
223
|
print("\n📤 Cache Export:")
|
222
224
|
try:
|
223
225
|
yaml_content = llm.cache.export_cache_yaml()
|
224
226
|
print("✅ Cache exported to YAML:")
|
225
227
|
print(yaml_content[:500] + "..." if len(yaml_content) > 500 else yaml_content)
|
226
|
-
|
228
|
+
|
227
229
|
# Save to file
|
228
230
|
export_file = Path("llm_cache_export.yaml")
|
229
231
|
llm.cache.export_cache_yaml(export_file)
|
230
232
|
print(f"✅ Cache saved to: {export_file}")
|
231
|
-
|
233
|
+
|
232
234
|
except Exception as e:
|
233
235
|
print(f"❌ Cache export failed: {e}")
|
234
236
|
|
@@ -237,8 +239,8 @@ async def example_alerts():
|
|
237
239
|
"""Example alert functionality."""
|
238
240
|
print("\n🔔 Testing Alert Functionality...")
|
239
241
|
print("=" * 50)
|
240
|
-
|
241
|
-
|
242
|
+
|
243
|
+
|
242
244
|
# Test LLM alerts
|
243
245
|
print("🤖 Sending LLM Alert:")
|
244
246
|
try:
|
@@ -253,7 +255,7 @@ async def example_alerts():
|
|
253
255
|
print("✅ LLM alert sent (check Telegram)")
|
254
256
|
except Exception as e:
|
255
257
|
print(f"❌ LLM alert failed: {e}")
|
256
|
-
|
258
|
+
|
257
259
|
# Test translation alerts
|
258
260
|
print("\n🌐 Sending Translation Alert:")
|
259
261
|
try:
|
@@ -274,60 +276,60 @@ async def example_models_cache():
|
|
274
276
|
"""Example of using models cache for dynamic pricing."""
|
275
277
|
print("\n📊 Models Cache Example")
|
276
278
|
print("-" * 30)
|
277
|
-
|
279
|
+
|
278
280
|
try:
|
279
281
|
# Initialize LLM service
|
280
282
|
llm_service = DjangoLLM()
|
281
|
-
|
283
|
+
|
282
284
|
if not llm_service.is_configured:
|
283
285
|
print("⚠️ LLM service not configured, skipping models cache example")
|
284
286
|
return
|
285
|
-
|
287
|
+
|
286
288
|
client = llm_service.client
|
287
|
-
|
289
|
+
|
288
290
|
if not client.models_cache:
|
289
291
|
print("⚠️ Models cache not available for this provider")
|
290
292
|
return
|
291
|
-
|
293
|
+
|
292
294
|
print("🔄 Fetching models from OpenRouter API...")
|
293
295
|
models = await client.fetch_models()
|
294
296
|
print(f"✅ Fetched {len(models)} models")
|
295
|
-
|
297
|
+
|
296
298
|
# Get models summary
|
297
299
|
summary = client.get_models_summary()
|
298
300
|
print(f"📈 Total models: {summary.get('total_models', 0)}")
|
299
301
|
print(f"📈 Available models: {summary.get('available_models', 0)}")
|
300
302
|
print(f"📈 Free models: {summary.get('free_models_count', 0)}")
|
301
303
|
print(f"📈 Budget models: {summary.get('budget_models_count', 0)}")
|
302
|
-
|
304
|
+
|
303
305
|
# Show some free models
|
304
306
|
free_models = client.get_free_models()
|
305
307
|
if free_models:
|
306
308
|
print(f"\n🆓 Free models ({len(free_models)}):")
|
307
309
|
for model in free_models[:3]: # Show first 3
|
308
310
|
print(f" • {model.name} ({model.provider})")
|
309
|
-
|
311
|
+
|
310
312
|
# Show budget models
|
311
313
|
budget_models = client.get_budget_models(max_price=1.0)
|
312
314
|
if budget_models:
|
313
315
|
print(f"\n💰 Budget models ≤$1.0/1M tokens ({len(budget_models)}):")
|
314
316
|
for model in budget_models[:3]: # Show first 3
|
315
317
|
print(f" • {model.name}: ${model.pricing.prompt_price}/1M prompt tokens")
|
316
|
-
|
318
|
+
|
317
319
|
# Search for coding models
|
318
320
|
coding_models = client.search_models("code")
|
319
321
|
if coding_models:
|
320
322
|
print(f"\n💻 Coding models ({len(coding_models)}):")
|
321
323
|
for model in coding_models[:3]: # Show first 3
|
322
324
|
print(f" • {model.name}: ${model.pricing.prompt_price}/1M tokens")
|
323
|
-
|
325
|
+
|
324
326
|
# Test dynamic cost estimation
|
325
327
|
model_id = "openai/gpt-4o-mini"
|
326
328
|
cost = client.estimate_cost(model_id, 1000, 500)
|
327
329
|
print(f"\n💵 Dynamic cost estimate for {model_id}:")
|
328
|
-
print(
|
330
|
+
print(" Input: 1000 tokens, Output: 500 tokens")
|
329
331
|
print(f" Total cost: ${cost:.6f}")
|
330
|
-
|
332
|
+
|
331
333
|
# Show model details
|
332
334
|
model_info = client.get_model_info(model_id)
|
333
335
|
if model_info:
|
@@ -337,14 +339,14 @@ async def example_models_cache():
|
|
337
339
|
print(f" Context: {model_info.context_length:,} tokens")
|
338
340
|
print(f" Prompt price: ${model_info.pricing.prompt_price}/1M tokens")
|
339
341
|
print(f" Completion price: ${model_info.pricing.completion_price}/1M tokens")
|
340
|
-
|
342
|
+
|
341
343
|
# Cache information
|
342
344
|
cache_info = client.get_models_cache_info()
|
343
|
-
print(
|
345
|
+
print("\n🗄️ Cache info:")
|
344
346
|
print(f" Models cached: {cache_info.get('models_count', 0)}")
|
345
347
|
print(f" Last updated: {cache_info.get('last_fetch', 'Never')}")
|
346
348
|
print(f" Cache file: {cache_info.get('cache_file_exists', False)}")
|
347
|
-
|
349
|
+
|
348
350
|
except Exception as e:
|
349
351
|
print(f"❌ Models cache example failed: {e}")
|
350
352
|
import traceback
|
@@ -355,17 +357,17 @@ async def main():
|
|
355
357
|
"""Main example function."""
|
356
358
|
print("🚀 Django LLM Module Examples")
|
357
359
|
print("=" * 50)
|
358
|
-
|
360
|
+
|
359
361
|
# Set up configuration
|
360
362
|
config = ExampleConfig()
|
361
|
-
|
363
|
+
|
362
364
|
# Run examples
|
363
365
|
await example_llm_usage()
|
364
366
|
await example_translation_usage()
|
365
367
|
await example_cache_management()
|
366
368
|
await example_models_cache()
|
367
369
|
await example_alerts()
|
368
|
-
|
370
|
+
|
369
371
|
print("\n🎉 All examples completed!")
|
370
372
|
print("\nNext steps:")
|
371
373
|
print("1. Check the generated cache files")
|
@@ -2,18 +2,19 @@
|
|
2
2
|
LLM Cache Manager - caches LLM responses to avoid duplicate API calls
|
3
3
|
"""
|
4
4
|
|
5
|
-
import json
|
6
5
|
import hashlib
|
6
|
+
import json
|
7
7
|
import logging
|
8
8
|
from pathlib import Path
|
9
|
-
from typing import
|
9
|
+
from typing import Any, Dict, List, Optional
|
10
|
+
|
10
11
|
from cachetools import TTLCache
|
11
12
|
|
12
13
|
logger = logging.getLogger(__name__)
|
13
14
|
|
14
15
|
class LLMCache:
|
15
16
|
"""Manages LLM response caching with TTL and file persistence"""
|
16
|
-
|
17
|
+
|
17
18
|
def __init__(self, cache_dir: Optional[str] = None, ttl: int = 3600, max_size: int = 1000):
|
18
19
|
"""
|
19
20
|
Initialize LLM cache manager
|
@@ -28,30 +29,30 @@ class LLMCache:
|
|
28
29
|
# Get the django_cfg module directory
|
29
30
|
module_dir = Path(__file__).parent.parent.parent # django_cfg/modules/django_llm/llm -> django_cfg
|
30
31
|
default_cache_dir = module_dir / ".cache" / "llm"
|
31
|
-
|
32
|
+
|
32
33
|
# Create cache directory if it doesn't exist
|
33
34
|
default_cache_dir.mkdir(parents=True, exist_ok=True)
|
34
35
|
else:
|
35
36
|
default_cache_dir = Path(cache_dir)
|
36
|
-
|
37
|
+
|
37
38
|
self.cache_dir = default_cache_dir
|
38
39
|
self.cache_file = self.cache_dir / "llm_responses.json"
|
39
40
|
self.ttl = ttl
|
40
41
|
self.max_size = max_size
|
41
|
-
|
42
|
+
|
42
43
|
# TTL Memory Cache
|
43
44
|
self.memory_cache = TTLCache(maxsize=max_size, ttl=ttl)
|
44
|
-
|
45
|
+
|
45
46
|
# Load persistent cache
|
46
47
|
self.persistent_cache = self._load_persistent_cache()
|
47
|
-
|
48
|
+
|
48
49
|
logger.debug(f"LLM cache initialized: {self.cache_dir}")
|
49
50
|
|
50
51
|
def _load_persistent_cache(self) -> Dict[str, Any]:
|
51
52
|
"""Load cache from file"""
|
52
53
|
try:
|
53
54
|
if self.cache_file.exists():
|
54
|
-
with open(self.cache_file,
|
55
|
+
with open(self.cache_file, encoding='utf-8') as f:
|
55
56
|
return json.load(f)
|
56
57
|
except Exception as e:
|
57
58
|
logger.warning(f"Failed to load persistent cache: {e}")
|
@@ -73,10 +74,10 @@ class LLMCache:
|
|
73
74
|
"model": model,
|
74
75
|
**kwargs
|
75
76
|
}
|
76
|
-
|
77
|
+
|
77
78
|
# Convert to JSON string for hashing
|
78
79
|
request_str = json.dumps(request_data, sort_keys=True, ensure_ascii=False)
|
79
|
-
|
80
|
+
|
80
81
|
# Generate SHA256 hash
|
81
82
|
return hashlib.sha256(request_str.encode('utf-8')).hexdigest()
|
82
83
|
|
@@ -88,7 +89,7 @@ class LLMCache:
|
|
88
89
|
logger.debug(f"Memory cache hit for hash: {request_hash[:8]}...")
|
89
90
|
# Return only the response part, not the whole cache entry
|
90
91
|
return cache_entry.get("response") if isinstance(cache_entry, dict) and "response" in cache_entry else cache_entry
|
91
|
-
|
92
|
+
|
92
93
|
# Check persistent cache
|
93
94
|
if request_hash in self.persistent_cache:
|
94
95
|
cache_entry = self.persistent_cache[request_hash]
|
@@ -97,7 +98,7 @@ class LLMCache:
|
|
97
98
|
logger.debug(f"Persistent cache hit for hash: {request_hash[:8]}...")
|
98
99
|
# Return only the response part, not the whole cache entry
|
99
100
|
return cache_entry.get("response") if isinstance(cache_entry, dict) and "response" in cache_entry else cache_entry
|
100
|
-
|
101
|
+
|
101
102
|
return None
|
102
103
|
|
103
104
|
def set_response(self, request_hash: str, response: Dict[str, Any], model: str):
|
@@ -109,18 +110,18 @@ class LLMCache:
|
|
109
110
|
"model": model,
|
110
111
|
"cached_at": response.get("created", 0)
|
111
112
|
}
|
112
|
-
|
113
|
+
|
113
114
|
# Store in memory cache
|
114
115
|
self.memory_cache[request_hash] = cache_entry
|
115
|
-
|
116
|
+
|
116
117
|
# Store in persistent cache
|
117
118
|
self.persistent_cache[request_hash] = cache_entry
|
118
|
-
|
119
|
+
|
119
120
|
# Save to file
|
120
121
|
self._save_persistent_cache()
|
121
|
-
|
122
|
+
|
122
123
|
logger.debug(f"Cached response for hash: {request_hash[:8]}...")
|
123
|
-
|
124
|
+
|
124
125
|
except Exception as e:
|
125
126
|
logger.error(f"Failed to cache response: {e}")
|
126
127
|
|
@@ -138,12 +139,12 @@ class LLMCache:
|
|
138
139
|
"""Clear all caches"""
|
139
140
|
self.memory_cache.clear()
|
140
141
|
self.persistent_cache.clear()
|
141
|
-
|
142
|
+
|
142
143
|
# Remove cache file
|
143
144
|
try:
|
144
145
|
if self.cache_file.exists():
|
145
146
|
self.cache_file.unlink()
|
146
147
|
except Exception as e:
|
147
148
|
logger.error(f"Failed to remove cache file: {e}")
|
148
|
-
|
149
|
+
|
149
150
|
logger.info("LLM cache cleared")
|
@@ -5,25 +5,25 @@ Universal LLM client supporting multiple providers with caching and token optimi
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import logging
|
8
|
-
from typing import Dict, List, Optional, Any
|
9
8
|
from pathlib import Path
|
9
|
+
from typing import Any, Dict, List, Optional
|
10
10
|
|
11
|
-
from
|
12
|
-
from .
|
11
|
+
from ...base import BaseCfgModule
|
12
|
+
from .embeddings import MockEmbedder, OpenAIEmbedder
|
13
13
|
from .extractor import JSONExtractor
|
14
14
|
from .models import (
|
15
|
-
EmbeddingResponse,
|
16
15
|
ChatCompletionResponse,
|
16
|
+
EmbeddingResponse,
|
17
17
|
)
|
18
|
-
from
|
18
|
+
from .models_api import ModelsQueryAPI
|
19
|
+
from .models_cache import ModelInfo, ModelsCache
|
19
20
|
|
20
21
|
# Import new components
|
21
22
|
from .providers import ProviderManager, ProviderSelector
|
22
|
-
from .
|
23
|
-
from .embeddings import OpenAIEmbedder, MockEmbedder
|
23
|
+
from .requests import ChatRequestHandler, EmbeddingRequestHandler, RequestCacheManager
|
24
24
|
from .responses import ResponseBuilder
|
25
|
-
from .
|
26
|
-
from .
|
25
|
+
from .stats import StatsManager
|
26
|
+
from .tokenizer import Tokenizer
|
27
27
|
|
28
28
|
logger = logging.getLogger(__name__)
|
29
29
|
|
@@ -5,7 +5,7 @@ Provides accurate cost calculation using models cache and fallback pricing.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import logging
|
8
|
-
from typing import Dict,
|
8
|
+
from typing import Dict, Optional
|
9
9
|
|
10
10
|
from .models_cache import ModelsCache
|
11
11
|
|
@@ -14,7 +14,7 @@ logger = logging.getLogger(__name__)
|
|
14
14
|
|
15
15
|
class CostCalculator:
|
16
16
|
"""Calculate costs for LLM operations using models cache and fallback pricing."""
|
17
|
-
|
17
|
+
|
18
18
|
def __init__(self, models_cache: Optional[ModelsCache] = None):
|
19
19
|
"""
|
20
20
|
Initialize cost calculator.
|
@@ -23,7 +23,7 @@ class CostCalculator:
|
|
23
23
|
models_cache: ModelsCache instance for dynamic pricing
|
24
24
|
"""
|
25
25
|
self.models_cache = models_cache
|
26
|
-
|
26
|
+
|
27
27
|
# Fallback pricing for common models (per 1M tokens)
|
28
28
|
self.fallback_chat_prices = {
|
29
29
|
"gpt-4o-mini": {"prompt": 0.15, "completion": 0.6},
|
@@ -33,14 +33,14 @@ class CostCalculator:
|
|
33
33
|
"claude-3-sonnet": {"prompt": 3.0, "completion": 15.0},
|
34
34
|
"claude-3-opus": {"prompt": 15.0, "completion": 75.0}
|
35
35
|
}
|
36
|
-
|
36
|
+
|
37
37
|
# Fallback embedding pricing (per 1K tokens)
|
38
38
|
self.fallback_embedding_prices = {
|
39
39
|
"text-embedding-ada-002": 0.0001 / 1000,
|
40
40
|
"text-embedding-3-small": 0.00002 / 1000,
|
41
41
|
"text-embedding-3-large": 0.00013 / 1000,
|
42
42
|
}
|
43
|
-
|
43
|
+
|
44
44
|
def calculate_chat_cost(self, usage: Dict[str, int], model: str) -> float:
|
45
45
|
"""
|
46
46
|
Calculate cost for chat completion.
|
@@ -63,10 +63,10 @@ class CostCalculator:
|
|
63
63
|
logger.debug(f"Model {model} not found in models cache, using fallback pricing")
|
64
64
|
except Exception as e:
|
65
65
|
logger.warning(f"Failed to calculate chat cost from models cache: {e}")
|
66
|
-
|
66
|
+
|
67
67
|
# Fallback to hardcoded pricing
|
68
68
|
return self._calculate_chat_cost_fallback(usage, model)
|
69
|
-
|
69
|
+
|
70
70
|
def calculate_embedding_cost(self, tokens: int, model: str) -> float:
|
71
71
|
"""
|
72
72
|
Calculate cost for embedding generation.
|
@@ -94,16 +94,16 @@ class CostCalculator:
|
|
94
94
|
logger.debug(f"Embedding model {model} not found in models cache, using fallback pricing")
|
95
95
|
except Exception as e:
|
96
96
|
logger.warning(f"Failed to calculate embedding cost from models cache: {e}")
|
97
|
-
|
97
|
+
|
98
98
|
# Fallback to hardcoded pricing
|
99
99
|
return self._calculate_embedding_cost_fallback(tokens, model)
|
100
|
-
|
100
|
+
|
101
101
|
def _calculate_chat_cost_fallback(self, usage: Dict[str, int], model: str) -> float:
|
102
102
|
"""Calculate chat cost using fallback pricing."""
|
103
103
|
total_tokens = usage.get('total_tokens', 0)
|
104
104
|
prompt_tokens = usage.get('prompt_tokens', 0)
|
105
105
|
completion_tokens = usage.get('completion_tokens', 0)
|
106
|
-
|
106
|
+
|
107
107
|
# Find matching model cost
|
108
108
|
for model_pattern, costs in self.fallback_chat_prices.items():
|
109
109
|
if model_pattern in model.lower():
|
@@ -112,19 +112,19 @@ class CostCalculator:
|
|
112
112
|
total_cost = prompt_cost + completion_cost
|
113
113
|
logger.debug(f"Using fallback chat pricing for {model}: ${total_cost:.6f}")
|
114
114
|
return total_cost
|
115
|
-
|
115
|
+
|
116
116
|
# Default cost (using total tokens with average rate)
|
117
117
|
default_cost = (total_tokens / 1_000_000) * 0.5
|
118
118
|
logger.debug(f"Using default chat pricing for {model}: ${default_cost:.6f}")
|
119
119
|
return default_cost
|
120
|
-
|
120
|
+
|
121
121
|
def _calculate_embedding_cost_fallback(self, tokens: int, model: str) -> float:
|
122
122
|
"""Calculate embedding cost using fallback pricing."""
|
123
123
|
price_per_token = self.fallback_embedding_prices.get(model, 0.0001 / 1000)
|
124
124
|
cost = tokens * price_per_token
|
125
125
|
logger.debug(f"Using fallback embedding pricing for {model}: ${cost:.6f}")
|
126
126
|
return cost
|
127
|
-
|
127
|
+
|
128
128
|
def estimate_cost(self, model: str, input_tokens: int, output_tokens: int) -> float:
|
129
129
|
"""
|
130
130
|
Estimate cost for a model.
|
@@ -148,7 +148,7 @@ class CostCalculator:
|
|
148
148
|
logger.debug(f"Model {model} not found in models cache for cost estimation, using fallback")
|
149
149
|
except Exception as e:
|
150
150
|
logger.warning(f"Failed to estimate cost from models cache: {e}")
|
151
|
-
|
151
|
+
|
152
152
|
# Fallback to internal calculation
|
153
153
|
usage_dict = {
|
154
154
|
'total_tokens': input_tokens + output_tokens,
|
@@ -4,8 +4,8 @@ Embedding generation strategies for LLM client.
|
|
4
4
|
Provides real and mock embedding implementations.
|
5
5
|
"""
|
6
6
|
|
7
|
-
from .openai_embedder import OpenAIEmbedder
|
8
7
|
from .mock_embedder import MockEmbedder
|
8
|
+
from .openai_embedder import OpenAIEmbedder
|
9
9
|
|
10
10
|
__all__ = [
|
11
11
|
'OpenAIEmbedder',
|
@@ -4,10 +4,9 @@ Mock embedder for providers without embedding support.
|
|
4
4
|
Generates mock embeddings using MD5 hash for OpenRouter and similar providers.
|
5
5
|
"""
|
6
6
|
|
7
|
-
import time
|
8
7
|
import hashlib
|
9
8
|
import logging
|
10
|
-
|
9
|
+
import time
|
11
10
|
|
12
11
|
from ..costs import calculate_embedding_cost
|
13
12
|
from ..models import EmbeddingResponse
|