django-cfg 1.4.21__py3-none-any.whl → 1.4.24__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 +36 -7
- 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.24.dist-info}/METADATA +1 -1
- django_cfg-1.4.24.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.24.dist-info}/WHEEL +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/licenses/LICENSE +0 -0
@@ -4,9 +4,8 @@ OpenAI embedder for real embedding generation.
|
|
4
4
|
Uses OpenAI Embeddings API to generate high-quality embeddings.
|
5
5
|
"""
|
6
6
|
|
7
|
-
import time
|
8
7
|
import logging
|
9
|
-
|
8
|
+
import time
|
10
9
|
|
11
10
|
from ..costs import calculate_embedding_cost
|
12
11
|
from ..models import EmbeddingResponse
|
@@ -5,16 +5,16 @@ Provides functionality to extract structured JSON data from LLM text responses.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import json
|
8
|
-
import re
|
9
8
|
import logging
|
10
|
-
|
9
|
+
import re
|
10
|
+
from typing import Any, Dict, Optional
|
11
11
|
|
12
12
|
logger = logging.getLogger(__name__)
|
13
13
|
|
14
14
|
|
15
15
|
class JSONExtractor:
|
16
16
|
"""Utility for extracting JSON from LLM responses."""
|
17
|
-
|
17
|
+
|
18
18
|
@staticmethod
|
19
19
|
def extract_json_from_response(content: str) -> Optional[Dict[str, Any]]:
|
20
20
|
"""
|
@@ -36,7 +36,7 @@ class JSONExtractor:
|
|
36
36
|
r'```\s*(\{.*?\})\s*```',
|
37
37
|
r'(\{.*?\})',
|
38
38
|
]
|
39
|
-
|
39
|
+
|
40
40
|
for pattern in json_patterns:
|
41
41
|
matches = re.findall(pattern, content, re.DOTALL)
|
42
42
|
for match in matches:
|
@@ -44,10 +44,10 @@ class JSONExtractor:
|
|
44
44
|
return json.loads(match)
|
45
45
|
except json.JSONDecodeError:
|
46
46
|
continue
|
47
|
-
|
47
|
+
|
48
48
|
logger.debug(f"No valid JSON found in response: {content[:100]}...")
|
49
49
|
return None
|
50
|
-
|
50
|
+
|
51
51
|
@staticmethod
|
52
52
|
def extract_code_blocks(content: str, language: Optional[str] = None) -> list[str]:
|
53
53
|
"""
|
@@ -64,10 +64,10 @@ class JSONExtractor:
|
|
64
64
|
pattern = rf'```{language}\s*(.*?)\s*```'
|
65
65
|
else:
|
66
66
|
pattern = r'```(?:\w+)?\s*(.*?)\s*```'
|
67
|
-
|
67
|
+
|
68
68
|
matches = re.findall(pattern, content, re.DOTALL)
|
69
69
|
return [match.strip() for match in matches]
|
70
|
-
|
70
|
+
|
71
71
|
@staticmethod
|
72
72
|
def extract_markdown_sections(content: str, section_title: str) -> list[str]:
|
73
73
|
"""
|
@@ -3,9 +3,9 @@ Pydantic models for LLM client responses.
|
|
3
3
|
"""
|
4
4
|
|
5
5
|
import math
|
6
|
-
from typing import
|
6
|
+
from typing import Any, Dict, List, Optional
|
7
|
+
|
7
8
|
from pydantic import BaseModel, Field, validator
|
8
|
-
from datetime import datetime
|
9
9
|
|
10
10
|
|
11
11
|
class TokenUsage(BaseModel):
|
@@ -35,14 +35,14 @@ class ChatCompletionResponse(BaseModel):
|
|
35
35
|
cost_usd: float = Field(default=0.0, description="Cost in USD")
|
36
36
|
processing_time: float = Field(default=0.0, description="Processing time in seconds")
|
37
37
|
extracted_json: Optional[Dict[str, Any]] = Field(default=None, description="Extracted JSON if any")
|
38
|
-
|
38
|
+
|
39
39
|
@validator('cost_usd')
|
40
40
|
def validate_cost_usd(cls, v):
|
41
41
|
"""Validate cost_usd to prevent NaN values."""
|
42
42
|
if v is None or math.isnan(v) or math.isinf(v):
|
43
43
|
return 0.0
|
44
44
|
return v
|
45
|
-
|
45
|
+
|
46
46
|
@validator('processing_time')
|
47
47
|
def validate_processing_time(cls, v):
|
48
48
|
"""Validate processing_time to prevent NaN values."""
|
@@ -61,7 +61,7 @@ class EmbeddingResponse(BaseModel):
|
|
61
61
|
dimension: int = Field(description="Embedding vector dimension")
|
62
62
|
response_time: float = Field(description="Response time in seconds")
|
63
63
|
warning: Optional[str] = Field(default=None, description="Warning message if any")
|
64
|
-
|
64
|
+
|
65
65
|
class Config:
|
66
66
|
"""Pydantic configuration."""
|
67
67
|
json_encoders = {
|
@@ -5,9 +5,9 @@ Provides simplified interface to query models cache.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import logging
|
8
|
-
from typing import Dict, List, Optional
|
8
|
+
from typing import Any, Dict, List, Optional
|
9
9
|
|
10
|
-
from ..models_cache import
|
10
|
+
from ..models_cache import ModelInfo, ModelsCache
|
11
11
|
|
12
12
|
logger = logging.getLogger(__name__)
|
13
13
|
|
@@ -6,14 +6,13 @@ Adapted for django-cfg from unreal_llm
|
|
6
6
|
import asyncio
|
7
7
|
import json
|
8
8
|
import logging
|
9
|
-
import time
|
10
|
-
from datetime import datetime, timedelta
|
11
|
-
from typing import Dict, List, Optional, Any, Union
|
12
9
|
from dataclasses import dataclass
|
10
|
+
from datetime import datetime, timedelta
|
13
11
|
from pathlib import Path
|
14
|
-
from
|
12
|
+
from typing import Any, Dict, List, Optional
|
13
|
+
|
15
14
|
import aiohttp
|
16
|
-
from
|
15
|
+
from cachetools import TTLCache
|
17
16
|
|
18
17
|
logger = logging.getLogger(__name__)
|
19
18
|
|
@@ -38,12 +37,12 @@ class ModelInfo:
|
|
38
37
|
|
39
38
|
class ModelsCache:
|
40
39
|
"""Cache for OpenRouter models with pricing information"""
|
41
|
-
|
40
|
+
|
42
41
|
DEFAULT_TTL = 86400 # 24 hours default
|
43
42
|
DEFAULT_CACHE_SIZE = 100
|
44
43
|
CACHE_FILENAME = "openrouter_models.json"
|
45
|
-
|
46
|
-
def __init__(self,
|
44
|
+
|
45
|
+
def __init__(self,
|
47
46
|
api_key: str,
|
48
47
|
cache_dir: Optional[Path] = None,
|
49
48
|
cache_ttl: int = DEFAULT_TTL,
|
@@ -60,7 +59,7 @@ class ModelsCache:
|
|
60
59
|
self.api_key = api_key
|
61
60
|
self.cache_ttl = cache_ttl
|
62
61
|
self.max_cache_size = max_cache_size
|
63
|
-
|
62
|
+
|
64
63
|
# Determine cache directory
|
65
64
|
if cache_dir:
|
66
65
|
self.cache_dir = Path(cache_dir)
|
@@ -79,31 +78,31 @@ class ModelsCache:
|
|
79
78
|
self.cache_dir = Path.cwd() / "cache" / "django_llm"
|
80
79
|
except:
|
81
80
|
self.cache_dir = Path.cwd() / "cache" / "django_llm"
|
82
|
-
|
81
|
+
|
83
82
|
# Ensure cache directory exists
|
84
83
|
self.cache_dir.mkdir(parents=True, exist_ok=True)
|
85
84
|
self.cache_file = self.cache_dir / self.CACHE_FILENAME
|
86
|
-
|
85
|
+
|
87
86
|
# Memory cache
|
88
87
|
self.cache = TTLCache(maxsize=max_cache_size, ttl=cache_ttl)
|
89
88
|
self.last_fetch_time: Optional[datetime] = None
|
90
89
|
self.models: Dict[str, ModelInfo] = {}
|
91
|
-
|
90
|
+
|
92
91
|
# Cache key for models list
|
93
92
|
self.models_cache_key = "openrouter_models"
|
94
|
-
|
93
|
+
|
95
94
|
# Load from file cache on initialization
|
96
95
|
self._load_from_file()
|
97
|
-
|
96
|
+
|
98
97
|
def _load_from_file(self) -> bool:
|
99
98
|
"""Load models from file cache"""
|
100
99
|
try:
|
101
100
|
if not self.cache_file.exists():
|
102
101
|
return False
|
103
|
-
|
104
|
-
with open(self.cache_file,
|
102
|
+
|
103
|
+
with open(self.cache_file, encoding='utf-8') as f:
|
105
104
|
data = json.load(f)
|
106
|
-
|
105
|
+
|
107
106
|
# Check if cache is still valid
|
108
107
|
fetch_time_str = data.get('fetch_time')
|
109
108
|
if fetch_time_str:
|
@@ -111,11 +110,11 @@ class ModelsCache:
|
|
111
110
|
if datetime.now() - fetch_time > timedelta(seconds=self.cache_ttl):
|
112
111
|
logger.debug("File cache expired")
|
113
112
|
return False
|
114
|
-
|
113
|
+
|
115
114
|
# Parse models
|
116
115
|
models_data = data.get('models', {})
|
117
116
|
self.models = {}
|
118
|
-
|
117
|
+
|
119
118
|
for model_id, model_data in models_data.items():
|
120
119
|
try:
|
121
120
|
pricing = ModelPricing(
|
@@ -123,7 +122,7 @@ class ModelsCache:
|
|
123
122
|
completion_price=model_data['pricing']['completion_price'],
|
124
123
|
currency=model_data['pricing']['currency']
|
125
124
|
)
|
126
|
-
|
125
|
+
|
127
126
|
model_info = ModelInfo(
|
128
127
|
id=model_data['id'],
|
129
128
|
name=model_data['name'],
|
@@ -134,29 +133,29 @@ class ModelsCache:
|
|
134
133
|
tags=model_data.get('tags', []),
|
135
134
|
is_available=model_data.get('is_available', True)
|
136
135
|
)
|
137
|
-
|
136
|
+
|
138
137
|
self.models[model_id] = model_info
|
139
|
-
|
138
|
+
|
140
139
|
except Exception as e:
|
141
140
|
logger.warning(f"Failed to parse cached model {model_id}: {e}")
|
142
141
|
continue
|
143
|
-
|
142
|
+
|
144
143
|
if fetch_time_str:
|
145
144
|
self.last_fetch_time = datetime.fromisoformat(fetch_time_str)
|
146
|
-
|
145
|
+
|
147
146
|
# Also update memory cache
|
148
147
|
self.cache[self.models_cache_key] = {
|
149
148
|
"models": self.models,
|
150
149
|
"fetch_time": self.last_fetch_time
|
151
150
|
}
|
152
|
-
|
151
|
+
|
153
152
|
logger.info(f"Loaded {len(self.models)} models from file cache")
|
154
153
|
return True
|
155
|
-
|
154
|
+
|
156
155
|
except Exception as e:
|
157
156
|
logger.warning(f"Failed to load models from file cache: {e}")
|
158
157
|
return False
|
159
|
-
|
158
|
+
|
160
159
|
def _save_to_file(self) -> bool:
|
161
160
|
"""Save models to file cache"""
|
162
161
|
try:
|
@@ -177,27 +176,27 @@ class ModelsCache:
|
|
177
176
|
'tags': model_info.tags,
|
178
177
|
'is_available': model_info.is_available
|
179
178
|
}
|
180
|
-
|
179
|
+
|
181
180
|
data = {
|
182
181
|
'models': models_data,
|
183
182
|
'fetch_time': self.last_fetch_time.isoformat() if self.last_fetch_time else None,
|
184
183
|
'cache_ttl': self.cache_ttl,
|
185
184
|
'total_models': len(self.models)
|
186
185
|
}
|
187
|
-
|
186
|
+
|
188
187
|
# Write to file atomically
|
189
188
|
temp_file = self.cache_file.with_suffix('.tmp')
|
190
189
|
with open(temp_file, 'w', encoding='utf-8') as f:
|
191
190
|
json.dump(data, f, indent=2, ensure_ascii=False)
|
192
|
-
|
191
|
+
|
193
192
|
temp_file.replace(self.cache_file)
|
194
193
|
logger.debug(f"Saved {len(self.models)} models to file cache")
|
195
194
|
return True
|
196
|
-
|
195
|
+
|
197
196
|
except Exception as e:
|
198
197
|
logger.error(f"Failed to save models to file cache: {e}")
|
199
198
|
return False
|
200
|
-
|
199
|
+
|
201
200
|
async def fetch_models(self, force_refresh: bool = False) -> Dict[str, ModelInfo]:
|
202
201
|
"""
|
203
202
|
Fetch models from OpenRouter API
|
@@ -215,7 +214,7 @@ class ModelsCache:
|
|
215
214
|
self.models = cached_data["models"]
|
216
215
|
self.last_fetch_time = cached_data["fetch_time"]
|
217
216
|
return self.models
|
218
|
-
|
217
|
+
|
219
218
|
# Check if we have models from file cache and they're still valid
|
220
219
|
if not force_refresh and self.models and self.last_fetch_time:
|
221
220
|
if datetime.now() - self.last_fetch_time < timedelta(seconds=self.cache_ttl):
|
@@ -226,9 +225,9 @@ class ModelsCache:
|
|
226
225
|
"fetch_time": self.last_fetch_time
|
227
226
|
}
|
228
227
|
return self.models
|
229
|
-
|
228
|
+
|
230
229
|
logger.info("Fetching models from OpenRouter API")
|
231
|
-
|
230
|
+
|
232
231
|
try:
|
233
232
|
async with aiohttp.ClientSession() as session:
|
234
233
|
async with session.get(
|
@@ -241,27 +240,27 @@ class ModelsCache:
|
|
241
240
|
) as response:
|
242
241
|
response.raise_for_status()
|
243
242
|
data = await response.json()
|
244
|
-
|
243
|
+
|
245
244
|
# Parse models
|
246
245
|
self.models = {}
|
247
246
|
for model_data in data.get("data", []):
|
248
247
|
model_info = self._parse_model_data(model_data)
|
249
248
|
if model_info:
|
250
249
|
self.models[model_info.id] = model_info
|
251
|
-
|
250
|
+
|
252
251
|
# Update cache
|
253
252
|
self.last_fetch_time = datetime.now()
|
254
253
|
self.cache[self.models_cache_key] = {
|
255
254
|
"models": self.models,
|
256
255
|
"fetch_time": self.last_fetch_time
|
257
256
|
}
|
258
|
-
|
257
|
+
|
259
258
|
# Save to file
|
260
259
|
self._save_to_file()
|
261
|
-
|
260
|
+
|
262
261
|
logger.info(f"Fetched {len(self.models)} models from OpenRouter")
|
263
262
|
return self.models
|
264
|
-
|
263
|
+
|
265
264
|
except aiohttp.ClientError as e:
|
266
265
|
logger.error(f"Failed to fetch models: {e}")
|
267
266
|
# Return cached models if available
|
@@ -276,14 +275,14 @@ class ModelsCache:
|
|
276
275
|
logger.info(f"Using stale cached models ({len(self.models)} models)")
|
277
276
|
return self.models
|
278
277
|
raise
|
279
|
-
|
278
|
+
|
280
279
|
def _parse_model_data(self, model_data: Dict[str, Any]) -> Optional[ModelInfo]:
|
281
280
|
"""Parse model data from API response"""
|
282
281
|
try:
|
283
282
|
# Check required fields
|
284
283
|
if not model_data.get("id") or not model_data.get("name"):
|
285
284
|
return None
|
286
|
-
|
285
|
+
|
287
286
|
# Extract pricing information
|
288
287
|
pricing_data = model_data.get("pricing", {})
|
289
288
|
pricing = ModelPricing(
|
@@ -291,7 +290,7 @@ class ModelsCache:
|
|
291
290
|
completion_price=pricing_data.get("completion", 0.0),
|
292
291
|
currency=pricing_data.get("currency", "USD")
|
293
292
|
)
|
294
|
-
|
293
|
+
|
295
294
|
# Create model info
|
296
295
|
model_info = ModelInfo(
|
297
296
|
id=model_data.get("id", ""),
|
@@ -303,23 +302,23 @@ class ModelsCache:
|
|
303
302
|
tags=model_data.get("tags", []),
|
304
303
|
is_available=model_data.get("available", True)
|
305
304
|
)
|
306
|
-
|
305
|
+
|
307
306
|
return model_info
|
308
|
-
|
307
|
+
|
309
308
|
except Exception as e:
|
310
309
|
logger.warning(f"Failed to parse model data: {e}")
|
311
310
|
return None
|
312
|
-
|
311
|
+
|
313
312
|
def get_model(self, model_id: str) -> Optional[ModelInfo]:
|
314
313
|
"""Get model information by ID"""
|
315
314
|
return self.models.get(model_id)
|
316
|
-
|
315
|
+
|
317
316
|
def get_models_by_provider(self, provider: str) -> List[ModelInfo]:
|
318
317
|
"""Get all models from a specific provider"""
|
319
318
|
return [model for model in self.models.values() if model.provider == provider]
|
320
|
-
|
321
|
-
def get_models_by_price_range(self,
|
322
|
-
min_price: float = 0.0,
|
319
|
+
|
320
|
+
def get_models_by_price_range(self,
|
321
|
+
min_price: float = 0.0,
|
323
322
|
max_price: float = float('inf'),
|
324
323
|
price_type: str = "prompt") -> List[ModelInfo]:
|
325
324
|
"""
|
@@ -334,59 +333,59 @@ class ModelsCache:
|
|
334
333
|
List of models in price range
|
335
334
|
"""
|
336
335
|
filtered_models = []
|
337
|
-
|
336
|
+
|
338
337
|
for model in self.models.values():
|
339
338
|
if not model.is_available:
|
340
339
|
continue
|
341
|
-
|
340
|
+
|
342
341
|
price = model.pricing.prompt_price if price_type == "prompt" else model.pricing.completion_price
|
343
|
-
|
342
|
+
|
344
343
|
if min_price <= price <= max_price:
|
345
344
|
filtered_models.append(model)
|
346
|
-
|
345
|
+
|
347
346
|
# Sort by price
|
348
347
|
filtered_models.sort(key=lambda m: m.pricing.prompt_price if price_type == "prompt" else m.pricing.completion_price)
|
349
|
-
|
348
|
+
|
350
349
|
return filtered_models
|
351
|
-
|
350
|
+
|
352
351
|
def get_free_models(self) -> List[ModelInfo]:
|
353
352
|
"""Get all free models (price = 0)"""
|
354
353
|
return self.get_models_by_price_range(0.0, 0.0)
|
355
|
-
|
354
|
+
|
356
355
|
def get_budget_models(self, max_price: float = 1.0) -> List[ModelInfo]:
|
357
356
|
"""Get budget models (price <= max_price)"""
|
358
357
|
return self.get_models_by_price_range(0.0, max_price)
|
359
|
-
|
358
|
+
|
360
359
|
def get_premium_models(self, min_price: float = 10.0) -> List[ModelInfo]:
|
361
360
|
"""Get premium models (price >= min_price)"""
|
362
361
|
return self.get_models_by_price_range(min_price, float('inf'))
|
363
|
-
|
362
|
+
|
364
363
|
def search_models(self, query: str) -> List[ModelInfo]:
|
365
364
|
"""Search models by name, description, or tags"""
|
366
365
|
query_lower = query.lower()
|
367
366
|
results = []
|
368
|
-
|
367
|
+
|
369
368
|
for model in self.models.values():
|
370
369
|
# Search in name
|
371
370
|
if query_lower in model.name.lower():
|
372
371
|
results.append(model)
|
373
372
|
continue
|
374
|
-
|
373
|
+
|
375
374
|
# Search in description
|
376
375
|
if model.description and query_lower in model.description.lower():
|
377
376
|
results.append(model)
|
378
377
|
continue
|
379
|
-
|
378
|
+
|
380
379
|
# Search in tags
|
381
380
|
if any(query_lower in tag.lower() for tag in model.tags):
|
382
381
|
results.append(model)
|
383
382
|
continue
|
384
|
-
|
383
|
+
|
385
384
|
return results
|
386
|
-
|
387
|
-
def get_model_cost_estimate(self,
|
388
|
-
model_id: str,
|
389
|
-
input_tokens: int,
|
385
|
+
|
386
|
+
def get_model_cost_estimate(self,
|
387
|
+
model_id: str,
|
388
|
+
input_tokens: int,
|
390
389
|
output_tokens: int) -> Optional[float]:
|
391
390
|
"""
|
392
391
|
Estimate cost for a model
|
@@ -402,13 +401,13 @@ class ModelsCache:
|
|
402
401
|
model = self.get_model(model_id)
|
403
402
|
if not model:
|
404
403
|
return None
|
405
|
-
|
404
|
+
|
406
405
|
# Calculate cost
|
407
406
|
input_cost = (input_tokens / 1_000_000) * model.pricing.prompt_price
|
408
407
|
output_cost = (output_tokens / 1_000_000) * model.pricing.completion_price
|
409
|
-
|
408
|
+
|
410
409
|
return input_cost + output_cost
|
411
|
-
|
410
|
+
|
412
411
|
def calculate_cost_from_usage(self, model_id: str, usage: Dict[str, int]) -> Optional[float]:
|
413
412
|
"""
|
414
413
|
Calculate cost from OpenAI usage object
|
@@ -423,16 +422,16 @@ class ModelsCache:
|
|
423
422
|
model = self.get_model(model_id)
|
424
423
|
if not model:
|
425
424
|
return None
|
426
|
-
|
425
|
+
|
427
426
|
prompt_tokens = usage.get('prompt_tokens', 0)
|
428
427
|
completion_tokens = usage.get('completion_tokens', 0)
|
429
|
-
|
428
|
+
|
430
429
|
# Calculate cost
|
431
430
|
input_cost = (prompt_tokens / 1_000_000) * model.pricing.prompt_price
|
432
431
|
output_cost = (completion_tokens / 1_000_000) * model.pricing.completion_price
|
433
|
-
|
432
|
+
|
434
433
|
return input_cost + output_cost
|
435
|
-
|
434
|
+
|
436
435
|
def get_cache_info(self) -> Dict[str, Any]:
|
437
436
|
"""Get cache information"""
|
438
437
|
return {
|
@@ -444,13 +443,13 @@ class ModelsCache:
|
|
444
443
|
"cache_file": str(self.cache_file),
|
445
444
|
"cache_file_exists": self.cache_file.exists()
|
446
445
|
}
|
447
|
-
|
446
|
+
|
448
447
|
def clear_cache(self):
|
449
448
|
"""Clear the cache"""
|
450
449
|
self.cache.clear()
|
451
450
|
self.models.clear()
|
452
451
|
self.last_fetch_time = None
|
453
|
-
|
452
|
+
|
454
453
|
# Also remove file cache
|
455
454
|
try:
|
456
455
|
if self.cache_file.exists():
|
@@ -458,26 +457,26 @@ class ModelsCache:
|
|
458
457
|
logger.info("Removed file cache")
|
459
458
|
except Exception as e:
|
460
459
|
logger.warning(f"Failed to remove file cache: {e}")
|
461
|
-
|
460
|
+
|
462
461
|
logger.info("Models cache cleared")
|
463
|
-
|
462
|
+
|
464
463
|
def get_models_summary(self) -> Dict[str, Any]:
|
465
464
|
"""Get summary of available models"""
|
466
465
|
if not self.models:
|
467
466
|
return {"error": "No models loaded"}
|
468
|
-
|
467
|
+
|
469
468
|
# Count by provider
|
470
469
|
provider_counts = {}
|
471
470
|
for model in self.models.values():
|
472
471
|
provider_counts[model.provider] = provider_counts.get(model.provider, 0) + 1
|
473
|
-
|
472
|
+
|
474
473
|
# Price ranges
|
475
474
|
prices = [model.pricing.prompt_price for model in self.models.values() if model.is_available]
|
476
|
-
|
475
|
+
|
477
476
|
# Count free models (both prompt and completion prices are 0)
|
478
|
-
free_models = [m for m in self.models.values()
|
477
|
+
free_models = [m for m in self.models.values()
|
479
478
|
if m.is_available and m.pricing.prompt_price == 0.0 and m.pricing.completion_price == 0.0]
|
480
|
-
|
479
|
+
|
481
480
|
return {
|
482
481
|
"total_models": len(self.models),
|
483
482
|
"available_models": len([m for m in self.models.values() if m.is_available]),
|
@@ -497,45 +496,45 @@ class ModelsCache:
|
|
497
496
|
async def example_models_cache():
|
498
497
|
"""Example usage of ModelsCache"""
|
499
498
|
import os
|
500
|
-
|
499
|
+
|
501
500
|
api_key = os.getenv("OPENROUTER_API_KEY")
|
502
501
|
if not api_key:
|
503
502
|
print("Please set OPENROUTER_API_KEY environment variable")
|
504
503
|
return
|
505
|
-
|
504
|
+
|
506
505
|
# Initialize cache
|
507
506
|
cache = ModelsCache(api_key=api_key, cache_ttl=86400) # 24 hours
|
508
|
-
|
507
|
+
|
509
508
|
try:
|
510
509
|
# Fetch models
|
511
510
|
models = await cache.fetch_models()
|
512
511
|
print(f"Fetched {len(models)} models")
|
513
|
-
|
512
|
+
|
514
513
|
# Get summary
|
515
514
|
summary = cache.get_models_summary()
|
516
515
|
print(f"Summary: {summary}")
|
517
|
-
|
516
|
+
|
518
517
|
# Get free models
|
519
518
|
free_models = cache.get_free_models()
|
520
519
|
print(f"Free models: {len(free_models)}")
|
521
520
|
for model in free_models[:5]: # Show first 5
|
522
521
|
print(f" - {model.name} ({model.provider})")
|
523
|
-
|
522
|
+
|
524
523
|
# Get budget models
|
525
524
|
budget_models = cache.get_budget_models(max_price=0.5)
|
526
525
|
print(f"Budget models (≤$0.5/1M tokens): {len(budget_models)}")
|
527
|
-
|
526
|
+
|
528
527
|
# Search for coding models
|
529
528
|
coding_models = cache.search_models("code")
|
530
529
|
print(f"Coding models: {len(coding_models)}")
|
531
530
|
for model in coding_models[:3]:
|
532
531
|
print(f" - {model.name}: ${model.pricing.prompt_price}/1M tokens")
|
533
|
-
|
532
|
+
|
534
533
|
# Estimate cost
|
535
534
|
model_id = "openai/gpt-4o-mini"
|
536
535
|
cost = cache.get_model_cost_estimate(model_id, 1000, 500)
|
537
536
|
print(f"Cost for {model_id} (1000 input + 500 output tokens): ${cost:.6f}")
|
538
|
-
|
537
|
+
|
539
538
|
except Exception as e:
|
540
539
|
print(f"Error: {e}")
|
541
540
|
|
@@ -5,8 +5,8 @@ Manages caching of chat and embedding requests.
|
|
5
5
|
"""
|
6
6
|
|
7
7
|
import logging
|
8
|
-
from typing import Optional, Dict, Any, List
|
9
8
|
from pathlib import Path
|
9
|
+
from typing import Any, Dict, List, Optional
|
10
10
|
|
11
11
|
from ..cache import LLMCache
|
12
12
|
from ..models import ChatCompletionResponse, EmbeddingResponse
|
@@ -4,9 +4,9 @@ Chat request handler for LLM client.
|
|
4
4
|
Handles chat completion requests with caching and response building.
|
5
5
|
"""
|
6
6
|
|
7
|
-
import time
|
8
7
|
import logging
|
9
|
-
|
8
|
+
import time
|
9
|
+
from typing import TYPE_CHECKING, Dict, List, Optional
|
10
10
|
|
11
11
|
from ..models import ChatCompletionResponse
|
12
12
|
from ..providers import ConfigBuilder
|
@@ -10,8 +10,8 @@ from typing import TYPE_CHECKING
|
|
10
10
|
from ..models import EmbeddingResponse
|
11
11
|
|
12
12
|
if TYPE_CHECKING:
|
13
|
+
from ..embeddings import MockEmbedder, OpenAIEmbedder
|
13
14
|
from ..providers import ProviderManager, ProviderSelector
|
14
|
-
from ..embeddings import OpenAIEmbedder, MockEmbedder
|
15
15
|
from ..stats import StatsManager
|
16
16
|
from .cache_manager import RequestCacheManager
|
17
17
|
|