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
@@ -3,14 +3,14 @@ Simple Orchestrator - Main coordination class for multi-agent workflows.
|
|
3
3
|
"""
|
4
4
|
|
5
5
|
import asyncio
|
6
|
-
import time
|
7
6
|
import logging
|
8
|
-
|
7
|
+
import time
|
9
8
|
from dataclasses import dataclass
|
9
|
+
from typing import Any, Dict, List, Optional
|
10
10
|
|
11
11
|
from .django_agent import DjangoAgent
|
12
|
+
from .exceptions import AgentNotFoundError, ConfigurationError, ExecutionError
|
12
13
|
from .models import ExecutionResult, WorkflowConfig
|
13
|
-
from .exceptions import AgentNotFoundError, ExecutionError, ConfigurationError
|
14
14
|
|
15
15
|
logger = logging.getLogger(__name__)
|
16
16
|
|
@@ -18,10 +18,10 @@ logger = logging.getLogger(__name__)
|
|
18
18
|
@dataclass
|
19
19
|
class ExecutionPattern:
|
20
20
|
"""Base class for execution patterns."""
|
21
|
-
|
21
|
+
|
22
22
|
name: str
|
23
23
|
description: str
|
24
|
-
|
24
|
+
|
25
25
|
async def execute(
|
26
26
|
self,
|
27
27
|
agents: List[DjangoAgent],
|
@@ -35,13 +35,13 @@ class ExecutionPattern:
|
|
35
35
|
|
36
36
|
class SequentialPattern(ExecutionPattern):
|
37
37
|
"""Sequential execution pattern - agents run one after another."""
|
38
|
-
|
38
|
+
|
39
39
|
def __init__(self):
|
40
40
|
super().__init__(
|
41
41
|
name="sequential",
|
42
42
|
description="Execute agents one after another, passing results forward"
|
43
43
|
)
|
44
|
-
|
44
|
+
|
45
45
|
async def execute(
|
46
46
|
self,
|
47
47
|
agents: List[DjangoAgent],
|
@@ -52,18 +52,18 @@ class SequentialPattern(ExecutionPattern):
|
|
52
52
|
"""Execute agents sequentially."""
|
53
53
|
results = []
|
54
54
|
current_prompt = prompt
|
55
|
-
|
55
|
+
|
56
56
|
for i, agent in enumerate(agents):
|
57
57
|
logger.debug(f"Executing agent {i+1}/{len(agents)}: {agent.name}")
|
58
|
-
|
58
|
+
|
59
59
|
try:
|
60
60
|
result = await agent.run(current_prompt, deps)
|
61
61
|
results.append(result)
|
62
|
-
|
62
|
+
|
63
63
|
# Pass result to next agent (if not the last one)
|
64
64
|
if i < len(agents) - 1:
|
65
65
|
current_prompt = f"Previous result: {result.output}\nNew task: {prompt}"
|
66
|
-
|
66
|
+
|
67
67
|
except Exception as e:
|
68
68
|
logger.error(f"Sequential execution failed at agent '{agent.name}': {e}")
|
69
69
|
# Add failed result
|
@@ -74,19 +74,19 @@ class SequentialPattern(ExecutionPattern):
|
|
74
74
|
error=str(e)
|
75
75
|
))
|
76
76
|
break # Stop execution on error
|
77
|
-
|
77
|
+
|
78
78
|
return results
|
79
79
|
|
80
80
|
|
81
81
|
class ParallelPattern(ExecutionPattern):
|
82
82
|
"""Parallel execution pattern - agents run concurrently."""
|
83
|
-
|
83
|
+
|
84
84
|
def __init__(self):
|
85
85
|
super().__init__(
|
86
86
|
name="parallel",
|
87
87
|
description="Execute agents concurrently with optional concurrency limits"
|
88
88
|
)
|
89
|
-
|
89
|
+
|
90
90
|
async def execute(
|
91
91
|
self,
|
92
92
|
agents: List[DjangoAgent],
|
@@ -97,7 +97,7 @@ class ParallelPattern(ExecutionPattern):
|
|
97
97
|
"""Execute agents in parallel."""
|
98
98
|
max_concurrent = kwargs.get('max_concurrent', 5)
|
99
99
|
semaphore = asyncio.Semaphore(max_concurrent)
|
100
|
-
|
100
|
+
|
101
101
|
async def run_agent_with_semaphore(agent: DjangoAgent) -> ExecutionResult:
|
102
102
|
async with semaphore:
|
103
103
|
start_time = time.time()
|
@@ -106,10 +106,10 @@ class ParallelPattern(ExecutionPattern):
|
|
106
106
|
agent_deps = deps
|
107
107
|
if isinstance(deps, dict):
|
108
108
|
agent_deps = deps.get(agent.name, deps)
|
109
|
-
|
109
|
+
|
110
110
|
result = await agent.run(prompt, agent_deps)
|
111
111
|
execution_time = time.time() - start_time
|
112
|
-
|
112
|
+
|
113
113
|
return ExecutionResult(
|
114
114
|
agent_name=agent.name,
|
115
115
|
output=result,
|
@@ -125,13 +125,13 @@ class ParallelPattern(ExecutionPattern):
|
|
125
125
|
execution_time=execution_time,
|
126
126
|
error=str(e)
|
127
127
|
)
|
128
|
-
|
128
|
+
|
129
129
|
logger.debug(f"Executing {len(agents)} agents in parallel (max_concurrent={max_concurrent})")
|
130
|
-
|
130
|
+
|
131
131
|
# Execute all agents concurrently
|
132
132
|
tasks = [run_agent_with_semaphore(agent) for agent in agents]
|
133
133
|
results = await asyncio.gather(*tasks, return_exceptions=True)
|
134
|
-
|
134
|
+
|
135
135
|
# Handle any exceptions that weren't caught
|
136
136
|
final_results = []
|
137
137
|
for i, result in enumerate(results):
|
@@ -144,19 +144,19 @@ class ParallelPattern(ExecutionPattern):
|
|
144
144
|
))
|
145
145
|
else:
|
146
146
|
final_results.append(result)
|
147
|
-
|
147
|
+
|
148
148
|
return final_results
|
149
149
|
|
150
150
|
|
151
151
|
class ConditionalPattern(ExecutionPattern):
|
152
152
|
"""Conditional execution pattern - execute agents based on conditions."""
|
153
|
-
|
153
|
+
|
154
154
|
def __init__(self):
|
155
155
|
super().__init__(
|
156
156
|
name="conditional",
|
157
157
|
description="Execute agents based on condition evaluation"
|
158
158
|
)
|
159
|
-
|
159
|
+
|
160
160
|
async def execute(
|
161
161
|
self,
|
162
162
|
agents: List[DjangoAgent],
|
@@ -167,32 +167,32 @@ class ConditionalPattern(ExecutionPattern):
|
|
167
167
|
"""Execute agents conditionally."""
|
168
168
|
if len(agents) < 2:
|
169
169
|
raise ConfigurationError("Conditional pattern requires at least 2 agents")
|
170
|
-
|
170
|
+
|
171
171
|
# First agent determines condition
|
172
172
|
condition_agent = agents[0]
|
173
173
|
execution_agents = agents[1:]
|
174
|
-
|
174
|
+
|
175
175
|
logger.debug(f"Using '{condition_agent.name}' as condition agent")
|
176
|
-
|
176
|
+
|
177
177
|
# Get condition
|
178
178
|
condition_result = await condition_agent.run(prompt, deps)
|
179
179
|
results = [condition_result]
|
180
|
-
|
180
|
+
|
181
181
|
# Check if we should proceed
|
182
182
|
should_proceed = self._evaluate_condition(condition_result.output)
|
183
|
-
|
183
|
+
|
184
184
|
if should_proceed:
|
185
185
|
logger.debug(f"Condition met, executing {len(execution_agents)} agents")
|
186
|
-
|
186
|
+
|
187
187
|
# Execute remaining agents sequentially
|
188
188
|
sequential = SequentialPattern()
|
189
189
|
execution_results = await sequential.execute(execution_agents, prompt, deps, **kwargs)
|
190
190
|
results.extend(execution_results)
|
191
191
|
else:
|
192
192
|
logger.debug("Condition not met, skipping execution agents")
|
193
|
-
|
193
|
+
|
194
194
|
return results
|
195
|
-
|
195
|
+
|
196
196
|
def _evaluate_condition(self, output: Any) -> bool:
|
197
197
|
"""Evaluate condition from agent output."""
|
198
198
|
# Simple condition evaluation
|
@@ -214,7 +214,7 @@ class SimpleOrchestrator:
|
|
214
214
|
Provides simple, clean interface for multi-agent workflows
|
215
215
|
following KISS principles.
|
216
216
|
"""
|
217
|
-
|
217
|
+
|
218
218
|
def __init__(self):
|
219
219
|
"""Initialize orchestrator."""
|
220
220
|
self.agents: Dict[str, DjangoAgent] = {}
|
@@ -223,14 +223,14 @@ class SimpleOrchestrator:
|
|
223
223
|
'parallel': ParallelPattern(),
|
224
224
|
'conditional': ConditionalPattern()
|
225
225
|
}
|
226
|
-
|
226
|
+
|
227
227
|
# Metrics
|
228
228
|
self._total_executions = 0
|
229
229
|
self._total_execution_time = 0.0
|
230
230
|
self._pattern_usage = {}
|
231
|
-
|
231
|
+
|
232
232
|
logger.info("Initialized SimpleOrchestrator")
|
233
|
-
|
233
|
+
|
234
234
|
def register_agent(self, agent: DjangoAgent):
|
235
235
|
"""
|
236
236
|
Register agent with orchestrator.
|
@@ -243,10 +243,10 @@ class SimpleOrchestrator:
|
|
243
243
|
"""
|
244
244
|
if agent.name in self.agents:
|
245
245
|
raise ConfigurationError(f"Agent '{agent.name}' already registered")
|
246
|
-
|
246
|
+
|
247
247
|
self.agents[agent.name] = agent
|
248
248
|
logger.info(f"Registered agent '{agent.name}'")
|
249
|
-
|
249
|
+
|
250
250
|
def unregister_agent(self, agent_name: str):
|
251
251
|
"""
|
252
252
|
Unregister agent from orchestrator.
|
@@ -257,7 +257,7 @@ class SimpleOrchestrator:
|
|
257
257
|
if agent_name in self.agents:
|
258
258
|
del self.agents[agent_name]
|
259
259
|
logger.info(f"Unregistered agent '{agent_name}'")
|
260
|
-
|
260
|
+
|
261
261
|
def get_agent(self, name: str) -> DjangoAgent:
|
262
262
|
"""
|
263
263
|
Get registered agent by name.
|
@@ -273,13 +273,13 @@ class SimpleOrchestrator:
|
|
273
273
|
"""
|
274
274
|
if name not in self.agents:
|
275
275
|
raise AgentNotFoundError(name)
|
276
|
-
|
276
|
+
|
277
277
|
return self.agents[name]
|
278
|
-
|
278
|
+
|
279
279
|
def list_agents(self) -> List[str]:
|
280
280
|
"""Get list of registered agent names."""
|
281
281
|
return list(self.agents.keys())
|
282
|
-
|
282
|
+
|
283
283
|
def add_pattern(self, pattern: ExecutionPattern):
|
284
284
|
"""
|
285
285
|
Add custom execution pattern.
|
@@ -289,7 +289,7 @@ class SimpleOrchestrator:
|
|
289
289
|
"""
|
290
290
|
self.patterns[pattern.name] = pattern
|
291
291
|
logger.info(f"Added execution pattern '{pattern.name}'")
|
292
|
-
|
292
|
+
|
293
293
|
async def execute(
|
294
294
|
self,
|
295
295
|
pattern: str,
|
@@ -324,59 +324,59 @@ class SimpleOrchestrator:
|
|
324
324
|
raise ConfigurationError(
|
325
325
|
f"Unknown pattern '{pattern}'. Available patterns: {available_patterns}"
|
326
326
|
)
|
327
|
-
|
327
|
+
|
328
328
|
# Validate agents
|
329
329
|
agent_instances = []
|
330
330
|
for agent_name in agents:
|
331
331
|
if agent_name not in self.agents:
|
332
332
|
raise AgentNotFoundError(agent_name)
|
333
333
|
agent_instances.append(self.agents[agent_name])
|
334
|
-
|
334
|
+
|
335
335
|
# Apply configuration
|
336
336
|
if config:
|
337
337
|
kwargs.setdefault('max_concurrent', config.max_concurrent)
|
338
338
|
kwargs.setdefault('timeout', config.timeout)
|
339
|
-
|
339
|
+
|
340
340
|
# Execute pattern
|
341
341
|
start_time = time.time()
|
342
342
|
execution_id = f"exec_{int(time.time() * 1000)}"
|
343
|
-
|
343
|
+
|
344
344
|
logger.info(
|
345
345
|
f"Starting execution {execution_id}: pattern='{pattern}', "
|
346
346
|
f"agents={agents}, prompt='{prompt[:50]}...'"
|
347
347
|
)
|
348
|
-
|
348
|
+
|
349
349
|
try:
|
350
350
|
pattern_executor = self.patterns[pattern]
|
351
351
|
results = await pattern_executor.execute(agent_instances, prompt, deps, **kwargs)
|
352
|
-
|
352
|
+
|
353
353
|
execution_time = time.time() - start_time
|
354
|
-
|
354
|
+
|
355
355
|
# Update metrics
|
356
356
|
self._total_executions += 1
|
357
357
|
self._total_execution_time += execution_time
|
358
358
|
self._pattern_usage[pattern] = self._pattern_usage.get(pattern, 0) + 1
|
359
|
-
|
359
|
+
|
360
360
|
# Log results
|
361
361
|
successful_agents = sum(1 for r in results if r.success)
|
362
362
|
failed_agents = len(results) - successful_agents
|
363
|
-
|
363
|
+
|
364
364
|
logger.info(
|
365
365
|
f"Completed execution {execution_id} in {execution_time:.2f}s: "
|
366
366
|
f"{successful_agents} successful, {failed_agents} failed"
|
367
367
|
)
|
368
|
-
|
368
|
+
|
369
369
|
return results
|
370
|
-
|
370
|
+
|
371
371
|
except Exception as e:
|
372
372
|
execution_time = time.time() - start_time
|
373
373
|
logger.error(f"Execution {execution_id} failed after {execution_time:.2f}s: {e}")
|
374
|
-
|
374
|
+
|
375
375
|
raise ExecutionError(
|
376
376
|
f"Execution failed: {str(e)}",
|
377
377
|
original_error=e
|
378
378
|
)
|
379
|
-
|
379
|
+
|
380
380
|
def get_metrics(self) -> Dict[str, Any]:
|
381
381
|
"""Get orchestrator metrics."""
|
382
382
|
return {
|
@@ -390,17 +390,17 @@ class SimpleOrchestrator:
|
|
390
390
|
'registered_agents': len(self.agents),
|
391
391
|
'available_patterns': list(self.patterns.keys())
|
392
392
|
}
|
393
|
-
|
393
|
+
|
394
394
|
def reset_metrics(self):
|
395
395
|
"""Reset orchestrator metrics."""
|
396
396
|
self._total_executions = 0
|
397
397
|
self._total_execution_time = 0.0
|
398
398
|
self._pattern_usage = {}
|
399
|
-
|
399
|
+
|
400
400
|
@property
|
401
401
|
def registered_agents(self) -> Dict[str, DjangoAgent]:
|
402
402
|
"""Get copy of registered agents."""
|
403
403
|
return self.agents.copy()
|
404
|
-
|
404
|
+
|
405
405
|
def __repr__(self) -> str:
|
406
406
|
return f"SimpleOrchestrator(agents={len(self.agents)}, patterns={len(self.patterns)})"
|
@@ -3,11 +3,16 @@ Simple example demonstrating Django Orchestrator usage.
|
|
3
3
|
"""
|
4
4
|
|
5
5
|
import asyncio
|
6
|
-
|
7
|
-
from pydantic import BaseModel
|
6
|
+
|
8
7
|
from django.contrib.auth.models import User
|
8
|
+
from pydantic import BaseModel
|
9
9
|
|
10
|
-
from django_cfg.modules.django_orchestrator import
|
10
|
+
from django_cfg.modules.django_orchestrator import (
|
11
|
+
DjangoAgent,
|
12
|
+
DjangoDeps,
|
13
|
+
RunContext,
|
14
|
+
SimpleOrchestrator,
|
15
|
+
)
|
11
16
|
|
12
17
|
|
13
18
|
# Define output model
|
@@ -40,7 +45,7 @@ async def get_time_of_day(ctx: RunContext[DjangoDeps]) -> str:
|
|
40
45
|
"""Get current time of day for greeting."""
|
41
46
|
from datetime import datetime
|
42
47
|
hour = datetime.now().hour
|
43
|
-
|
48
|
+
|
44
49
|
if hour < 12:
|
45
50
|
return "morning"
|
46
51
|
elif hour < 17:
|
@@ -53,7 +58,7 @@ async def simple_example():
|
|
53
58
|
"""Run simple orchestrator example."""
|
54
59
|
print("š¤ Django Orchestrator Simple Example")
|
55
60
|
print("=" * 50)
|
56
|
-
|
61
|
+
|
57
62
|
# Create test user (in real app, get from request)
|
58
63
|
try:
|
59
64
|
user = await User.objects.aget(username='testuser')
|
@@ -64,14 +69,14 @@ async def simple_example():
|
|
64
69
|
first_name='Test',
|
65
70
|
last_name='User'
|
66
71
|
)
|
67
|
-
|
72
|
+
|
68
73
|
# Create dependencies
|
69
74
|
deps = DjangoDeps(user=user)
|
70
|
-
|
75
|
+
|
71
76
|
# Create orchestrator
|
72
77
|
orchestrator = SimpleOrchestrator()
|
73
78
|
orchestrator.register_agent(greeting_agent)
|
74
|
-
|
79
|
+
|
75
80
|
# Execute single agent
|
76
81
|
print("\n1. Single Agent Execution:")
|
77
82
|
results = await orchestrator.execute(
|
@@ -80,19 +85,19 @@ async def simple_example():
|
|
80
85
|
prompt="Create a personalized greeting",
|
81
86
|
deps=deps
|
82
87
|
)
|
83
|
-
|
88
|
+
|
84
89
|
result = results[0]
|
85
90
|
print(f"ā
Agent: {result.agent_name}")
|
86
91
|
print(f"ā
Output: {result.output}")
|
87
92
|
print(f"ā
Execution Time: {result.execution_time:.2f}s")
|
88
93
|
print(f"ā
Tokens Used: {result.tokens_used}")
|
89
|
-
|
94
|
+
|
90
95
|
# Get metrics
|
91
96
|
print("\n2. Agent Metrics:")
|
92
97
|
metrics = greeting_agent.get_metrics()
|
93
98
|
for key, value in metrics.items():
|
94
99
|
print(f"š {key}: {value}")
|
95
|
-
|
100
|
+
|
96
101
|
# Get orchestrator metrics
|
97
102
|
print("\n3. Orchestrator Metrics:")
|
98
103
|
orch_metrics = orchestrator.get_metrics()
|
@@ -104,7 +109,7 @@ async def multi_agent_example():
|
|
104
109
|
"""Run multi-agent orchestrator example."""
|
105
110
|
print("\nš¤ Multi-Agent Example")
|
106
111
|
print("=" * 30)
|
107
|
-
|
112
|
+
|
108
113
|
# Create additional agents
|
109
114
|
analyzer_agent = DjangoAgent[DjangoDeps, BaseModel](
|
110
115
|
name="content_analyzer",
|
@@ -112,23 +117,23 @@ async def multi_agent_example():
|
|
112
117
|
output_type=BaseModel,
|
113
118
|
instructions="Analyze content sentiment and topics"
|
114
119
|
)
|
115
|
-
|
120
|
+
|
116
121
|
formatter_agent = DjangoAgent[DjangoDeps, BaseModel](
|
117
122
|
name="content_formatter",
|
118
123
|
deps_type=DjangoDeps,
|
119
124
|
output_type=BaseModel,
|
120
125
|
instructions="Format content for display"
|
121
126
|
)
|
122
|
-
|
127
|
+
|
123
128
|
# Create orchestrator
|
124
129
|
orchestrator = SimpleOrchestrator()
|
125
130
|
orchestrator.register_agent(analyzer_agent)
|
126
131
|
orchestrator.register_agent(formatter_agent)
|
127
|
-
|
132
|
+
|
128
133
|
# Get user
|
129
134
|
user = await User.objects.aget(username='testuser')
|
130
135
|
deps = DjangoDeps(user=user)
|
131
|
-
|
136
|
+
|
132
137
|
# Execute sequential workflow
|
133
138
|
print("\n1. Sequential Workflow:")
|
134
139
|
results = await orchestrator.execute(
|
@@ -137,10 +142,10 @@ async def multi_agent_example():
|
|
137
142
|
prompt="Analyze and format this content: Hello world!",
|
138
143
|
deps=deps
|
139
144
|
)
|
140
|
-
|
145
|
+
|
141
146
|
for i, result in enumerate(results, 1):
|
142
147
|
print(f"Step {i} - {result.agent_name}: {result.success}")
|
143
|
-
|
148
|
+
|
144
149
|
# Execute parallel workflow
|
145
150
|
print("\n2. Parallel Workflow:")
|
146
151
|
results = await orchestrator.execute(
|
@@ -150,7 +155,7 @@ async def multi_agent_example():
|
|
150
155
|
deps=deps,
|
151
156
|
max_concurrent=2
|
152
157
|
)
|
153
|
-
|
158
|
+
|
154
159
|
successful = sum(1 for r in results if r.success)
|
155
160
|
print(f"ā
{successful}/{len(results)} agents completed successfully")
|
156
161
|
|
@@ -2,9 +2,9 @@
|
|
2
2
|
Django integration components for orchestrator.
|
3
3
|
"""
|
4
4
|
|
5
|
+
from .middleware import OrchestratorMiddleware
|
5
6
|
from .registry import AgentRegistry, initialize_registry
|
6
7
|
from .signals import setup_signals
|
7
|
-
from .middleware import OrchestratorMiddleware
|
8
8
|
|
9
9
|
__all__ = [
|
10
10
|
"AgentRegistry",
|
@@ -2,9 +2,10 @@
|
|
2
2
|
Django middleware for orchestrator integration.
|
3
3
|
"""
|
4
4
|
|
5
|
-
import time
|
6
5
|
import logging
|
6
|
+
import time
|
7
7
|
from typing import Callable
|
8
|
+
|
8
9
|
from django.http import HttpRequest, HttpResponse
|
9
10
|
from django.utils.deprecation import MiddlewareMixin
|
10
11
|
|
@@ -21,12 +22,12 @@ class OrchestratorMiddleware(MiddlewareMixin):
|
|
21
22
|
- Error tracking
|
22
23
|
- User session integration
|
23
24
|
"""
|
24
|
-
|
25
|
+
|
25
26
|
def __init__(self, get_response: Callable):
|
26
27
|
"""Initialize middleware."""
|
27
28
|
self.get_response = get_response
|
28
29
|
super().__init__(get_response)
|
29
|
-
|
30
|
+
|
30
31
|
def process_request(self, request: HttpRequest):
|
31
32
|
"""Process incoming request."""
|
32
33
|
# Add orchestrator context to request
|
@@ -36,25 +37,25 @@ class OrchestratorMiddleware(MiddlewareMixin):
|
|
36
37
|
'ip_address': self._get_client_ip(request),
|
37
38
|
'session_key': request.session.session_key if hasattr(request, 'session') else None,
|
38
39
|
}
|
39
|
-
|
40
|
+
|
40
41
|
logger.debug(f"Orchestrator middleware: Processing request {request.path}")
|
41
|
-
|
42
|
+
|
42
43
|
def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse:
|
43
44
|
"""Process outgoing response."""
|
44
45
|
if hasattr(request, 'orchestrator_start_time'):
|
45
46
|
duration = time.time() - request.orchestrator_start_time
|
46
|
-
|
47
|
+
|
47
48
|
# Add performance header
|
48
49
|
response['X-Orchestrator-Duration'] = f"{duration:.3f}s"
|
49
|
-
|
50
|
+
|
50
51
|
# Log slow requests
|
51
52
|
if duration > 5.0: # 5 seconds threshold
|
52
53
|
logger.warning(
|
53
54
|
f"Slow request detected: {request.path} took {duration:.3f}s"
|
54
55
|
)
|
55
|
-
|
56
|
+
|
56
57
|
return response
|
57
|
-
|
58
|
+
|
58
59
|
def process_exception(self, request: HttpRequest, exception: Exception):
|
59
60
|
"""Process exceptions."""
|
60
61
|
if hasattr(request, 'orchestrator_context'):
|
@@ -66,10 +67,10 @@ class OrchestratorMiddleware(MiddlewareMixin):
|
|
66
67
|
'orchestrator_context': request.orchestrator_context,
|
67
68
|
}
|
68
69
|
)
|
69
|
-
|
70
|
+
|
70
71
|
# Don't handle the exception, just log it
|
71
72
|
return None
|
72
|
-
|
73
|
+
|
73
74
|
def _get_client_ip(self, request: HttpRequest) -> str:
|
74
75
|
"""Get client IP address."""
|
75
76
|
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
|