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.
Files changed (793) hide show
  1. django_cfg/__init__.py +4 -4
  2. django_cfg/apps/accounts/__init__.py +1 -1
  3. django_cfg/apps/accounts/__models.py +30 -29
  4. django_cfg/apps/accounts/admin/__init__.py +14 -3
  5. django_cfg/apps/accounts/admin/activity_admin.py +19 -19
  6. django_cfg/apps/accounts/admin/filters.py +7 -6
  7. django_cfg/apps/accounts/admin/group_admin.py +10 -16
  8. django_cfg/apps/accounts/admin/inlines.py +21 -19
  9. django_cfg/apps/accounts/admin/otp_admin.py +12 -12
  10. django_cfg/apps/accounts/admin/registration_admin.py +24 -24
  11. django_cfg/apps/accounts/admin/resources.py +49 -48
  12. django_cfg/apps/accounts/admin/twilio_admin.py +37 -37
  13. django_cfg/apps/accounts/admin/user_admin.py +45 -41
  14. django_cfg/apps/accounts/management/commands/otp_test.py +11 -11
  15. django_cfg/apps/accounts/managers/__init__.py +1 -1
  16. django_cfg/apps/accounts/managers/user_manager.py +6 -7
  17. django_cfg/apps/accounts/migrations/0001_initial.py +3 -2
  18. django_cfg/apps/accounts/models/__init__.py +15 -16
  19. django_cfg/apps/accounts/models/activity.py +5 -5
  20. django_cfg/apps/accounts/models/integrations.py +15 -15
  21. django_cfg/apps/accounts/models/registration.py +3 -2
  22. django_cfg/apps/accounts/models/user.py +3 -2
  23. django_cfg/apps/accounts/serializers/__init__.py +10 -3
  24. django_cfg/apps/accounts/serializers/otp.py +5 -4
  25. django_cfg/apps/accounts/serializers/profile.py +4 -5
  26. django_cfg/apps/accounts/serializers/webhook.py +13 -13
  27. django_cfg/apps/accounts/services/activity_service.py +13 -12
  28. django_cfg/apps/accounts/services/otp_service.py +16 -14
  29. django_cfg/apps/accounts/signals.py +18 -16
  30. django_cfg/apps/accounts/urls.py +10 -5
  31. django_cfg/apps/accounts/utils/notifications.py +22 -22
  32. django_cfg/apps/accounts/views/__init__.py +1 -1
  33. django_cfg/apps/accounts/views/otp.py +15 -14
  34. django_cfg/apps/accounts/views/profile.py +14 -10
  35. django_cfg/apps/accounts/views/webhook.py +46 -48
  36. django_cfg/apps/agents/__init__.py +3 -3
  37. django_cfg/apps/agents/admin/__init__.py +1 -1
  38. django_cfg/apps/agents/admin/execution_admin.py +68 -72
  39. django_cfg/apps/agents/admin/registry_admin.py +50 -54
  40. django_cfg/apps/agents/admin/toolsets_admin.py +63 -67
  41. django_cfg/apps/agents/apps.py +3 -3
  42. django_cfg/apps/agents/core/__init__.py +4 -4
  43. django_cfg/apps/agents/core/dependencies.py +24 -23
  44. django_cfg/apps/agents/core/django_agent.py +41 -39
  45. django_cfg/apps/agents/core/exceptions.py +12 -12
  46. django_cfg/apps/agents/core/models.py +16 -15
  47. django_cfg/apps/agents/core/orchestrator.py +58 -58
  48. django_cfg/apps/agents/examples/simple_example.py +24 -19
  49. django_cfg/apps/agents/integration/__init__.py +1 -1
  50. django_cfg/apps/agents/integration/middleware.py +12 -11
  51. django_cfg/apps/agents/integration/registry.py +52 -49
  52. django_cfg/apps/agents/integration/signals.py +5 -5
  53. django_cfg/apps/agents/management/commands/create_agent.py +39 -38
  54. django_cfg/apps/agents/management/commands/orchestrator_status.py +40 -39
  55. django_cfg/apps/agents/managers/__init__.py +8 -3
  56. django_cfg/apps/agents/managers/execution.py +42 -41
  57. django_cfg/apps/agents/managers/registry.py +40 -39
  58. django_cfg/apps/agents/managers/toolsets.py +87 -86
  59. django_cfg/apps/agents/migrations/0001_initial.py +2 -1
  60. django_cfg/apps/agents/models/__init__.py +2 -2
  61. django_cfg/apps/agents/models/execution.py +43 -42
  62. django_cfg/apps/agents/models/registry.py +46 -45
  63. django_cfg/apps/agents/models/toolsets.py +63 -62
  64. django_cfg/apps/agents/patterns/__init__.py +5 -5
  65. django_cfg/apps/agents/patterns/content_agents.py +17 -16
  66. django_cfg/apps/agents/toolsets/__init__.py +3 -3
  67. django_cfg/apps/agents/toolsets/cache_toolset.py +56 -55
  68. django_cfg/apps/agents/toolsets/django_toolset.py +43 -42
  69. django_cfg/apps/agents/toolsets/file_toolset.py +64 -63
  70. django_cfg/apps/agents/toolsets/orm_toolset.py +75 -74
  71. django_cfg/apps/agents/urls.py +3 -2
  72. django_cfg/apps/api/commands/urls.py +1 -0
  73. django_cfg/apps/api/commands/views.py +23 -26
  74. django_cfg/apps/api/endpoints/checker.py +5 -4
  75. django_cfg/apps/api/endpoints/drf_views.py +2 -2
  76. django_cfg/apps/api/endpoints/tests.py +6 -5
  77. django_cfg/apps/api/endpoints/urls.py +2 -1
  78. django_cfg/apps/api/endpoints/views.py +1 -0
  79. django_cfg/apps/api/health/drf_views.py +6 -6
  80. django_cfg/apps/api/health/urls.py +2 -1
  81. django_cfg/apps/api/health/views.py +41 -41
  82. django_cfg/{modules/django_ipc_client → apps/ipc}/__init__.py +6 -6
  83. django_cfg/apps/ipc/apps.py +28 -0
  84. django_cfg/apps/ipc/serializers/__init__.py +19 -0
  85. django_cfg/apps/ipc/serializers/serializers.py +229 -0
  86. django_cfg/apps/ipc/services/__init__.py +7 -0
  87. django_cfg/apps/ipc/services/client/__init__.py +23 -0
  88. django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/client.py +7 -6
  89. django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/exceptions.py +1 -1
  90. django_cfg/{modules/django_ipc_client/dashboard → apps/ipc/services}/monitor.py +36 -7
  91. 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
  92. django_cfg/{modules/django_ipc_client/dashboard/templates/django_ipc_dashboard → apps/ipc/templates/django_cfg_ipc}/base.html +5 -10
  93. django_cfg/apps/ipc/templates/django_cfg_ipc/dashboard.html +202 -0
  94. django_cfg/apps/ipc/urls.py +21 -0
  95. django_cfg/apps/ipc/urls_admin.py +20 -0
  96. django_cfg/apps/ipc/views/__init__.py +8 -0
  97. django_cfg/apps/ipc/views/dashboard.py +15 -0
  98. django_cfg/apps/ipc/views/viewsets.py +245 -0
  99. django_cfg/apps/knowbase/admin/__init__.py +2 -2
  100. django_cfg/apps/knowbase/admin/actions/__init__.py +1 -1
  101. django_cfg/apps/knowbase/admin/actions/visibility_actions.py +2 -1
  102. django_cfg/apps/knowbase/admin/archive_admin.py +81 -84
  103. django_cfg/apps/knowbase/admin/chat_admin.py +70 -72
  104. django_cfg/apps/knowbase/admin/document_admin.py +10 -11
  105. django_cfg/apps/knowbase/admin/external_data_admin.py +69 -71
  106. django_cfg/apps/knowbase/admin/helpers/__init__.py +1 -1
  107. django_cfg/apps/knowbase/admin/helpers/configs.py +2 -2
  108. django_cfg/apps/knowbase/admin/helpers/statistics.py +1 -1
  109. django_cfg/apps/knowbase/apps.py +13 -13
  110. django_cfg/apps/knowbase/config/__init__.py +7 -6
  111. django_cfg/apps/knowbase/config/constance_fields.py +14 -12
  112. django_cfg/apps/knowbase/config/constance_settings.py +32 -31
  113. django_cfg/apps/knowbase/config/settings.py +28 -28
  114. django_cfg/apps/knowbase/examples/external_data_usage.py +35 -32
  115. django_cfg/apps/knowbase/management/commands/knowbase_stats.py +33 -32
  116. django_cfg/apps/knowbase/management/commands/setup_knowbase.py +11 -13
  117. django_cfg/apps/knowbase/managers/__init__.py +2 -2
  118. django_cfg/apps/knowbase/managers/archive.py +86 -85
  119. django_cfg/apps/knowbase/managers/base.py +5 -5
  120. django_cfg/apps/knowbase/managers/chat.py +29 -28
  121. django_cfg/apps/knowbase/managers/document.py +39 -39
  122. django_cfg/apps/knowbase/managers/external_data.py +74 -73
  123. django_cfg/apps/knowbase/migrations/0001_initial.py +2 -1
  124. django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +2 -1
  125. django_cfg/apps/knowbase/mixins/__init__.py +4 -4
  126. django_cfg/apps/knowbase/mixins/config/__init__.py +1 -1
  127. django_cfg/apps/knowbase/mixins/config/meta_config.py +1 -1
  128. django_cfg/apps/knowbase/mixins/config.py +19 -18
  129. django_cfg/apps/knowbase/mixins/creator.py +7 -7
  130. django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +29 -28
  131. django_cfg/apps/knowbase/mixins/external_data_mixin.py +6 -5
  132. django_cfg/apps/knowbase/mixins/generators/__init__.py +1 -1
  133. django_cfg/apps/knowbase/mixins/generators/content_generator.py +2 -2
  134. django_cfg/apps/knowbase/mixins/service.py +47 -45
  135. django_cfg/apps/knowbase/models/__init__.py +7 -7
  136. django_cfg/apps/knowbase/models/archive.py +72 -72
  137. django_cfg/apps/knowbase/models/base.py +12 -13
  138. django_cfg/apps/knowbase/models/chat.py +20 -19
  139. django_cfg/apps/knowbase/models/document.py +37 -35
  140. django_cfg/apps/knowbase/models/external_data.py +41 -42
  141. django_cfg/apps/knowbase/serializers/__init__.py +7 -7
  142. django_cfg/apps/knowbase/serializers/archive_serializers.py +50 -42
  143. django_cfg/apps/knowbase/serializers/chat_serializers.py +16 -15
  144. django_cfg/apps/knowbase/serializers/document_serializers.py +13 -12
  145. django_cfg/apps/knowbase/serializers/external_data_serializers.py +31 -31
  146. django_cfg/apps/knowbase/serializers/public_serializers.py +10 -9
  147. django_cfg/apps/knowbase/services/__init__.py +7 -7
  148. django_cfg/apps/knowbase/services/archive/__init__.py +7 -7
  149. django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +1 -1
  150. django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +1 -1
  151. django_cfg/apps/knowbase/services/archive/archive_service.py +109 -112
  152. django_cfg/apps/knowbase/services/archive/chunking/__init__.py +3 -3
  153. django_cfg/apps/knowbase/services/archive/chunking/base.py +1 -0
  154. django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +4 -3
  155. django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +5 -4
  156. django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +6 -5
  157. django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +4 -3
  158. django_cfg/apps/knowbase/services/archive/chunking_service.py +3 -7
  159. django_cfg/apps/knowbase/services/archive/context/__init__.py +1 -1
  160. django_cfg/apps/knowbase/services/archive/context/builders.py +2 -1
  161. django_cfg/apps/knowbase/services/archive/context/models.py +2 -1
  162. django_cfg/apps/knowbase/services/archive/exceptions.py +5 -5
  163. django_cfg/apps/knowbase/services/archive/extraction_service.py +111 -110
  164. django_cfg/apps/knowbase/services/archive/vectorization_service.py +80 -77
  165. django_cfg/apps/knowbase/services/base.py +11 -9
  166. django_cfg/apps/knowbase/services/chat_service.py +40 -39
  167. django_cfg/apps/knowbase/services/document_service.py +28 -27
  168. django_cfg/apps/knowbase/services/embedding/__init__.py +9 -9
  169. django_cfg/apps/knowbase/services/embedding/async_processor.py +38 -40
  170. django_cfg/apps/knowbase/services/embedding/batch_processor.py +45 -42
  171. django_cfg/apps/knowbase/services/embedding/batch_result.py +7 -6
  172. django_cfg/apps/knowbase/services/embedding/models.py +52 -51
  173. django_cfg/apps/knowbase/services/embedding/processors.py +24 -23
  174. django_cfg/apps/knowbase/services/embedding/utils.py +17 -17
  175. django_cfg/apps/knowbase/services/prompt_builder.py +24 -23
  176. django_cfg/apps/knowbase/services/search_service.py +52 -49
  177. django_cfg/apps/knowbase/signals/__init__.py +2 -5
  178. django_cfg/apps/knowbase/signals/archive_signals.py +35 -34
  179. django_cfg/apps/knowbase/signals/chat_signals.py +6 -5
  180. django_cfg/apps/knowbase/signals/document_signals.py +22 -22
  181. django_cfg/apps/knowbase/signals/external_data_signals.py +22 -22
  182. django_cfg/apps/knowbase/tasks/__init__.py +6 -7
  183. django_cfg/apps/knowbase/tasks/archive_tasks.py +41 -41
  184. django_cfg/apps/knowbase/tasks/document_processing.py +49 -44
  185. django_cfg/apps/knowbase/tasks/external_data_tasks.py +46 -44
  186. django_cfg/apps/knowbase/tasks/maintenance.py +26 -24
  187. django_cfg/apps/knowbase/urls.py +3 -2
  188. django_cfg/apps/knowbase/urls_admin.py +6 -3
  189. django_cfg/apps/knowbase/urls_system.py +4 -5
  190. django_cfg/apps/knowbase/utils/chunk_settings.py +22 -20
  191. django_cfg/apps/knowbase/utils/text_processing.py +76 -75
  192. django_cfg/apps/knowbase/utils/validation.py +9 -9
  193. django_cfg/apps/knowbase/views/__init__.py +5 -5
  194. django_cfg/apps/knowbase/views/archive_views.py +90 -87
  195. django_cfg/apps/knowbase/views/base.py +9 -12
  196. django_cfg/apps/knowbase/views/chat_views.py +32 -32
  197. django_cfg/apps/knowbase/views/document_views.py +27 -28
  198. django_cfg/apps/knowbase/views/public_views.py +19 -19
  199. django_cfg/apps/leads/admin/leads_admin.py +41 -45
  200. django_cfg/apps/leads/admin/resources.py +14 -14
  201. django_cfg/apps/leads/admin.py +7 -9
  202. django_cfg/apps/leads/apps.py +1 -1
  203. django_cfg/apps/leads/models.py +17 -17
  204. django_cfg/apps/leads/serializers.py +5 -4
  205. django_cfg/apps/leads/signals.py +7 -7
  206. django_cfg/apps/leads/tests.py +47 -47
  207. django_cfg/apps/leads/urls.py +2 -2
  208. django_cfg/apps/leads/views.py +11 -11
  209. django_cfg/apps/maintenance/__init__.py +3 -3
  210. django_cfg/apps/maintenance/admin/__init__.py +1 -1
  211. django_cfg/apps/maintenance/admin/api_key_admin.py +36 -36
  212. django_cfg/apps/maintenance/admin/log_admin.py +35 -37
  213. django_cfg/apps/maintenance/admin/scheduled_admin.py +47 -51
  214. django_cfg/apps/maintenance/admin/site_admin.py +49 -52
  215. django_cfg/apps/maintenance/apps.py +2 -2
  216. django_cfg/apps/maintenance/management/commands/maintenance.py +53 -52
  217. django_cfg/apps/maintenance/management/commands/process_scheduled_maintenance.py +44 -44
  218. django_cfg/apps/maintenance/management/commands/sync_cloudflare.py +32 -32
  219. django_cfg/apps/maintenance/managers/__init__.py +1 -1
  220. django_cfg/apps/maintenance/managers/cloudflare_site_manager.py +39 -38
  221. django_cfg/apps/maintenance/managers/maintenance_log_manager.py +32 -31
  222. django_cfg/apps/maintenance/migrations/0001_initial.py +1 -0
  223. django_cfg/apps/maintenance/models/__init__.py +2 -2
  224. django_cfg/apps/maintenance/models/cloudflare_api_key.py +15 -15
  225. django_cfg/apps/maintenance/models/cloudflare_site.py +24 -22
  226. django_cfg/apps/maintenance/models/maintenance_log.py +15 -14
  227. django_cfg/apps/maintenance/models/scheduled_maintenance.py +53 -52
  228. django_cfg/apps/maintenance/services/__init__.py +3 -3
  229. django_cfg/apps/maintenance/services/bulk_operations_service.py +68 -68
  230. django_cfg/apps/maintenance/services/maintenance_service.py +59 -58
  231. django_cfg/apps/maintenance/services/scheduled_maintenance_service.py +52 -52
  232. django_cfg/apps/maintenance/services/site_sync_service.py +64 -65
  233. django_cfg/apps/maintenance/utils/__init__.py +1 -1
  234. django_cfg/apps/maintenance/utils/retry_utils.py +17 -17
  235. django_cfg/apps/newsletter/admin/__init__.py +12 -16
  236. django_cfg/apps/newsletter/admin/newsletter_admin.py +90 -87
  237. django_cfg/apps/newsletter/admin/resources.py +29 -29
  238. django_cfg/apps/newsletter/admin.py +39 -32
  239. django_cfg/apps/newsletter/management/commands/test_newsletter.py +3 -3
  240. django_cfg/apps/newsletter/managers/__init__.py +1 -1
  241. django_cfg/apps/newsletter/migrations/0001_initial.py +2 -1
  242. django_cfg/apps/newsletter/models.py +34 -33
  243. django_cfg/apps/newsletter/serializers.py +13 -13
  244. django_cfg/apps/newsletter/services/email_service.py +42 -40
  245. django_cfg/apps/newsletter/signals.py +4 -3
  246. django_cfg/apps/newsletter/urls.py +7 -7
  247. django_cfg/apps/newsletter/views/__init__.py +14 -19
  248. django_cfg/apps/newsletter/views/campaigns.py +19 -19
  249. django_cfg/apps/newsletter/views/emails.py +20 -20
  250. django_cfg/apps/newsletter/views/newsletters.py +5 -5
  251. django_cfg/apps/newsletter/views/subscriptions.py +24 -24
  252. django_cfg/apps/newsletter/views/tracking.py +6 -5
  253. django_cfg/apps/payments/admin/__init__.py +6 -5
  254. django_cfg/apps/payments/admin/api_keys_admin.py +43 -45
  255. django_cfg/apps/payments/admin/balance_admin.py +41 -47
  256. django_cfg/apps/payments/admin/currencies_admin.py +60 -62
  257. django_cfg/apps/payments/admin/endpoint_groups_admin.py +14 -28
  258. django_cfg/apps/payments/admin/filters.py +59 -59
  259. django_cfg/apps/payments/admin/networks_admin.py +36 -50
  260. django_cfg/apps/payments/admin/payments_admin.py +47 -49
  261. django_cfg/apps/payments/admin/subscriptions_admin.py +30 -32
  262. django_cfg/apps/payments/admin/tariffs_admin.py +37 -42
  263. django_cfg/apps/payments/admin_interface/serializers/__init__.py +12 -13
  264. django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +28 -27
  265. django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +4 -5
  266. django_cfg/apps/payments/admin_interface/templates/payments/base.html +407 -3
  267. django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +13 -13
  268. django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +5 -1
  269. django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +105 -49
  270. django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +4 -1
  271. django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +16 -8
  272. django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +16 -8
  273. django_cfg/apps/payments/admin_interface/views/__init__.py +8 -9
  274. django_cfg/apps/payments/admin_interface/views/api/__init__.py +3 -3
  275. django_cfg/apps/payments/admin_interface/views/api/payments.py +52 -54
  276. django_cfg/apps/payments/admin_interface/views/api/stats.py +33 -30
  277. django_cfg/apps/payments/admin_interface/views/api/users.py +10 -11
  278. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +46 -51
  279. django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +9 -9
  280. django_cfg/apps/payments/admin_interface/views/base.py +17 -19
  281. django_cfg/apps/payments/admin_interface/views/dashboard.py +10 -10
  282. django_cfg/apps/payments/admin_interface/views/forms.py +21 -20
  283. django_cfg/apps/payments/apps.py +7 -6
  284. django_cfg/apps/payments/config/__init__.py +4 -4
  285. django_cfg/apps/payments/config/django_cfg_integration.py +22 -21
  286. django_cfg/apps/payments/config/helpers.py +14 -12
  287. django_cfg/apps/payments/management/commands/cleanup_expired_data.py +85 -86
  288. django_cfg/apps/payments/management/commands/currency_stats.py +84 -87
  289. django_cfg/apps/payments/management/commands/manage_currencies.py +59 -58
  290. django_cfg/apps/payments/management/commands/manage_providers.py +103 -105
  291. django_cfg/apps/payments/management/commands/process_pending_payments.py +67 -70
  292. django_cfg/apps/payments/management/commands/test_providers.py +83 -84
  293. django_cfg/apps/payments/middleware/__init__.py +1 -1
  294. django_cfg/apps/payments/middleware/api_access.py +77 -78
  295. django_cfg/apps/payments/middleware/rate_limiting.py +72 -72
  296. django_cfg/apps/payments/middleware/usage_tracking.py +66 -64
  297. django_cfg/apps/payments/migrations/0001_initial.py +2 -1
  298. django_cfg/apps/payments/models/__init__.py +11 -12
  299. django_cfg/apps/payments/models/api_keys.py +29 -27
  300. django_cfg/apps/payments/models/balance.py +38 -38
  301. django_cfg/apps/payments/models/base.py +12 -11
  302. django_cfg/apps/payments/models/currencies.py +53 -52
  303. django_cfg/apps/payments/models/managers/__init__.py +13 -14
  304. django_cfg/apps/payments/models/managers/api_key_managers.py +55 -53
  305. django_cfg/apps/payments/models/managers/balance_managers.py +98 -97
  306. django_cfg/apps/payments/models/managers/currency_managers.py +70 -69
  307. django_cfg/apps/payments/models/managers/payment_managers.py +113 -111
  308. django_cfg/apps/payments/models/managers/subscription_managers.py +99 -97
  309. django_cfg/apps/payments/models/payments.py +167 -73
  310. django_cfg/apps/payments/models/subscriptions.py +56 -54
  311. django_cfg/apps/payments/models/tariffs.py +35 -34
  312. django_cfg/apps/payments/services/__init__.py +33 -36
  313. django_cfg/apps/payments/services/cache/__init__.py +7 -1
  314. django_cfg/apps/payments/services/cache_service/__init__.py +22 -20
  315. django_cfg/apps/payments/services/cache_service/api_key_cache.py +6 -5
  316. django_cfg/apps/payments/services/cache_service/interfaces.py +5 -5
  317. django_cfg/apps/payments/services/cache_service/keys.py +8 -8
  318. django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +8 -7
  319. django_cfg/apps/payments/services/cache_service/simple_cache.py +17 -14
  320. django_cfg/apps/payments/services/core/__init__.py +3 -3
  321. django_cfg/apps/payments/services/core/balance_service.py +69 -65
  322. django_cfg/apps/payments/services/core/base.py +25 -22
  323. django_cfg/apps/payments/services/core/currency/__init__.py +1 -1
  324. django_cfg/apps/payments/services/core/currency/currency_converter.py +2 -0
  325. django_cfg/apps/payments/services/core/currency_service.py +68 -66
  326. django_cfg/apps/payments/services/core/operations/__init__.py +1 -1
  327. django_cfg/apps/payments/services/core/operations/payment_canceller.py +2 -1
  328. django_cfg/apps/payments/services/core/operations/payment_creator.py +2 -1
  329. django_cfg/apps/payments/services/core/operations/status_checker.py +2 -1
  330. django_cfg/apps/payments/services/core/payment_service.py +10 -7
  331. django_cfg/apps/payments/services/core/providers/provider_client.py +2 -2
  332. django_cfg/apps/payments/services/core/subscription_service.py +77 -74
  333. django_cfg/apps/payments/services/core/utils/data_converter.py +1 -0
  334. django_cfg/apps/payments/services/core/utils/statistics_calculator.py +1 -0
  335. django_cfg/apps/payments/services/core/webhook_service.py +67 -63
  336. django_cfg/apps/payments/services/integrations/__init__.py +3 -3
  337. django_cfg/apps/payments/services/integrations/ngrok_service.py +1 -0
  338. django_cfg/apps/payments/services/integrations/providers_config.py +3 -2
  339. django_cfg/apps/payments/services/providers/base.py +59 -57
  340. django_cfg/apps/payments/services/providers/models/__init__.py +7 -14
  341. django_cfg/apps/payments/services/providers/models/base.py +15 -15
  342. django_cfg/apps/payments/services/providers/models/providers.py +13 -12
  343. django_cfg/apps/payments/services/providers/models/universal.py +6 -5
  344. django_cfg/apps/payments/services/providers/nowpayments/__init__.py +4 -4
  345. django_cfg/apps/payments/services/providers/nowpayments/config.py +9 -8
  346. django_cfg/apps/payments/services/providers/nowpayments/models.py +15 -15
  347. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +2 -2
  348. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +26 -26
  349. django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +3 -2
  350. django_cfg/apps/payments/services/providers/nowpayments/provider.py +95 -99
  351. django_cfg/apps/payments/services/providers/nowpayments/sync.py +41 -40
  352. django_cfg/apps/payments/services/providers/registry.py +65 -63
  353. django_cfg/apps/payments/services/providers/sync_service.py +50 -50
  354. django_cfg/apps/payments/services/types/__init__.py +21 -22
  355. django_cfg/apps/payments/services/types/data.py +14 -13
  356. django_cfg/apps/payments/services/types/requests.py +21 -22
  357. django_cfg/apps/payments/services/types/responses.py +16 -15
  358. django_cfg/apps/payments/services/types/webhooks.py +30 -30
  359. django_cfg/apps/payments/signals/__init__.py +4 -6
  360. django_cfg/apps/payments/signals/api_key_signals.py +33 -32
  361. django_cfg/apps/payments/signals/balance_signals.py +28 -26
  362. django_cfg/apps/payments/signals/payment_signals.py +29 -28
  363. django_cfg/apps/payments/signals/subscription_signals.py +39 -38
  364. django_cfg/apps/payments/static/payments/js/ngrok-status.js +12 -8
  365. django_cfg/apps/payments/static/payments/js/payment-detail.js +1 -1
  366. django_cfg/apps/payments/static/payments/js/payment-form.js +3 -3
  367. django_cfg/apps/payments/static/payments/js/payment-list.js +13 -6
  368. django_cfg/apps/payments/static/payments/js/webhook-dashboard-mjs.js +241 -0
  369. django_cfg/apps/payments/tasks/__init__.py +11 -12
  370. django_cfg/apps/payments/tasks/types.py +10 -9
  371. django_cfg/apps/payments/tasks/usage_tracking.py +44 -46
  372. django_cfg/apps/payments/templatetags/payment_tags.py +27 -27
  373. django_cfg/apps/payments/urls.py +31 -14
  374. django_cfg/apps/payments/urls_admin.py +10 -10
  375. django_cfg/apps/payments/views/api/__init__.py +32 -33
  376. django_cfg/apps/payments/views/api/api_keys.py +62 -62
  377. django_cfg/apps/payments/views/api/balances.py +63 -64
  378. django_cfg/apps/payments/views/api/base.py +52 -52
  379. django_cfg/apps/payments/views/api/currencies.py +75 -63
  380. django_cfg/apps/payments/views/api/payments.py +73 -74
  381. django_cfg/apps/payments/views/api/subscriptions.py +71 -72
  382. django_cfg/apps/payments/views/api/webhooks.py +85 -84
  383. django_cfg/apps/payments/views/overview/__init__.py +7 -7
  384. django_cfg/apps/payments/views/overview/serializers.py +13 -14
  385. django_cfg/apps/payments/views/overview/services.py +66 -67
  386. django_cfg/apps/payments/views/overview/urls.py +2 -1
  387. django_cfg/apps/payments/views/overview/views.py +31 -31
  388. django_cfg/apps/payments/views/serializers/__init__.py +35 -36
  389. django_cfg/apps/payments/views/serializers/api_keys.py +59 -57
  390. django_cfg/apps/payments/views/serializers/balances.py +34 -33
  391. django_cfg/apps/payments/views/serializers/currencies.py +36 -34
  392. django_cfg/apps/payments/views/serializers/payments.py +48 -47
  393. django_cfg/apps/payments/views/serializers/subscriptions.py +50 -45
  394. django_cfg/apps/payments/views/serializers/webhooks.py +17 -16
  395. django_cfg/apps/support/admin/__init__.py +3 -3
  396. django_cfg/apps/support/admin/resources.py +26 -26
  397. django_cfg/apps/support/admin/support_admin.py +44 -48
  398. django_cfg/apps/support/admin.py +16 -15
  399. django_cfg/apps/support/apps.py +1 -1
  400. django_cfg/apps/support/managers/message_manager.py +4 -4
  401. django_cfg/apps/support/managers/ticket_manager.py +13 -12
  402. django_cfg/apps/support/migrations/0001_initial.py +2 -1
  403. django_cfg/apps/support/models.py +3 -1
  404. django_cfg/apps/support/serializers.py +4 -2
  405. django_cfg/apps/support/signals.py +12 -10
  406. django_cfg/apps/support/urls.py +4 -3
  407. django_cfg/apps/support/utils/support_email_service.py +11 -9
  408. django_cfg/apps/support/views/__init__.py +3 -3
  409. django_cfg/apps/support/views/admin.py +9 -9
  410. django_cfg/apps/support/views/api.py +10 -9
  411. django_cfg/apps/support/views/chat.py +14 -14
  412. django_cfg/apps/tasks/admin/tasks_admin.py +65 -74
  413. django_cfg/apps/tasks/apps.py +2 -2
  414. django_cfg/apps/tasks/serializers.py +6 -6
  415. django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +44 -20
  416. django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +7 -5
  417. django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +5 -3
  418. django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +5 -3
  419. django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +5 -3
  420. django_cfg/apps/tasks/tasks/demo_tasks.py +12 -11
  421. django_cfg/apps/tasks/templates/tasks/components/tasks_mjs_integration.html +269 -0
  422. django_cfg/apps/tasks/templates/tasks/pages/dashboard-improved.html +168 -0
  423. django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +21 -2
  424. django_cfg/apps/tasks/urls.py +3 -2
  425. django_cfg/apps/tasks/urls_admin.py +1 -0
  426. django_cfg/apps/tasks/utils/simulator.py +49 -52
  427. django_cfg/apps/tasks/views/api.py +75 -73
  428. django_cfg/apps/tasks/views/dashboard.py +5 -4
  429. django_cfg/apps/urls.py +20 -11
  430. django_cfg/apps.py +6 -5
  431. django_cfg/cli/commands/create_project.py +7 -6
  432. django_cfg/cli/commands/info.py +25 -25
  433. django_cfg/cli/utils.py +27 -27
  434. django_cfg/config.py +1 -1
  435. django_cfg/core/__init__.py +8 -8
  436. django_cfg/core/base/config_model.py +13 -12
  437. django_cfg/core/builders/apps_builder.py +2 -2
  438. django_cfg/core/builders/middleware_builder.py +1 -1
  439. django_cfg/core/builders/security_builder.py +1 -1
  440. django_cfg/core/config.py +2 -2
  441. django_cfg/core/environment/detector.py +27 -28
  442. django_cfg/core/exceptions.py +1 -1
  443. django_cfg/core/generation/core_generators/settings.py +1 -1
  444. django_cfg/core/generation/core_generators/static.py +11 -5
  445. django_cfg/core/generation/core_generators/templates.py +1 -1
  446. django_cfg/core/generation/data_generators/__init__.py +1 -1
  447. django_cfg/core/generation/data_generators/cache.py +1 -1
  448. django_cfg/core/generation/data_generators/database.py +1 -1
  449. django_cfg/core/generation/generation.py +1 -3
  450. django_cfg/core/generation/integration_generators/__init__.py +2 -2
  451. django_cfg/core/generation/integration_generators/api.py +12 -2
  452. django_cfg/core/generation/integration_generators/sessions.py +1 -1
  453. django_cfg/core/generation/integration_generators/tailwind.py +1 -1
  454. django_cfg/core/generation/integration_generators/tasks.py +1 -1
  455. django_cfg/core/generation/integration_generators/third_party.py +1 -1
  456. django_cfg/core/generation/orchestrator.py +1 -1
  457. django_cfg/core/generation/protocols.py +1 -1
  458. django_cfg/core/generation/utility_generators/__init__.py +1 -1
  459. django_cfg/core/generation/utility_generators/email.py +1 -1
  460. django_cfg/core/generation/utility_generators/i18n.py +1 -1
  461. django_cfg/core/generation/utility_generators/limits.py +1 -1
  462. django_cfg/core/generation/utility_generators/logging.py +1 -1
  463. django_cfg/core/generation/utility_generators/security.py +1 -1
  464. django_cfg/core/generation/utils/helpers.py +1 -1
  465. django_cfg/core/integration/__init__.py +5 -5
  466. django_cfg/core/integration/commands_collector.py +38 -39
  467. django_cfg/core/integration/display/__init__.py +2 -2
  468. django_cfg/core/integration/display/base.py +30 -30
  469. django_cfg/core/integration/display/ngrok.py +35 -36
  470. django_cfg/core/integration/display/startup.py +149 -139
  471. django_cfg/core/integration/url_integration.py +10 -10
  472. django_cfg/core/integration/version_checker.py +20 -19
  473. django_cfg/core/services/config_service.py +4 -4
  474. django_cfg/core/state/__init__.py +1 -1
  475. django_cfg/core/state/registry.py +1 -1
  476. django_cfg/core/types/__init__.py +8 -1
  477. django_cfg/core/validation.py +36 -39
  478. django_cfg/management/commands/check_endpoints.py +3 -1
  479. django_cfg/management/commands/check_settings.py +3 -1
  480. django_cfg/management/commands/clear_constance.py +3 -1
  481. django_cfg/management/commands/create_token.py +3 -1
  482. django_cfg/management/commands/generate_clients.py +3 -1
  483. django_cfg/management/commands/migrate_all.py +3 -1
  484. django_cfg/management/commands/rundramatiq.py +3 -1
  485. django_cfg/management/commands/rundramatiq_simulator.py +3 -1
  486. django_cfg/management/commands/runserver_ngrok.py +3 -1
  487. django_cfg/management/commands/show_config.py +3 -1
  488. django_cfg/management/commands/superuser.py +3 -1
  489. django_cfg/management/commands/task_clear.py +3 -1
  490. django_cfg/management/commands/task_status.py +3 -1
  491. django_cfg/management/commands/test_email.py +3 -1
  492. django_cfg/management/commands/test_telegram.py +3 -1
  493. django_cfg/management/commands/test_twilio.py +3 -1
  494. django_cfg/management/commands/validate_openapi.py +3 -1
  495. django_cfg/middleware/pagination.py +8 -8
  496. django_cfg/middleware/public_endpoints.py +24 -23
  497. django_cfg/middleware/user_activity.py +27 -25
  498. django_cfg/models/__init__.py +19 -20
  499. django_cfg/models/api/__init__.py +4 -4
  500. django_cfg/models/api/config.py +23 -21
  501. django_cfg/models/api/cors.py +17 -16
  502. django_cfg/models/api/drf/__init__.py +1 -1
  503. django_cfg/models/api/drf/config.py +2 -1
  504. django_cfg/models/api/drf/redoc.py +2 -1
  505. django_cfg/models/api/drf/spectacular.py +4 -2
  506. django_cfg/models/api/drf/swagger.py +2 -1
  507. django_cfg/models/api/jwt.py +37 -36
  508. django_cfg/models/api/keys.py +13 -12
  509. django_cfg/models/api/limits.py +31 -30
  510. django_cfg/models/base/config.py +40 -41
  511. django_cfg/models/base/module.py +8 -8
  512. django_cfg/models/django/__init__.py +1 -1
  513. django_cfg/models/django/constance.py +8 -7
  514. django_cfg/models/django/environment.py +5 -3
  515. django_cfg/models/django/openapi.py +6 -16
  516. django_cfg/models/django/revolution_legacy.py +17 -16
  517. django_cfg/models/infrastructure/__init__.py +1 -1
  518. django_cfg/models/infrastructure/cache.py +46 -45
  519. django_cfg/models/infrastructure/database/config.py +4 -6
  520. django_cfg/models/infrastructure/database/converters.py +1 -1
  521. django_cfg/models/infrastructure/database/parsers.py +1 -1
  522. django_cfg/models/infrastructure/database/validators.py +1 -1
  523. django_cfg/models/infrastructure/logging.py +59 -57
  524. django_cfg/models/infrastructure/security.py +26 -24
  525. django_cfg/models/ngrok/auth.py +2 -1
  526. django_cfg/models/ngrok/config.py +3 -2
  527. django_cfg/models/ngrok/tunnel.py +2 -1
  528. django_cfg/models/payments/__init__.py +1 -1
  529. django_cfg/models/payments/api_keys.py +3 -1
  530. django_cfg/models/payments/config.py +4 -1
  531. django_cfg/models/payments/providers/base.py +2 -1
  532. django_cfg/models/payments/providers/nowpayments.py +3 -1
  533. django_cfg/models/services/__init__.py +1 -1
  534. django_cfg/models/services/base.py +2 -1
  535. django_cfg/models/services/email.py +28 -26
  536. django_cfg/models/services/telegram.py +2 -1
  537. django_cfg/models/tasks/__init__.py +2 -2
  538. django_cfg/models/tasks/backends.py +4 -3
  539. django_cfg/models/tasks/config.py +6 -4
  540. django_cfg/models/tasks/utils.py +3 -3
  541. django_cfg/modules/base.py +18 -17
  542. django_cfg/modules/django_admin/__init__.py +14 -15
  543. django_cfg/modules/django_admin/decorators/__init__.py +1 -1
  544. django_cfg/modules/django_admin/decorators/actions.py +8 -7
  545. django_cfg/modules/django_admin/decorators/display.py +9 -7
  546. django_cfg/modules/django_admin/icons/__init__.py +1 -1
  547. django_cfg/modules/django_admin/icons/constants.py +27 -27
  548. django_cfg/modules/django_admin/icons/generate_icons.py +54 -54
  549. django_cfg/modules/django_admin/management/commands/check_endpoints.py +5 -3
  550. django_cfg/modules/django_admin/management/commands/check_settings.py +40 -44
  551. django_cfg/modules/django_admin/management/commands/clear_constance.py +29 -30
  552. django_cfg/modules/django_admin/management/commands/create_token.py +42 -42
  553. django_cfg/modules/django_admin/management/commands/list_urls.py +37 -38
  554. django_cfg/modules/django_admin/management/commands/migrate_all.py +13 -15
  555. django_cfg/modules/django_admin/management/commands/migrator.py +17 -17
  556. django_cfg/modules/django_admin/management/commands/script.py +58 -60
  557. django_cfg/modules/django_admin/management/commands/show_config.py +32 -30
  558. django_cfg/modules/django_admin/management/commands/show_urls.py +46 -44
  559. django_cfg/modules/django_admin/management/commands/superuser.py +47 -48
  560. django_cfg/modules/django_admin/management/commands/tree.py +50 -54
  561. django_cfg/modules/django_admin/mixins/display_mixin.py +16 -15
  562. django_cfg/modules/django_admin/mixins/optimization_mixin.py +9 -8
  563. django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +25 -24
  564. django_cfg/modules/django_admin/models/__init__.py +4 -4
  565. django_cfg/modules/django_admin/models/action_models.py +3 -1
  566. django_cfg/modules/django_admin/models/badge_models.py +4 -2
  567. django_cfg/modules/django_admin/models/base.py +3 -3
  568. django_cfg/modules/django_admin/models/display_models.py +1 -0
  569. django_cfg/modules/django_admin/utils/badges.py +27 -26
  570. django_cfg/modules/django_admin/utils/displays.py +49 -49
  571. django_cfg/modules/django_client/apps.py +21 -3
  572. django_cfg/modules/django_client/core/__init__.py +9 -10
  573. django_cfg/modules/django_client/core/archive/manager.py +2 -2
  574. django_cfg/modules/django_client/core/cli/main.py +1 -3
  575. django_cfg/modules/django_client/core/config/config.py +3 -1
  576. django_cfg/modules/django_client/core/config/group.py +1 -0
  577. django_cfg/modules/django_client/core/config/service.py +2 -1
  578. django_cfg/modules/django_client/core/generator/__init__.py +1 -1
  579. django_cfg/modules/django_client/core/generator/base.py +2 -2
  580. django_cfg/modules/django_client/core/generator/python/async_client_gen.py +1 -1
  581. django_cfg/modules/django_client/core/generator/python/files_generator.py +1 -1
  582. django_cfg/modules/django_client/core/generator/python/generator.py +4 -4
  583. django_cfg/modules/django_client/core/generator/python/models_generator.py +1 -1
  584. django_cfg/modules/django_client/core/generator/python/operations_generator.py +2 -2
  585. django_cfg/modules/django_client/core/generator/python/sync_client_gen.py +1 -1
  586. django_cfg/modules/django_client/core/generator/typescript/client_generator.py +3 -1
  587. django_cfg/modules/django_client/core/generator/typescript/fetchers_generator.py +14 -13
  588. django_cfg/modules/django_client/core/generator/typescript/files_generator.py +1 -0
  589. django_cfg/modules/django_client/core/generator/typescript/generator.py +6 -6
  590. django_cfg/modules/django_client/core/generator/typescript/hooks_generator.py +12 -10
  591. django_cfg/modules/django_client/core/generator/typescript/models_generator.py +2 -1
  592. django_cfg/modules/django_client/core/generator/typescript/naming.py +2 -3
  593. django_cfg/modules/django_client/core/generator/typescript/operations_generator.py +12 -10
  594. django_cfg/modules/django_client/core/generator/typescript/schemas_generator.py +3 -2
  595. django_cfg/modules/django_client/core/generator/typescript/templates/client/client.ts.jinja +14 -6
  596. django_cfg/modules/django_client/core/generator/typescript/templates/main_index.ts.jinja +4 -10
  597. django_cfg/modules/django_client/core/groups/__init__.py +1 -1
  598. django_cfg/modules/django_client/core/groups/detector.py +2 -1
  599. django_cfg/modules/django_client/core/groups/manager.py +2 -1
  600. django_cfg/modules/django_client/core/ir/schema.py +1 -1
  601. django_cfg/modules/django_client/core/parser/base.py +0 -2
  602. django_cfg/modules/django_client/core/parser/models/schema.py +1 -1
  603. django_cfg/modules/django_client/core/validation/__init__.py +1 -1
  604. django_cfg/modules/django_client/core/validation/fixer.py +1 -2
  605. django_cfg/modules/django_client/core/validation/reporter.py +2 -2
  606. django_cfg/modules/django_client/core/validation/safety.py +1 -1
  607. django_cfg/modules/django_client/management/commands/generate_client.py +14 -11
  608. django_cfg/modules/django_client/management/commands/validate_openapi.py +4 -6
  609. django_cfg/modules/django_client/spectacular/__init__.py +1 -1
  610. django_cfg/modules/django_client/spectacular/async_detection.py +3 -2
  611. django_cfg/modules/django_client/spectacular/enum_naming.py +1 -1
  612. django_cfg/modules/django_client/spectacular/schema.py +5 -5
  613. django_cfg/modules/django_client/system/__init__.py +24 -0
  614. django_cfg/modules/django_client/system/base_generator.py +123 -0
  615. django_cfg/modules/django_client/system/generate_mjs_clients.py +174 -0
  616. django_cfg/modules/django_client/system/mjs_generator.py +219 -0
  617. django_cfg/modules/django_client/system/schema_parser.py +195 -0
  618. django_cfg/modules/django_client/system/templates/api_client.js.j2 +87 -0
  619. django_cfg/modules/django_client/system/templates/app_index.js.j2 +13 -0
  620. django_cfg/modules/django_client/system/templates/base_client.js.j2 +166 -0
  621. django_cfg/modules/django_client/system/templates/main_index.js.j2 +80 -0
  622. django_cfg/modules/django_client/system/templates/types.js.j2 +24 -0
  623. django_cfg/modules/django_client/urls.py +3 -2
  624. django_cfg/modules/django_currency/__init__.py +17 -18
  625. django_cfg/modules/django_currency/clients/__init__.py +2 -2
  626. django_cfg/modules/django_currency/clients/coinpaprika_client.py +48 -48
  627. django_cfg/modules/django_currency/clients/hybrid_client.py +76 -75
  628. django_cfg/modules/django_currency/core/__init__.py +7 -13
  629. django_cfg/modules/django_currency/core/converter.py +25 -24
  630. django_cfg/modules/django_currency/core/models.py +9 -8
  631. django_cfg/modules/django_currency/database/__init__.py +4 -4
  632. django_cfg/modules/django_currency/database/database_loader.py +65 -66
  633. django_cfg/modules/django_currency/examples/example_database_usage.py +29 -28
  634. django_cfg/modules/django_currency/utils/cache.py +10 -11
  635. django_cfg/modules/django_dashboard/__init__.py +4 -5
  636. django_cfg/modules/django_dashboard/components.py +11 -7
  637. django_cfg/modules/django_dashboard/debug.py +1 -3
  638. django_cfg/modules/django_dashboard/management/commands/debug_dashboard.py +3 -3
  639. django_cfg/modules/django_dashboard/sections/base.py +2 -1
  640. django_cfg/modules/django_dashboard/sections/commands.py +3 -2
  641. django_cfg/modules/django_dashboard/sections/documentation.py +8 -6
  642. django_cfg/modules/django_dashboard/sections/overview.py +13 -9
  643. django_cfg/modules/django_dashboard/sections/stats.py +2 -2
  644. django_cfg/modules/django_dashboard/sections/system.py +2 -1
  645. django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +12 -4
  646. django_cfg/modules/django_email/management/commands/test_email.py +8 -7
  647. django_cfg/modules/django_email/service.py +5 -4
  648. django_cfg/modules/django_health/service.py +46 -44
  649. django_cfg/modules/django_import_export/__init__.py +7 -3
  650. django_cfg/modules/django_llm/__init__.py +3 -2
  651. django_cfg/modules/django_llm/example.py +58 -56
  652. django_cfg/modules/django_llm/llm/__init__.py +1 -1
  653. django_cfg/modules/django_llm/llm/cache.py +21 -20
  654. django_cfg/modules/django_llm/llm/client.py +9 -9
  655. django_cfg/modules/django_llm/llm/costs.py +14 -14
  656. django_cfg/modules/django_llm/llm/embeddings/__init__.py +1 -1
  657. django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +1 -2
  658. django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +1 -2
  659. django_cfg/modules/django_llm/llm/extractor.py +8 -8
  660. django_cfg/modules/django_llm/llm/models.py +5 -5
  661. django_cfg/modules/django_llm/llm/models_api/models_query.py +2 -2
  662. django_cfg/modules/django_llm/llm/models_cache.py +91 -92
  663. django_cfg/modules/django_llm/llm/providers/config_builder.py +1 -1
  664. django_cfg/modules/django_llm/llm/providers/provider_manager.py +2 -1
  665. django_cfg/modules/django_llm/llm/requests/cache_manager.py +1 -1
  666. django_cfg/modules/django_llm/llm/requests/chat_handler.py +2 -2
  667. django_cfg/modules/django_llm/llm/requests/embedding_handler.py +1 -1
  668. django_cfg/modules/django_llm/llm/responses/response_builder.py +2 -2
  669. django_cfg/modules/django_llm/llm/stats/stats_manager.py +1 -1
  670. django_cfg/modules/django_llm/llm/tokenizer.py +10 -9
  671. django_cfg/modules/django_llm/translator/__init__.py +1 -1
  672. django_cfg/modules/django_llm/translator/cache.py +36 -35
  673. django_cfg/modules/django_llm/translator/detectors/__init__.py +1 -1
  674. django_cfg/modules/django_llm/translator/detectors/script_detector.py +0 -1
  675. django_cfg/modules/django_llm/translator/stats/stats_tracker.py +1 -1
  676. django_cfg/modules/django_llm/translator/translator.py +5 -4
  677. django_cfg/modules/django_llm/translator/translators/__init__.py +1 -1
  678. django_cfg/modules/django_llm/translator/translators/json_translator.py +1 -1
  679. django_cfg/modules/django_llm/translator/utils/__init__.py +1 -1
  680. django_cfg/modules/django_llm/translator/utils/prompt_builder.py +0 -1
  681. django_cfg/modules/django_logging/__init__.py +1 -1
  682. django_cfg/modules/django_logging/django_logger.py +33 -34
  683. django_cfg/modules/django_logging/logger.py +3 -7
  684. django_cfg/modules/django_ngrok/__init__.py +7 -7
  685. django_cfg/modules/django_ngrok/management/commands/runserver_ngrok.py +33 -30
  686. django_cfg/modules/django_ngrok/service.py +33 -32
  687. django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +4 -36
  688. django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +1 -1
  689. django_cfg/modules/django_tasks/__init__.py +5 -5
  690. django_cfg/modules/django_tasks/dramatiq_setup.py +1 -1
  691. django_cfg/modules/django_tasks/factory.py +1 -1
  692. django_cfg/modules/django_tasks/management/commands/rundramatiq.py +39 -40
  693. django_cfg/modules/django_tasks/management/commands/rundramatiq_simulator.py +79 -80
  694. django_cfg/modules/django_tasks/management/commands/task_clear.py +34 -34
  695. django_cfg/modules/django_tasks/management/commands/task_status.py +34 -34
  696. django_cfg/modules/django_tasks/service.py +4 -3
  697. django_cfg/modules/django_tasks/settings.py +1 -1
  698. django_cfg/modules/django_telegram/__init__.py +4 -4
  699. django_cfg/modules/django_telegram/management/commands/test_telegram.py +4 -5
  700. django_cfg/modules/django_telegram/service.py +4 -3
  701. django_cfg/modules/django_telegram/utils.py +1 -1
  702. django_cfg/modules/django_twilio/__init__.py +15 -16
  703. django_cfg/modules/django_twilio/_imports.py +1 -1
  704. django_cfg/modules/django_twilio/base.py +9 -5
  705. django_cfg/modules/django_twilio/email_otp.py +4 -3
  706. django_cfg/modules/django_twilio/exceptions.py +36 -36
  707. django_cfg/modules/django_twilio/management/commands/test_twilio.py +6 -7
  708. django_cfg/modules/django_twilio/models.py +54 -53
  709. django_cfg/modules/django_twilio/sendgrid_service.py +70 -72
  710. django_cfg/modules/django_twilio/simple_service.py +42 -41
  711. django_cfg/modules/django_twilio/sms.py +1 -0
  712. django_cfg/modules/django_twilio/twilio_service.py +79 -83
  713. django_cfg/modules/django_twilio/unified.py +6 -5
  714. django_cfg/modules/django_twilio/utils.py +2 -3
  715. django_cfg/modules/django_twilio/whatsapp.py +3 -2
  716. django_cfg/modules/django_unfold/__init__.py +7 -6
  717. django_cfg/modules/django_unfold/callbacks/actions.py +6 -5
  718. django_cfg/modules/django_unfold/callbacks/apizones.py +122 -0
  719. django_cfg/modules/django_unfold/callbacks/base.py +9 -8
  720. django_cfg/modules/django_unfold/callbacks/charts.py +36 -37
  721. django_cfg/modules/django_unfold/callbacks/commands.py +2 -2
  722. django_cfg/modules/django_unfold/callbacks/main.py +27 -27
  723. django_cfg/modules/django_unfold/callbacks/statistics.py +12 -12
  724. django_cfg/modules/django_unfold/callbacks/system.py +5 -5
  725. django_cfg/modules/django_unfold/callbacks/users.py +4 -4
  726. django_cfg/modules/django_unfold/dashboard.py +29 -29
  727. django_cfg/modules/django_unfold/models/__init__.py +23 -8
  728. django_cfg/modules/django_unfold/models/config.py +84 -81
  729. django_cfg/modules/django_unfold/models/dashboard.py +20 -19
  730. django_cfg/modules/django_unfold/models/dropdown.py +6 -4
  731. django_cfg/modules/django_unfold/models/navigation.py +6 -4
  732. django_cfg/modules/django_unfold/models/tabs.py +4 -3
  733. django_cfg/modules/django_unfold/models.py +2 -3
  734. django_cfg/modules/django_unfold/system_monitor.py +27 -25
  735. django_cfg/modules/django_unfold/tailwind.py +12 -14
  736. django_cfg/modules/django_unfold/utils.py +7 -6
  737. django_cfg/pyproject.toml +1 -1
  738. django_cfg/registry/__init__.py +3 -3
  739. django_cfg/registry/core.py +8 -8
  740. django_cfg/registry/modules.py +2 -2
  741. django_cfg/registry/services.py +2 -2
  742. django_cfg/registry/third_party.py +3 -3
  743. django_cfg/routing/__init__.py +3 -3
  744. django_cfg/routing/callbacks.py +27 -26
  745. django_cfg/routing/routers.py +2 -2
  746. django_cfg/static/js/api/accounts/client.mjs +69 -0
  747. django_cfg/static/js/api/accounts/index.mjs +13 -0
  748. django_cfg/static/js/api/base.mjs +166 -0
  749. django_cfg/static/js/api/index.mjs +100 -0
  750. django_cfg/static/js/api/ipc/client.mjs +74 -0
  751. django_cfg/static/js/api/ipc/index.mjs +13 -0
  752. django_cfg/static/js/api/leads/client.mjs +71 -0
  753. django_cfg/static/js/api/leads/index.mjs +13 -0
  754. django_cfg/static/js/api/newsletter/client.mjs +109 -0
  755. django_cfg/static/js/api/newsletter/index.mjs +13 -0
  756. django_cfg/static/js/api/payments/client.mjs +1264 -0
  757. django_cfg/static/js/api/payments/index.mjs +13 -0
  758. django_cfg/static/js/api/support/client.mjs +84 -0
  759. django_cfg/static/js/api/support/index.mjs +13 -0
  760. django_cfg/static/js/api/tasks/client.mjs +74 -0
  761. django_cfg/static/js/api/tasks/index.mjs +13 -0
  762. django_cfg/static/js/api/types.mjs +729 -0
  763. django_cfg/static/js/api-loader.mjs +169 -0
  764. django_cfg/templates/admin/snippets/zones/zones_table.html +4 -3
  765. django_cfg/templatetags/django_cfg.py +4 -4
  766. django_cfg/utils/path_resolution.py +49 -50
  767. django_cfg/utils/smart_defaults.py +27 -29
  768. django_cfg/utils/version_check.py +14 -14
  769. {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/METADATA +1 -1
  770. django_cfg-1.4.24.dist-info/RECORD +1137 -0
  771. django_cfg/apps/payments/static/payments/js/api-client.js +0 -408
  772. django_cfg/modules/django_ipc_client/dashboard/README.md +0 -517
  773. django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +0 -439
  774. django_cfg/modules/django_ipc_client/dashboard/__init__.py +0 -11
  775. django_cfg/modules/django_ipc_client/dashboard/apps.py +0 -22
  776. django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +0 -200
  777. django_cfg/modules/django_ipc_client/dashboard/urls.py +0 -22
  778. django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +0 -9
  779. django_cfg/modules/django_ipc_client/dashboard/views.py +0 -251
  780. django_cfg/modules/django_rpc_old/POETRY.md +0 -344
  781. django_cfg/modules/django_rpc_old/README.md +0 -397
  782. django_cfg/modules/django_rpc_old/TESTING.md +0 -358
  783. django_cfg/modules/django_rpc_old/__init__.py +0 -39
  784. django_cfg/modules/django_rpc_old/client.py +0 -531
  785. django_cfg/modules/django_rpc_old/config.py +0 -279
  786. django_cfg/modules/django_rpc_old/exceptions.py +0 -172
  787. django_cfg/modules/django_unfold/callbacks/revolution.py +0 -81
  788. django_cfg-1.4.21.dist-info/RECORD +0 -1111
  789. /django_cfg/{modules/django_ipc_client → apps/ipc}/README.md +0 -0
  790. /django_cfg/{modules/django_ipc_client → apps/ipc/services/client}/config.py +0 -0
  791. {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/WHEEL +0 -0
  792. {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/entry_points.txt +0 -0
  793. {django_cfg-1.4.21.dist-info → django_cfg-1.4.24.dist-info}/licenses/LICENSE +0 -0
@@ -5,8 +5,9 @@ Auto-configuring LLM and translation service that integrates with DjangoConfig.
5
5
  """
6
6
 
7
7
  # from .service import DjangoLLM, LLMError, LLMConfigError # Removed - using LLMClient directly
8
+ from .llm import LLMCache, LLMClient
8
9
  from .translator import DjangoTranslator, TranslationError
9
- from .llm import LLMClient, LLMCache
10
+
10
11
 
11
12
  # Convenience functions
12
13
  def chat_completion(
@@ -62,7 +63,7 @@ def get_available_models() -> list:
62
63
 
63
64
  # Export public API
64
65
  __all__ = [
65
- 'DjangoTranslator',
66
+ 'DjangoTranslator',
66
67
  'LLMClient',
67
68
  'LLMCache',
68
69
  'TranslationError',
@@ -7,13 +7,15 @@ Demonstrates LLM and translation functionality with django-cfg integration.
7
7
  import asyncio
8
8
  import json
9
9
  from pathlib import Path
10
- from django_cfg import DjangoConfig, LLMConfig, TelegramConfig, DjangoLLM, DjangoTranslator
10
+
11
+ from django_cfg import DjangoConfig, DjangoLLM, DjangoTranslator, LLMConfig, TelegramConfig
12
+
11
13
 
12
14
  class ExampleConfig(DjangoConfig):
13
15
  """Example configuration with LLM support."""
14
-
16
+
15
17
  project_name: str = "LLM Example Project"
16
-
18
+
17
19
  # LLM configuration
18
20
  llm: LLMConfig = LLMConfig(
19
21
  provider="openrouter",
@@ -24,7 +26,7 @@ class ExampleConfig(DjangoConfig):
24
26
  cost_tracking=True,
25
27
  usage_alerts=True
26
28
  )
27
-
29
+
28
30
  # Optional: Telegram for alerts
29
31
  telegram: TelegramConfig = TelegramConfig(
30
32
  bot_token="${TELEGRAM_BOT_TOKEN}",
@@ -36,25 +38,25 @@ async def example_llm_usage():
36
38
  """Example LLM usage."""
37
39
  print("🤖 Testing Django LLM Module...")
38
40
  print("=" * 50)
39
-
41
+
40
42
  # Import after config is set
41
43
  from django_cfg.modules.django_llm import DjangoLLM, chat_completion
42
-
44
+
43
45
  # Initialize LLM service
44
46
  llm = DjangoLLM()
45
-
47
+
46
48
  if not llm.is_configured:
47
49
  print("❌ LLM service is not configured. Please set OPENROUTER_API_KEY.")
48
50
  return
49
-
51
+
50
52
  print("✅ LLM service is configured")
51
-
53
+
52
54
  # Test chat completion
53
55
  print("\n💬 Chat Completion:")
54
56
  messages = [
55
57
  {"role": "user", "content": "What is the capital of France?"}
56
58
  ]
57
-
59
+
58
60
  try:
59
61
  response = llm.chat_completion(messages)
60
62
  print(f"✅ Response: {response.get('content', 'No content')}")
@@ -62,7 +64,7 @@ async def example_llm_usage():
62
64
  print(f"💰 Cost: ${response.get('cost_usd', 0):.6f}")
63
65
  except Exception as e:
64
66
  print(f"❌ Chat completion failed: {e}")
65
-
67
+
66
68
  # Test text generation
67
69
  print("\n📝 Text Generation:")
68
70
  try:
@@ -70,18 +72,18 @@ async def example_llm_usage():
70
72
  print(f"✅ Generated text:\n{text}")
71
73
  except Exception as e:
72
74
  print(f"❌ Text generation failed: {e}")
73
-
75
+
74
76
  # Test JSON generation
75
77
  print("\n📋 JSON Generation:")
76
78
  try:
77
79
  json_data = llm.generate_json(
78
80
  "Create a JSON object with information about a car: make, model, year, price"
79
81
  )
80
- print(f"✅ Generated JSON:")
82
+ print("✅ Generated JSON:")
81
83
  print(json.dumps(json_data, indent=2))
82
84
  except Exception as e:
83
85
  print(f"❌ JSON generation failed: {e}")
84
-
86
+
85
87
  # Test convenience function
86
88
  print("\n🚀 Convenience Function:")
87
89
  try:
@@ -91,7 +93,7 @@ async def example_llm_usage():
91
93
  print(f"✅ Convenience response: {response.get('content', 'No content')}")
92
94
  except Exception as e:
93
95
  print(f"❌ Convenience function failed: {e}")
94
-
96
+
95
97
  # Get statistics
96
98
  print("\n📊 Statistics:")
97
99
  stats = llm.get_stats()
@@ -105,17 +107,17 @@ async def example_translation_usage():
105
107
  """Example translation usage."""
106
108
  print("\n🌐 Testing Django Translation Module...")
107
109
  print("=" * 50)
108
-
109
-
110
+
111
+
110
112
  # Initialize translator
111
113
  translator = DjangoTranslator()
112
-
114
+
113
115
  if not translator.is_configured:
114
116
  print("❌ Translation service is not configured. Please set OPENROUTER_API_KEY.")
115
117
  return
116
-
118
+
117
119
  print("✅ Translation service is configured")
118
-
120
+
119
121
  # Test simple translation
120
122
  print("\n🔤 Simple Translation:")
121
123
  try:
@@ -127,7 +129,7 @@ async def example_translation_usage():
127
129
  print(f"✅ Korean to English: {translated}")
128
130
  except Exception as e:
129
131
  print(f"❌ Translation failed: {e}")
130
-
132
+
131
133
  # Test CJK translation
132
134
  print("\n🈳 CJK Translation:")
133
135
  cjk_texts = [
@@ -135,7 +137,7 @@ async def example_translation_usage():
135
137
  ("これは良い車です", "ja", "Japanese"),
136
138
  ("이것은 좋은 차입니다", "ko", "Korean")
137
139
  ]
138
-
140
+
139
141
  for text, lang, lang_name in cjk_texts:
140
142
  try:
141
143
  translated = translator.translate(
@@ -146,7 +148,7 @@ async def example_translation_usage():
146
148
  print(f"✅ {lang_name}: {text} → {translated}")
147
149
  except Exception as e:
148
150
  print(f"❌ {lang_name} translation failed: {e}")
149
-
151
+
150
152
  # Test JSON translation
151
153
  print("\n📄 JSON Translation:")
152
154
  car_data = {
@@ -157,7 +159,7 @@ async def example_translation_usage():
157
159
  "price": "$25,000", # Should be skipped
158
160
  "id": "CAR_12345" # Should be skipped
159
161
  }
160
-
162
+
161
163
  try:
162
164
  translated_data = translator.translate_json(
163
165
  data=car_data,
@@ -168,14 +170,14 @@ async def example_translation_usage():
168
170
  print(json.dumps(translated_data, indent=2, ensure_ascii=False))
169
171
  except Exception as e:
170
172
  print(f"❌ JSON translation failed: {e}")
171
-
173
+
172
174
  # Test convenience functions
173
175
  print("\n🚀 Convenience Functions:")
174
176
  try:
175
177
  # Quick text translation
176
178
  quick_text = translate_text("Bonjour le monde", target_language="en", source_language="fr")
177
179
  print(f"✅ Quick translation: {quick_text}")
178
-
180
+
179
181
  # Quick JSON translation
180
182
  quick_json = translate_json(
181
183
  {"greeting": "Hola mundo", "url": "https://example.com"},
@@ -184,7 +186,7 @@ async def example_translation_usage():
184
186
  print(f"✅ Quick JSON: {quick_json}")
185
187
  except Exception as e:
186
188
  print(f"❌ Convenience functions failed: {e}")
187
-
189
+
188
190
  # Get translation statistics
189
191
  print("\n📊 Translation Statistics:")
190
192
  stats = translator.get_stats()
@@ -199,36 +201,36 @@ async def example_cache_management():
199
201
  """Example cache management."""
200
202
  print("\n💾 Testing Cache Management...")
201
203
  print("=" * 50)
202
-
204
+
203
205
  from django_cfg.modules.django_llm import DjangoLLM
204
-
206
+
205
207
  llm = DjangoLLM()
206
-
208
+
207
209
  if not llm.is_configured:
208
210
  print("❌ LLM service is not configured.")
209
211
  return
210
-
212
+
211
213
  # Get cache information
212
214
  print("📋 Cache Information:")
213
215
  config_info = llm.get_config_info()
214
216
  cache_info = config_info.get('cache_info', {})
215
-
217
+
216
218
  print(f"Cache directory: {config_info.get('cache_directory')}")
217
219
  print(f"Memory cache size: {cache_info.get('memory_cache', {}).get('size', 0)}")
218
220
  print(f"File cache exists: {cache_info.get('file_cache', {}).get('exists', False)}")
219
-
221
+
220
222
  # Test cache export
221
223
  print("\n📤 Cache Export:")
222
224
  try:
223
225
  yaml_content = llm.cache.export_cache_yaml()
224
226
  print("✅ Cache exported to YAML:")
225
227
  print(yaml_content[:500] + "..." if len(yaml_content) > 500 else yaml_content)
226
-
228
+
227
229
  # Save to file
228
230
  export_file = Path("llm_cache_export.yaml")
229
231
  llm.cache.export_cache_yaml(export_file)
230
232
  print(f"✅ Cache saved to: {export_file}")
231
-
233
+
232
234
  except Exception as e:
233
235
  print(f"❌ Cache export failed: {e}")
234
236
 
@@ -237,8 +239,8 @@ async def example_alerts():
237
239
  """Example alert functionality."""
238
240
  print("\n🔔 Testing Alert Functionality...")
239
241
  print("=" * 50)
240
-
241
-
242
+
243
+
242
244
  # Test LLM alerts
243
245
  print("🤖 Sending LLM Alert:")
244
246
  try:
@@ -253,7 +255,7 @@ async def example_alerts():
253
255
  print("✅ LLM alert sent (check Telegram)")
254
256
  except Exception as e:
255
257
  print(f"❌ LLM alert failed: {e}")
256
-
258
+
257
259
  # Test translation alerts
258
260
  print("\n🌐 Sending Translation Alert:")
259
261
  try:
@@ -274,60 +276,60 @@ async def example_models_cache():
274
276
  """Example of using models cache for dynamic pricing."""
275
277
  print("\n📊 Models Cache Example")
276
278
  print("-" * 30)
277
-
279
+
278
280
  try:
279
281
  # Initialize LLM service
280
282
  llm_service = DjangoLLM()
281
-
283
+
282
284
  if not llm_service.is_configured:
283
285
  print("⚠️ LLM service not configured, skipping models cache example")
284
286
  return
285
-
287
+
286
288
  client = llm_service.client
287
-
289
+
288
290
  if not client.models_cache:
289
291
  print("⚠️ Models cache not available for this provider")
290
292
  return
291
-
293
+
292
294
  print("🔄 Fetching models from OpenRouter API...")
293
295
  models = await client.fetch_models()
294
296
  print(f"✅ Fetched {len(models)} models")
295
-
297
+
296
298
  # Get models summary
297
299
  summary = client.get_models_summary()
298
300
  print(f"📈 Total models: {summary.get('total_models', 0)}")
299
301
  print(f"📈 Available models: {summary.get('available_models', 0)}")
300
302
  print(f"📈 Free models: {summary.get('free_models_count', 0)}")
301
303
  print(f"📈 Budget models: {summary.get('budget_models_count', 0)}")
302
-
304
+
303
305
  # Show some free models
304
306
  free_models = client.get_free_models()
305
307
  if free_models:
306
308
  print(f"\n🆓 Free models ({len(free_models)}):")
307
309
  for model in free_models[:3]: # Show first 3
308
310
  print(f" • {model.name} ({model.provider})")
309
-
311
+
310
312
  # Show budget models
311
313
  budget_models = client.get_budget_models(max_price=1.0)
312
314
  if budget_models:
313
315
  print(f"\n💰 Budget models ≤$1.0/1M tokens ({len(budget_models)}):")
314
316
  for model in budget_models[:3]: # Show first 3
315
317
  print(f" • {model.name}: ${model.pricing.prompt_price}/1M prompt tokens")
316
-
318
+
317
319
  # Search for coding models
318
320
  coding_models = client.search_models("code")
319
321
  if coding_models:
320
322
  print(f"\n💻 Coding models ({len(coding_models)}):")
321
323
  for model in coding_models[:3]: # Show first 3
322
324
  print(f" • {model.name}: ${model.pricing.prompt_price}/1M tokens")
323
-
325
+
324
326
  # Test dynamic cost estimation
325
327
  model_id = "openai/gpt-4o-mini"
326
328
  cost = client.estimate_cost(model_id, 1000, 500)
327
329
  print(f"\n💵 Dynamic cost estimate for {model_id}:")
328
- print(f" Input: 1000 tokens, Output: 500 tokens")
330
+ print(" Input: 1000 tokens, Output: 500 tokens")
329
331
  print(f" Total cost: ${cost:.6f}")
330
-
332
+
331
333
  # Show model details
332
334
  model_info = client.get_model_info(model_id)
333
335
  if model_info:
@@ -337,14 +339,14 @@ async def example_models_cache():
337
339
  print(f" Context: {model_info.context_length:,} tokens")
338
340
  print(f" Prompt price: ${model_info.pricing.prompt_price}/1M tokens")
339
341
  print(f" Completion price: ${model_info.pricing.completion_price}/1M tokens")
340
-
342
+
341
343
  # Cache information
342
344
  cache_info = client.get_models_cache_info()
343
- print(f"\n🗄️ Cache info:")
345
+ print("\n🗄️ Cache info:")
344
346
  print(f" Models cached: {cache_info.get('models_count', 0)}")
345
347
  print(f" Last updated: {cache_info.get('last_fetch', 'Never')}")
346
348
  print(f" Cache file: {cache_info.get('cache_file_exists', False)}")
347
-
349
+
348
350
  except Exception as e:
349
351
  print(f"❌ Models cache example failed: {e}")
350
352
  import traceback
@@ -355,17 +357,17 @@ async def main():
355
357
  """Main example function."""
356
358
  print("🚀 Django LLM Module Examples")
357
359
  print("=" * 50)
358
-
360
+
359
361
  # Set up configuration
360
362
  config = ExampleConfig()
361
-
363
+
362
364
  # Run examples
363
365
  await example_llm_usage()
364
366
  await example_translation_usage()
365
367
  await example_cache_management()
366
368
  await example_models_cache()
367
369
  await example_alerts()
368
-
370
+
369
371
  print("\n🎉 All examples completed!")
370
372
  print("\nNext steps:")
371
373
  print("1. Check the generated cache files")
@@ -2,8 +2,8 @@
2
2
  LLM Client, Cache and Models Cache
3
3
  """
4
4
 
5
- from .client import LLMClient
6
5
  from .cache import LLMCache
6
+ from .client import LLMClient
7
7
  from .models_cache import ModelsCache
8
8
 
9
9
  __all__ = ['LLMClient', 'LLMCache', 'ModelsCache']
@@ -2,18 +2,19 @@
2
2
  LLM Cache Manager - caches LLM responses to avoid duplicate API calls
3
3
  """
4
4
 
5
- import json
6
5
  import hashlib
6
+ import json
7
7
  import logging
8
8
  from pathlib import Path
9
- from typing import Dict, Optional, Any, List
9
+ from typing import Any, Dict, List, Optional
10
+
10
11
  from cachetools import TTLCache
11
12
 
12
13
  logger = logging.getLogger(__name__)
13
14
 
14
15
  class LLMCache:
15
16
  """Manages LLM response caching with TTL and file persistence"""
16
-
17
+
17
18
  def __init__(self, cache_dir: Optional[str] = None, ttl: int = 3600, max_size: int = 1000):
18
19
  """
19
20
  Initialize LLM cache manager
@@ -28,30 +29,30 @@ class LLMCache:
28
29
  # Get the django_cfg module directory
29
30
  module_dir = Path(__file__).parent.parent.parent # django_cfg/modules/django_llm/llm -> django_cfg
30
31
  default_cache_dir = module_dir / ".cache" / "llm"
31
-
32
+
32
33
  # Create cache directory if it doesn't exist
33
34
  default_cache_dir.mkdir(parents=True, exist_ok=True)
34
35
  else:
35
36
  default_cache_dir = Path(cache_dir)
36
-
37
+
37
38
  self.cache_dir = default_cache_dir
38
39
  self.cache_file = self.cache_dir / "llm_responses.json"
39
40
  self.ttl = ttl
40
41
  self.max_size = max_size
41
-
42
+
42
43
  # TTL Memory Cache
43
44
  self.memory_cache = TTLCache(maxsize=max_size, ttl=ttl)
44
-
45
+
45
46
  # Load persistent cache
46
47
  self.persistent_cache = self._load_persistent_cache()
47
-
48
+
48
49
  logger.debug(f"LLM cache initialized: {self.cache_dir}")
49
50
 
50
51
  def _load_persistent_cache(self) -> Dict[str, Any]:
51
52
  """Load cache from file"""
52
53
  try:
53
54
  if self.cache_file.exists():
54
- with open(self.cache_file, 'r', encoding='utf-8') as f:
55
+ with open(self.cache_file, encoding='utf-8') as f:
55
56
  return json.load(f)
56
57
  except Exception as e:
57
58
  logger.warning(f"Failed to load persistent cache: {e}")
@@ -73,10 +74,10 @@ class LLMCache:
73
74
  "model": model,
74
75
  **kwargs
75
76
  }
76
-
77
+
77
78
  # Convert to JSON string for hashing
78
79
  request_str = json.dumps(request_data, sort_keys=True, ensure_ascii=False)
79
-
80
+
80
81
  # Generate SHA256 hash
81
82
  return hashlib.sha256(request_str.encode('utf-8')).hexdigest()
82
83
 
@@ -88,7 +89,7 @@ class LLMCache:
88
89
  logger.debug(f"Memory cache hit for hash: {request_hash[:8]}...")
89
90
  # Return only the response part, not the whole cache entry
90
91
  return cache_entry.get("response") if isinstance(cache_entry, dict) and "response" in cache_entry else cache_entry
91
-
92
+
92
93
  # Check persistent cache
93
94
  if request_hash in self.persistent_cache:
94
95
  cache_entry = self.persistent_cache[request_hash]
@@ -97,7 +98,7 @@ class LLMCache:
97
98
  logger.debug(f"Persistent cache hit for hash: {request_hash[:8]}...")
98
99
  # Return only the response part, not the whole cache entry
99
100
  return cache_entry.get("response") if isinstance(cache_entry, dict) and "response" in cache_entry else cache_entry
100
-
101
+
101
102
  return None
102
103
 
103
104
  def set_response(self, request_hash: str, response: Dict[str, Any], model: str):
@@ -109,18 +110,18 @@ class LLMCache:
109
110
  "model": model,
110
111
  "cached_at": response.get("created", 0)
111
112
  }
112
-
113
+
113
114
  # Store in memory cache
114
115
  self.memory_cache[request_hash] = cache_entry
115
-
116
+
116
117
  # Store in persistent cache
117
118
  self.persistent_cache[request_hash] = cache_entry
118
-
119
+
119
120
  # Save to file
120
121
  self._save_persistent_cache()
121
-
122
+
122
123
  logger.debug(f"Cached response for hash: {request_hash[:8]}...")
123
-
124
+
124
125
  except Exception as e:
125
126
  logger.error(f"Failed to cache response: {e}")
126
127
 
@@ -138,12 +139,12 @@ class LLMCache:
138
139
  """Clear all caches"""
139
140
  self.memory_cache.clear()
140
141
  self.persistent_cache.clear()
141
-
142
+
142
143
  # Remove cache file
143
144
  try:
144
145
  if self.cache_file.exists():
145
146
  self.cache_file.unlink()
146
147
  except Exception as e:
147
148
  logger.error(f"Failed to remove cache file: {e}")
148
-
149
+
149
150
  logger.info("LLM cache cleared")
@@ -5,25 +5,25 @@ Universal LLM client supporting multiple providers with caching and token optimi
5
5
  """
6
6
 
7
7
  import logging
8
- from typing import Dict, List, Optional, Any
9
8
  from pathlib import Path
9
+ from typing import Any, Dict, List, Optional
10
10
 
11
- from .models_cache import ModelsCache, ModelInfo
12
- from .tokenizer import Tokenizer
11
+ from ...base import BaseCfgModule
12
+ from .embeddings import MockEmbedder, OpenAIEmbedder
13
13
  from .extractor import JSONExtractor
14
14
  from .models import (
15
- EmbeddingResponse,
16
15
  ChatCompletionResponse,
16
+ EmbeddingResponse,
17
17
  )
18
- from ...base import BaseCfgModule
18
+ from .models_api import ModelsQueryAPI
19
+ from .models_cache import ModelInfo, ModelsCache
19
20
 
20
21
  # Import new components
21
22
  from .providers import ProviderManager, ProviderSelector
22
- from .stats import StatsManager
23
- from .embeddings import OpenAIEmbedder, MockEmbedder
23
+ from .requests import ChatRequestHandler, EmbeddingRequestHandler, RequestCacheManager
24
24
  from .responses import ResponseBuilder
25
- from .requests import RequestCacheManager, ChatRequestHandler, EmbeddingRequestHandler
26
- from .models_api import ModelsQueryAPI
25
+ from .stats import StatsManager
26
+ from .tokenizer import Tokenizer
27
27
 
28
28
  logger = logging.getLogger(__name__)
29
29
 
@@ -5,7 +5,7 @@ Provides accurate cost calculation using models cache and fallback pricing.
5
5
  """
6
6
 
7
7
  import logging
8
- from typing import Dict, Any, Optional
8
+ from typing import Dict, Optional
9
9
 
10
10
  from .models_cache import ModelsCache
11
11
 
@@ -14,7 +14,7 @@ logger = logging.getLogger(__name__)
14
14
 
15
15
  class CostCalculator:
16
16
  """Calculate costs for LLM operations using models cache and fallback pricing."""
17
-
17
+
18
18
  def __init__(self, models_cache: Optional[ModelsCache] = None):
19
19
  """
20
20
  Initialize cost calculator.
@@ -23,7 +23,7 @@ class CostCalculator:
23
23
  models_cache: ModelsCache instance for dynamic pricing
24
24
  """
25
25
  self.models_cache = models_cache
26
-
26
+
27
27
  # Fallback pricing for common models (per 1M tokens)
28
28
  self.fallback_chat_prices = {
29
29
  "gpt-4o-mini": {"prompt": 0.15, "completion": 0.6},
@@ -33,14 +33,14 @@ class CostCalculator:
33
33
  "claude-3-sonnet": {"prompt": 3.0, "completion": 15.0},
34
34
  "claude-3-opus": {"prompt": 15.0, "completion": 75.0}
35
35
  }
36
-
36
+
37
37
  # Fallback embedding pricing (per 1K tokens)
38
38
  self.fallback_embedding_prices = {
39
39
  "text-embedding-ada-002": 0.0001 / 1000,
40
40
  "text-embedding-3-small": 0.00002 / 1000,
41
41
  "text-embedding-3-large": 0.00013 / 1000,
42
42
  }
43
-
43
+
44
44
  def calculate_chat_cost(self, usage: Dict[str, int], model: str) -> float:
45
45
  """
46
46
  Calculate cost for chat completion.
@@ -63,10 +63,10 @@ class CostCalculator:
63
63
  logger.debug(f"Model {model} not found in models cache, using fallback pricing")
64
64
  except Exception as e:
65
65
  logger.warning(f"Failed to calculate chat cost from models cache: {e}")
66
-
66
+
67
67
  # Fallback to hardcoded pricing
68
68
  return self._calculate_chat_cost_fallback(usage, model)
69
-
69
+
70
70
  def calculate_embedding_cost(self, tokens: int, model: str) -> float:
71
71
  """
72
72
  Calculate cost for embedding generation.
@@ -94,16 +94,16 @@ class CostCalculator:
94
94
  logger.debug(f"Embedding model {model} not found in models cache, using fallback pricing")
95
95
  except Exception as e:
96
96
  logger.warning(f"Failed to calculate embedding cost from models cache: {e}")
97
-
97
+
98
98
  # Fallback to hardcoded pricing
99
99
  return self._calculate_embedding_cost_fallback(tokens, model)
100
-
100
+
101
101
  def _calculate_chat_cost_fallback(self, usage: Dict[str, int], model: str) -> float:
102
102
  """Calculate chat cost using fallback pricing."""
103
103
  total_tokens = usage.get('total_tokens', 0)
104
104
  prompt_tokens = usage.get('prompt_tokens', 0)
105
105
  completion_tokens = usage.get('completion_tokens', 0)
106
-
106
+
107
107
  # Find matching model cost
108
108
  for model_pattern, costs in self.fallback_chat_prices.items():
109
109
  if model_pattern in model.lower():
@@ -112,19 +112,19 @@ class CostCalculator:
112
112
  total_cost = prompt_cost + completion_cost
113
113
  logger.debug(f"Using fallback chat pricing for {model}: ${total_cost:.6f}")
114
114
  return total_cost
115
-
115
+
116
116
  # Default cost (using total tokens with average rate)
117
117
  default_cost = (total_tokens / 1_000_000) * 0.5
118
118
  logger.debug(f"Using default chat pricing for {model}: ${default_cost:.6f}")
119
119
  return default_cost
120
-
120
+
121
121
  def _calculate_embedding_cost_fallback(self, tokens: int, model: str) -> float:
122
122
  """Calculate embedding cost using fallback pricing."""
123
123
  price_per_token = self.fallback_embedding_prices.get(model, 0.0001 / 1000)
124
124
  cost = tokens * price_per_token
125
125
  logger.debug(f"Using fallback embedding pricing for {model}: ${cost:.6f}")
126
126
  return cost
127
-
127
+
128
128
  def estimate_cost(self, model: str, input_tokens: int, output_tokens: int) -> float:
129
129
  """
130
130
  Estimate cost for a model.
@@ -148,7 +148,7 @@ class CostCalculator:
148
148
  logger.debug(f"Model {model} not found in models cache for cost estimation, using fallback")
149
149
  except Exception as e:
150
150
  logger.warning(f"Failed to estimate cost from models cache: {e}")
151
-
151
+
152
152
  # Fallback to internal calculation
153
153
  usage_dict = {
154
154
  'total_tokens': input_tokens + output_tokens,
@@ -4,8 +4,8 @@ Embedding generation strategies for LLM client.
4
4
  Provides real and mock embedding implementations.
5
5
  """
6
6
 
7
- from .openai_embedder import OpenAIEmbedder
8
7
  from .mock_embedder import MockEmbedder
8
+ from .openai_embedder import OpenAIEmbedder
9
9
 
10
10
  __all__ = [
11
11
  'OpenAIEmbedder',
@@ -4,10 +4,9 @@ Mock embedder for providers without embedding support.
4
4
  Generates mock embeddings using MD5 hash for OpenRouter and similar providers.
5
5
  """
6
6
 
7
- import time
8
7
  import hashlib
9
8
  import logging
10
- from typing import Optional
9
+ import time
11
10
 
12
11
  from ..costs import calculate_embedding_cost
13
12
  from ..models import EmbeddingResponse