django-cfg 1.3.11__py3-none-any.whl → 1.4.0__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 (439) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/accounts/admin/inlines.py +11 -5
  3. django_cfg/apps/accounts/admin/user_admin.py +39 -16
  4. django_cfg/apps/accounts/serializers/profile.py +1 -1
  5. django_cfg/apps/accounts/services/otp_service.py +18 -11
  6. django_cfg/apps/accounts/signals.py +15 -24
  7. django_cfg/apps/accounts/utils/notifications.py +217 -358
  8. django_cfg/apps/accounts/views/otp.py +2 -2
  9. django_cfg/apps/accounts/views/webhook.py +1 -1
  10. django_cfg/apps/agents/core/django_agent.py +1 -1
  11. django_cfg/apps/api/commands/views.py +66 -83
  12. django_cfg/apps/api/health/drf_views.py +269 -0
  13. django_cfg/apps/api/health/serializers.py +45 -0
  14. django_cfg/apps/api/health/urls.py +6 -1
  15. django_cfg/apps/knowbase/admin/actions/__init__.py +13 -0
  16. django_cfg/apps/knowbase/admin/actions/visibility_actions.py +56 -0
  17. django_cfg/apps/knowbase/admin/document_admin.py +136 -270
  18. django_cfg/apps/knowbase/admin/helpers/__init__.py +17 -0
  19. django_cfg/apps/knowbase/admin/helpers/configs.py +72 -0
  20. django_cfg/apps/knowbase/admin/helpers/display_helpers.py +156 -0
  21. django_cfg/apps/knowbase/admin/helpers/statistics.py +108 -0
  22. django_cfg/apps/knowbase/config/constance_fields.py +1 -1
  23. django_cfg/apps/knowbase/config/settings.py +2 -2
  24. django_cfg/apps/knowbase/mixins/__init__.py +19 -2
  25. django_cfg/apps/knowbase/mixins/config/__init__.py +14 -0
  26. django_cfg/apps/knowbase/mixins/config/defaults.py +75 -0
  27. django_cfg/apps/knowbase/mixins/config/meta_config.py +120 -0
  28. django_cfg/apps/knowbase/mixins/creator.py +10 -10
  29. django_cfg/apps/knowbase/mixins/external_data_mixin.py +105 -403
  30. django_cfg/apps/knowbase/mixins/generators/__init__.py +16 -0
  31. django_cfg/apps/knowbase/mixins/generators/content_generator.py +218 -0
  32. django_cfg/apps/knowbase/mixins/generators/field_analyzer.py +76 -0
  33. django_cfg/apps/knowbase/mixins/generators/metadata_generator.py +124 -0
  34. django_cfg/apps/knowbase/mixins/service.py +2 -2
  35. django_cfg/apps/knowbase/services/archive/__init__.py +1 -0
  36. django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +17 -0
  37. django_cfg/apps/knowbase/services/archive/analyzers/complexity_analyzer.py +33 -0
  38. django_cfg/apps/knowbase/services/archive/analyzers/purpose_detector.py +36 -0
  39. django_cfg/apps/knowbase/services/archive/analyzers/quality_analyzer.py +39 -0
  40. django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +103 -0
  41. django_cfg/apps/knowbase/services/archive/chunking/__init__.py +19 -0
  42. django_cfg/apps/knowbase/services/archive/chunking/base.py +81 -0
  43. django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +62 -0
  44. django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +107 -0
  45. django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +248 -0
  46. django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +70 -0
  47. django_cfg/apps/knowbase/services/archive/chunking_service.py +110 -729
  48. django_cfg/apps/knowbase/services/archive/context/__init__.py +14 -0
  49. django_cfg/apps/knowbase/services/archive/context/builders.py +220 -0
  50. django_cfg/apps/knowbase/services/archive/context/models.py +38 -0
  51. django_cfg/apps/knowbase/services/embedding/models.py +18 -14
  52. django_cfg/apps/knowbase/services/embedding/processors.py +6 -3
  53. django_cfg/apps/knowbase/tasks/document_processing.py +11 -3
  54. django_cfg/apps/leads/tests.py +1 -1
  55. django_cfg/apps/payments/admin/api_keys_admin.py +1 -1
  56. django_cfg/apps/payments/admin/balance_admin.py +1 -1
  57. django_cfg/apps/payments/admin/currencies_admin.py +1 -1
  58. django_cfg/apps/payments/admin/payments_admin.py +1 -1
  59. django_cfg/apps/payments/admin/subscriptions_admin.py +1 -1
  60. django_cfg/apps/payments/admin_interface/templates/payments/base.html +59 -126
  61. django_cfg/apps/payments/admin_interface/views/api/payments.py +1 -1
  62. django_cfg/apps/payments/admin_interface/views/api/stats.py +1 -1
  63. django_cfg/apps/payments/admin_interface/views/api/users.py +1 -1
  64. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +1 -1
  65. django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +1 -1
  66. django_cfg/apps/payments/admin_interface/views/base.py +29 -2
  67. django_cfg/apps/payments/apps.py +1 -1
  68. django_cfg/apps/payments/config/django_cfg_integration.py +2 -2
  69. django_cfg/apps/payments/config/helpers.py +3 -2
  70. django_cfg/apps/payments/management/commands/cleanup_expired_data.py +1 -1
  71. django_cfg/apps/payments/management/commands/currency_stats.py +1 -1
  72. django_cfg/apps/payments/management/commands/manage_currencies.py +1 -1
  73. django_cfg/apps/payments/management/commands/manage_providers.py +1 -1
  74. django_cfg/apps/payments/management/commands/process_pending_payments.py +1 -1
  75. django_cfg/apps/payments/management/commands/test_providers.py +1 -1
  76. django_cfg/apps/payments/middleware/api_access.py +1 -1
  77. django_cfg/apps/payments/middleware/rate_limiting.py +1 -1
  78. django_cfg/apps/payments/middleware/usage_tracking.py +1 -1
  79. django_cfg/apps/payments/models/balance.py +2 -2
  80. django_cfg/apps/payments/models/managers/api_key_managers.py +1 -1
  81. django_cfg/apps/payments/models/managers/balance_managers.py +1 -1
  82. django_cfg/apps/payments/models/managers/currency_managers.py +1 -1
  83. django_cfg/apps/payments/models/managers/payment_managers.py +1 -1
  84. django_cfg/apps/payments/models/managers/subscription_managers.py +1 -1
  85. django_cfg/apps/payments/models/payments.py +2 -2
  86. django_cfg/apps/payments/services/cache_service/__init__.py +1 -1
  87. django_cfg/apps/payments/services/cache_service/simple_cache.py +10 -5
  88. django_cfg/apps/payments/services/core/base.py +1 -1
  89. django_cfg/apps/payments/services/core/currency/__init__.py +13 -0
  90. django_cfg/apps/payments/services/core/currency/currency_converter.py +57 -0
  91. django_cfg/apps/payments/services/core/currency/currency_validator.py +61 -0
  92. django_cfg/apps/payments/services/core/operations/__init__.py +15 -0
  93. django_cfg/apps/payments/services/core/operations/payment_canceller.py +100 -0
  94. django_cfg/apps/payments/services/core/operations/payment_creator.py +196 -0
  95. django_cfg/apps/payments/services/core/operations/status_checker.py +100 -0
  96. django_cfg/apps/payments/services/core/payment_service.py +124 -612
  97. django_cfg/apps/payments/services/core/providers/__init__.py +13 -0
  98. django_cfg/apps/payments/services/core/providers/provider_client.py +132 -0
  99. django_cfg/apps/payments/services/core/providers/status_mapper.py +89 -0
  100. django_cfg/apps/payments/services/core/utils/__init__.py +13 -0
  101. django_cfg/apps/payments/services/core/utils/data_converter.py +48 -0
  102. django_cfg/apps/payments/services/core/utils/statistics_calculator.py +69 -0
  103. django_cfg/apps/payments/services/providers/base.py +1 -1
  104. django_cfg/apps/payments/services/providers/nowpayments/__init__.py +3 -3
  105. django_cfg/apps/payments/services/providers/nowpayments/parsers/__init__.py +9 -0
  106. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +23 -0
  107. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/constants.py +23 -0
  108. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/currency_names.py +244 -0
  109. django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +511 -0
  110. django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +168 -0
  111. django_cfg/apps/payments/services/providers/nowpayments/provider.py +1 -1
  112. django_cfg/apps/payments/services/providers/nowpayments/sync.py +1 -1
  113. django_cfg/apps/payments/services/providers/registry.py +1 -1
  114. django_cfg/apps/payments/services/providers/sync_service.py +1 -1
  115. django_cfg/apps/payments/signals/__init__.py +1 -1
  116. django_cfg/apps/payments/signals/api_key_signals.py +1 -1
  117. django_cfg/apps/payments/signals/balance_signals.py +1 -1
  118. django_cfg/apps/payments/signals/payment_signals.py +1 -1
  119. django_cfg/apps/payments/signals/subscription_signals.py +1 -1
  120. django_cfg/apps/payments/views/api/api_keys.py +1 -1
  121. django_cfg/apps/payments/views/api/balances.py +1 -1
  122. django_cfg/apps/payments/views/api/base.py +1 -1
  123. django_cfg/apps/payments/views/api/currencies.py +1 -1
  124. django_cfg/apps/payments/views/api/payments.py +1 -1
  125. django_cfg/apps/payments/views/api/subscriptions.py +1 -1
  126. django_cfg/apps/payments/views/api/webhooks.py +1 -1
  127. django_cfg/apps/payments/views/serializers/api_keys.py +1 -1
  128. django_cfg/apps/payments/views/serializers/balances.py +1 -1
  129. django_cfg/apps/payments/views/serializers/currencies.py +1 -1
  130. django_cfg/apps/payments/views/serializers/payments.py +1 -1
  131. django_cfg/apps/payments/views/serializers/subscriptions.py +1 -1
  132. django_cfg/apps/payments/views/serializers/webhooks.py +1 -1
  133. django_cfg/apps/support/admin/support_admin.py +21 -13
  134. django_cfg/apps/support/templates/support/chat/access_denied.html +21 -27
  135. django_cfg/apps/support/templates/support/chat/ticket_chat.html +183 -254
  136. django_cfg/apps/support/utils/support_email_service.py +1 -1
  137. django_cfg/apps/tasks/templates/tasks/layout/base.html +20 -115
  138. django_cfg/apps/tasks/utils/simulator.py +1 -1
  139. django_cfg/apps/tasks/views/dashboard.py +33 -3
  140. django_cfg/apps/urls.py +5 -1
  141. django_cfg/cli/README.md +57 -471
  142. django_cfg/cli/commands/create_project.py +140 -529
  143. django_cfg/cli/main.py +13 -10
  144. django_cfg/core/__init__.py +63 -6
  145. django_cfg/core/base/__init__.py +5 -0
  146. django_cfg/core/base/config_model.py +652 -0
  147. django_cfg/core/builders/__init__.py +11 -0
  148. django_cfg/core/builders/apps_builder.py +258 -0
  149. django_cfg/core/builders/middleware_builder.py +115 -0
  150. django_cfg/core/builders/security_builder.py +96 -0
  151. django_cfg/core/config.py +20 -892
  152. django_cfg/core/constants.py +69 -0
  153. django_cfg/core/environment/__init__.py +9 -0
  154. django_cfg/core/exceptions.py +45 -298
  155. django_cfg/core/generation/__init__.py +51 -0
  156. django_cfg/core/generation/core_generators/__init__.py +0 -0
  157. django_cfg/core/generation/core_generators/settings.py +90 -0
  158. django_cfg/core/generation/core_generators/static.py +82 -0
  159. django_cfg/core/generation/core_generators/templates.py +141 -0
  160. django_cfg/core/generation/data_generators/__init__.py +15 -0
  161. django_cfg/core/generation/data_generators/cache.py +132 -0
  162. django_cfg/core/generation/data_generators/database.py +117 -0
  163. django_cfg/core/generation/generation.py +92 -0
  164. django_cfg/core/generation/integration_generators/__init__.py +21 -0
  165. django_cfg/core/generation/integration_generators/api.py +237 -0
  166. django_cfg/core/generation/integration_generators/sessions.py +65 -0
  167. django_cfg/core/generation/integration_generators/tailwind.py +54 -0
  168. django_cfg/core/generation/integration_generators/tasks.py +92 -0
  169. django_cfg/core/generation/integration_generators/third_party.py +144 -0
  170. django_cfg/core/generation/orchestrator.py +285 -0
  171. django_cfg/core/generation/protocols.py +30 -0
  172. django_cfg/core/generation/security_generators/__init__.py +0 -0
  173. django_cfg/core/generation/utility_generators/__init__.py +24 -0
  174. django_cfg/core/generation/utility_generators/email.py +58 -0
  175. django_cfg/core/generation/utility_generators/i18n.py +66 -0
  176. django_cfg/core/generation/utility_generators/limits.py +58 -0
  177. django_cfg/core/generation/utility_generators/logging.py +66 -0
  178. django_cfg/core/generation/utility_generators/security.py +101 -0
  179. django_cfg/core/generation/utils/__init__.py +0 -0
  180. django_cfg/core/generation/utils/helpers.py +32 -0
  181. django_cfg/core/integration/__init__.py +18 -25
  182. django_cfg/core/integration/display/startup.py +146 -133
  183. django_cfg/core/integration/url_integration.py +13 -2
  184. django_cfg/core/services/__init__.py +5 -0
  185. django_cfg/core/services/config_service.py +121 -0
  186. django_cfg/core/state/__init__.py +9 -0
  187. django_cfg/core/state/registry.py +84 -0
  188. django_cfg/core/types/__init__.py +15 -0
  189. django_cfg/core/types/aliases.py +15 -0
  190. django_cfg/core/types/enums.py +49 -0
  191. django_cfg/dashboard/DEBUG_README.md +105 -0
  192. django_cfg/dashboard/REFACTORING_SUMMARY.md +237 -0
  193. django_cfg/dashboard/__init__.py +24 -0
  194. django_cfg/dashboard/components.py +308 -0
  195. django_cfg/dashboard/debug.py +176 -0
  196. django_cfg/dashboard/management/__init__.py +0 -0
  197. django_cfg/dashboard/management/commands/__init__.py +0 -0
  198. django_cfg/dashboard/management/commands/debug_dashboard.py +109 -0
  199. django_cfg/dashboard/sections/__init__.py +1 -0
  200. django_cfg/dashboard/sections/base.py +128 -0
  201. django_cfg/dashboard/sections/commands.py +32 -0
  202. django_cfg/dashboard/sections/overview.py +394 -0
  203. django_cfg/dashboard/sections/stats.py +48 -0
  204. django_cfg/dashboard/sections/system.py +73 -0
  205. django_cfg/management/commands/check_settings.py +6 -2
  206. django_cfg/management/commands/clear_constance.py +6 -1
  207. django_cfg/management/commands/create_token.py +5 -4
  208. django_cfg/management/commands/generate.py +5 -0
  209. django_cfg/management/commands/list_urls.py +7 -2
  210. django_cfg/management/commands/migrate_all.py +6 -2
  211. django_cfg/management/commands/migrator.py +6 -1
  212. django_cfg/management/commands/rundramatiq.py +6 -1
  213. django_cfg/management/commands/rundramatiq_simulator.py +11 -4
  214. django_cfg/management/commands/runserver_ngrok.py +9 -7
  215. django_cfg/management/commands/script.py +25 -21
  216. django_cfg/management/commands/show_config.py +6 -1
  217. django_cfg/management/commands/show_urls.py +8 -3
  218. django_cfg/management/commands/superuser.py +5 -4
  219. django_cfg/management/commands/task_clear.py +8 -3
  220. django_cfg/management/commands/task_status.py +8 -3
  221. django_cfg/management/commands/test_email.py +6 -1
  222. django_cfg/management/commands/test_telegram.py +6 -1
  223. django_cfg/management/commands/test_twilio.py +6 -1
  224. django_cfg/management/commands/tree.py +7 -4
  225. django_cfg/models/__init__.py +88 -3
  226. django_cfg/models/api/__init__.py +27 -0
  227. django_cfg/models/{api.py → api/config.py} +1 -1
  228. django_cfg/models/api/drf/__init__.py +21 -0
  229. django_cfg/models/api/drf/config.py +101 -0
  230. django_cfg/models/api/drf/redoc.py +31 -0
  231. django_cfg/models/api/drf/spectacular.py +129 -0
  232. django_cfg/models/api/drf/swagger.py +59 -0
  233. django_cfg/models/{api_keys.py → api/keys.py} +16 -6
  234. django_cfg/models/{limits.py → api/limits.py} +0 -1
  235. django_cfg/models/base/__init__.py +14 -0
  236. django_cfg/models/django/__init__.py +16 -0
  237. django_cfg/models/{constance.py → django/constance.py} +1 -1
  238. django_cfg/models/{environment.py → django/environment.py} +1 -1
  239. django_cfg/models/infrastructure/__init__.py +17 -0
  240. django_cfg/models/{cache.py → infrastructure/cache.py} +3 -2
  241. django_cfg/models/infrastructure/database/__init__.py +22 -0
  242. django_cfg/models/infrastructure/database/config.py +265 -0
  243. django_cfg/models/infrastructure/database/converters.py +91 -0
  244. django_cfg/models/infrastructure/database/parsers.py +96 -0
  245. django_cfg/models/infrastructure/database/routing.py +85 -0
  246. django_cfg/models/infrastructure/database/validators.py +170 -0
  247. django_cfg/models/{logging.py → infrastructure/logging.py} +1 -1
  248. django_cfg/models/{security.py → infrastructure/security.py} +2 -2
  249. django_cfg/models/ngrok/__init__.py +11 -0
  250. django_cfg/models/ngrok/auth.py +37 -0
  251. django_cfg/models/ngrok/config.py +77 -0
  252. django_cfg/models/ngrok/tunnel.py +35 -0
  253. django_cfg/models/payments/__init__.py +20 -0
  254. django_cfg/models/payments/api_keys.py +57 -0
  255. django_cfg/models/{payments.py → payments/config.py} +56 -154
  256. django_cfg/models/payments/providers/__init__.py +15 -0
  257. django_cfg/models/payments/providers/base.py +25 -0
  258. django_cfg/models/payments/providers/nowpayments.py +48 -0
  259. django_cfg/models/services/__init__.py +18 -0
  260. django_cfg/models/services/base.py +65 -0
  261. django_cfg/models/{email.py → services/email.py} +1 -1
  262. django_cfg/models/services/telegram.py +172 -0
  263. django_cfg/models/tasks/__init__.py +51 -0
  264. django_cfg/models/tasks/backends.py +250 -0
  265. django_cfg/models/tasks/config.py +314 -0
  266. django_cfg/models/tasks/utils.py +174 -0
  267. django_cfg/modules/base.py +18 -3
  268. django_cfg/modules/django_admin/decorators/actions.py +1 -1
  269. django_cfg/modules/django_admin/decorators/display.py +1 -1
  270. django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +1 -1
  271. django_cfg/modules/django_cfg_rpc_client/README.md +346 -0
  272. django_cfg/modules/django_cfg_rpc_client/__init__.py +51 -0
  273. django_cfg/modules/django_cfg_rpc_client/client.py +540 -0
  274. django_cfg/modules/django_cfg_rpc_client/config.py +207 -0
  275. django_cfg/modules/django_cfg_rpc_client/dashboard/README.md +517 -0
  276. django_cfg/modules/django_cfg_rpc_client/dashboard/UNFOLD_INTEGRATION.md +439 -0
  277. django_cfg/modules/django_cfg_rpc_client/dashboard/__init__.py +11 -0
  278. django_cfg/modules/django_cfg_rpc_client/dashboard/apps.py +22 -0
  279. django_cfg/modules/django_cfg_rpc_client/dashboard/monitor.py +435 -0
  280. django_cfg/modules/django_cfg_rpc_client/dashboard/static/django_cfg_rpc_dashboard/js/dashboard.js +373 -0
  281. django_cfg/modules/django_cfg_rpc_client/dashboard/templates/django_cfg_rpc_dashboard/base.html +76 -0
  282. django_cfg/modules/django_cfg_rpc_client/dashboard/templates/django_cfg_rpc_dashboard/dashboard.html +200 -0
  283. django_cfg/modules/django_cfg_rpc_client/dashboard/urls.py +22 -0
  284. django_cfg/modules/django_cfg_rpc_client/dashboard/urls_admin.py +9 -0
  285. django_cfg/modules/django_cfg_rpc_client/dashboard/views.py +251 -0
  286. django_cfg/modules/django_cfg_rpc_client/exceptions.py +201 -0
  287. django_cfg/modules/django_drf_theme/CHANGELOG.md +210 -0
  288. django_cfg/modules/django_drf_theme/EXAMPLE.md +465 -0
  289. django_cfg/modules/django_drf_theme/IMPLEMENTATION.md +232 -0
  290. django_cfg/modules/django_drf_theme/README.md +207 -0
  291. django_cfg/modules/django_drf_theme/TAILWIND_CDN_GUIDE.md +274 -0
  292. django_cfg/modules/django_drf_theme/__init__.py +23 -0
  293. django_cfg/modules/django_drf_theme/apps.py +15 -0
  294. django_cfg/modules/django_drf_theme/renderers.py +58 -0
  295. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/api.html +375 -0
  296. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/base.html +938 -0
  297. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/filter_form.html +132 -0
  298. django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/raw_data_form.html +123 -0
  299. django_cfg/modules/django_drf_theme/templatetags/__init__.py +1 -0
  300. django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +57 -0
  301. django_cfg/modules/django_email/__init__.py +14 -0
  302. django_cfg/modules/{django_email.py → django_email/service.py} +78 -113
  303. django_cfg/modules/django_email/utils.py +40 -0
  304. django_cfg/modules/django_health/__init__.py +9 -0
  305. django_cfg/modules/{django_health.py → django_health/service.py} +23 -21
  306. django_cfg/modules/django_llm/llm/client.py +155 -550
  307. django_cfg/modules/django_llm/llm/embeddings/__init__.py +13 -0
  308. django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +106 -0
  309. django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +79 -0
  310. django_cfg/modules/django_llm/llm/models_api/__init__.py +9 -0
  311. django_cfg/modules/django_llm/llm/models_api/models_query.py +163 -0
  312. django_cfg/modules/django_llm/llm/providers/__init__.py +15 -0
  313. django_cfg/modules/django_llm/llm/providers/config_builder.py +103 -0
  314. django_cfg/modules/django_llm/llm/providers/provider_manager.py +148 -0
  315. django_cfg/modules/django_llm/llm/providers/provider_selector.py +60 -0
  316. django_cfg/modules/django_llm/llm/requests/__init__.py +15 -0
  317. django_cfg/modules/django_llm/llm/requests/cache_manager.py +170 -0
  318. django_cfg/modules/django_llm/llm/requests/chat_handler.py +199 -0
  319. django_cfg/modules/django_llm/llm/requests/embedding_handler.py +113 -0
  320. django_cfg/modules/django_llm/llm/responses/__init__.py +9 -0
  321. django_cfg/modules/django_llm/llm/responses/response_builder.py +131 -0
  322. django_cfg/modules/django_llm/llm/stats/__init__.py +9 -0
  323. django_cfg/modules/django_llm/llm/stats/stats_manager.py +107 -0
  324. django_cfg/modules/django_llm/translator/detectors/__init__.py +13 -0
  325. django_cfg/modules/django_llm/translator/detectors/language_detector.py +90 -0
  326. django_cfg/modules/django_llm/translator/detectors/script_detector.py +153 -0
  327. django_cfg/modules/django_llm/translator/stats/__init__.py +11 -0
  328. django_cfg/modules/django_llm/translator/stats/stats_tracker.py +85 -0
  329. django_cfg/modules/django_llm/translator/translator.py +150 -603
  330. django_cfg/modules/django_llm/translator/translators/__init__.py +15 -0
  331. django_cfg/modules/django_llm/translator/translators/json_translator.py +316 -0
  332. django_cfg/modules/django_llm/translator/translators/text_translator.py +139 -0
  333. django_cfg/modules/django_llm/translator/utils/__init__.py +13 -0
  334. django_cfg/modules/django_llm/translator/utils/prompt_builder.py +110 -0
  335. django_cfg/modules/django_llm/translator/utils/text_utils.py +114 -0
  336. django_cfg/modules/django_logging/FIXES_SUMMARY.md +276 -0
  337. django_cfg/modules/django_logging/LOGGING_GUIDE.md +504 -0
  338. django_cfg/modules/django_logging/__init__.py +14 -0
  339. django_cfg/modules/{django_logger.py → django_logging/django_logger.py} +13 -13
  340. django_cfg/modules/{logger.py → django_logging/logger.py} +14 -4
  341. django_cfg/modules/django_ngrok/__init__.py +39 -0
  342. django_cfg/modules/{django_ngrok.py → django_ngrok/service.py} +14 -42
  343. django_cfg/modules/django_rpc_old/POETRY.md +344 -0
  344. django_cfg/modules/django_rpc_old/README.md +397 -0
  345. django_cfg/modules/django_rpc_old/TESTING.md +358 -0
  346. django_cfg/modules/django_rpc_old/__init__.py +39 -0
  347. django_cfg/modules/django_rpc_old/client.py +531 -0
  348. django_cfg/modules/django_rpc_old/config.py +279 -0
  349. django_cfg/modules/django_rpc_old/exceptions.py +172 -0
  350. django_cfg/modules/django_tailwind/README.md +478 -0
  351. django_cfg/modules/django_tailwind/__init__.py +7 -0
  352. django_cfg/modules/django_tailwind/apps.py +10 -0
  353. django_cfg/modules/django_tailwind/templates/django_tailwind/app.html +5 -0
  354. django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +117 -0
  355. django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +124 -0
  356. django_cfg/modules/django_tailwind/templates/django_tailwind/components/theme_toggle.html +54 -0
  357. django_cfg/modules/django_tailwind/templates/django_tailwind/components/user_menu.html +116 -0
  358. django_cfg/modules/django_tailwind/templates/django_tailwind/simple.html +46 -0
  359. django_cfg/modules/django_tailwind/templatetags/__init__.py +1 -0
  360. django_cfg/modules/django_tailwind/templatetags/tailwind_info.py +185 -0
  361. django_cfg/modules/django_tasks/__init__.py +29 -0
  362. django_cfg/modules/django_tasks/factory.py +127 -0
  363. django_cfg/modules/{django_tasks.py → django_tasks/service.py} +45 -274
  364. django_cfg/modules/django_tasks/settings.py +107 -0
  365. django_cfg/modules/django_telegram/__init__.py +29 -0
  366. django_cfg/modules/{django_telegram.py → django_telegram/service.py} +45 -113
  367. django_cfg/modules/django_telegram/utils.py +62 -0
  368. django_cfg/modules/django_twilio/__init__.py +54 -107
  369. django_cfg/modules/django_twilio/_imports.py +30 -0
  370. django_cfg/modules/django_twilio/base.py +192 -0
  371. django_cfg/modules/django_twilio/email_otp.py +227 -0
  372. django_cfg/modules/django_twilio/sendgrid_service.py +1 -1
  373. django_cfg/modules/django_twilio/simple_service.py +1 -2
  374. django_cfg/modules/django_twilio/sms.py +94 -0
  375. django_cfg/modules/django_twilio/twilio_service.py +2 -3
  376. django_cfg/modules/django_twilio/unified.py +310 -0
  377. django_cfg/modules/django_twilio/utils.py +190 -0
  378. django_cfg/modules/django_twilio/whatsapp.py +137 -0
  379. django_cfg/modules/django_unfold/callbacks/base.py +198 -7
  380. django_cfg/modules/django_unfold/callbacks/main.py +102 -10
  381. django_cfg/modules/django_unfold/dashboard.py +65 -43
  382. django_cfg/modules/django_unfold/models/config.py +13 -12
  383. django_cfg/modules/django_unfold/models/navigation.py +8 -3
  384. django_cfg/modules/django_unfold/models/tabs.py +2 -2
  385. django_cfg/modules/django_unfold/templates/unfold/helpers/app_list.html +102 -0
  386. django_cfg/registry/core.py +24 -26
  387. django_cfg/registry/modules.py +5 -2
  388. django_cfg/registry/services.py +20 -3
  389. django_cfg/registry/third_party.py +8 -8
  390. django_cfg/static/admin/css/dashboard.css +260 -0
  391. django_cfg/static/admin/js/commands.js +171 -0
  392. django_cfg/static/admin/js/dashboard.js +126 -0
  393. django_cfg/templates/admin/components/management_commands.js +375 -0
  394. django_cfg/templates/admin/components/progress_bar.html +18 -23
  395. django_cfg/templates/admin/index.html +48 -20
  396. django_cfg/templates/admin/index_new.html +106 -0
  397. django_cfg/templates/admin/layouts/base_dashboard.html +60 -0
  398. django_cfg/templates/admin/layouts/dashboard_with_tabs.html +1 -20
  399. django_cfg/templates/admin/sections/commands_section.html +626 -0
  400. django_cfg/templates/admin/sections/overview_section.html +112 -0
  401. django_cfg/templates/admin/sections/stats_section.html +35 -0
  402. django_cfg/templates/admin/sections/system_section.html +99 -0
  403. django_cfg/templates/admin/snippets/components/CHARTS_GUIDE.md +322 -0
  404. django_cfg/templates/admin/snippets/components/activity_tracker.html +85 -47
  405. django_cfg/templates/admin/snippets/components/charts_section.html +154 -64
  406. django_cfg/templates/admin/snippets/components/django_commands.html +3 -3
  407. django_cfg/templates/admin/snippets/components/recent_activity_improved.html +25 -0
  408. django_cfg/templates/admin/snippets/components/recent_users_table.html +1 -1
  409. django_cfg/templates/admin/snippets/components/system_metrics.html +179 -93
  410. django_cfg/templates/admin/snippets/zones/zones_table.html +2 -2
  411. django_cfg/templatetags/django_cfg.py +7 -1
  412. django_cfg/utils/smart_defaults.py +4 -4
  413. django_cfg-1.4.0.dist-info/METADATA +920 -0
  414. {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/RECORD +425 -196
  415. django_cfg/apps/accounts/utils/auth_email_service.py +0 -84
  416. django_cfg/apps/payments/services/providers/nowpayments/parsers.py +0 -879
  417. django_cfg/core/generation.py +0 -621
  418. django_cfg/management/commands/validate_config.py +0 -189
  419. django_cfg/models/database.py +0 -480
  420. django_cfg/models/drf.py +0 -272
  421. django_cfg/models/ngrok.py +0 -122
  422. django_cfg/models/services.py +0 -440
  423. django_cfg/models/tasks.py +0 -550
  424. django_cfg/modules/django_twilio/service.py +0 -942
  425. django_cfg/template_archive/django_sample.zip +0 -0
  426. django_cfg/templates/rest_framework/api.html +0 -12
  427. django_cfg/utils/toolkit.py +0 -703
  428. django_cfg-1.3.11.dist-info/METADATA +0 -1029
  429. /django_cfg/apps/accounts/management/commands/{test_otp.py → otp_test.py} +0 -0
  430. /django_cfg/core/{environment.py → environment/detector.py} +0 -0
  431. /django_cfg/models/{cors.py → api/cors.py} +0 -0
  432. /django_cfg/models/{jwt.py → api/jwt.py} +0 -0
  433. /django_cfg/models/{base.py → base/config.py} +0 -0
  434. /django_cfg/models/{cfg.py → base/module.py} +0 -0
  435. /django_cfg/models/{revolution.py → django/revolution.py} +0 -0
  436. /django_cfg/modules/{dramatiq_setup.py → django_tasks/dramatiq_setup.py} +0 -0
  437. {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/WHEEL +0 -0
  438. {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/entry_points.txt +0 -0
  439. {django_cfg-1.3.11.dist-info → django_cfg-1.4.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,107 @@
1
+ """
2
+ Statistics manager for LLM client.
3
+
4
+ Tracks requests, cache hits, tokens, costs, and usage patterns.
5
+ """
6
+
7
+ import logging
8
+ from typing import Dict, Any
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ class StatsManager:
14
+ """Manages LLM usage statistics."""
15
+
16
+ def __init__(self):
17
+ """Initialize statistics tracker."""
18
+ self.stats = {
19
+ 'total_requests': 0,
20
+ 'successful_requests': 0,
21
+ 'failed_requests': 0,
22
+ 'cache_hits': 0,
23
+ 'cache_misses': 0,
24
+ 'total_tokens_used': 0,
25
+ 'total_cost_usd': 0.0,
26
+ 'model_usage': {},
27
+ 'provider_usage': {}
28
+ }
29
+
30
+ def record_request(self):
31
+ """Record a new request."""
32
+ self.stats['total_requests'] += 1
33
+
34
+ def record_cache_hit(self):
35
+ """Record cache hit."""
36
+ self.stats['cache_hits'] += 1
37
+
38
+ def record_cache_miss(self):
39
+ """Record cache miss."""
40
+ self.stats['cache_misses'] += 1
41
+
42
+ def record_success(self, tokens: int, cost: float, model: str, provider: str):
43
+ """
44
+ Record successful request.
45
+
46
+ Args:
47
+ tokens: Number of tokens used
48
+ cost: Cost in USD
49
+ model: Model used
50
+ provider: Provider used
51
+ """
52
+ self.stats['successful_requests'] += 1
53
+ self.stats['total_tokens_used'] += tokens
54
+ self.stats['total_cost_usd'] += cost
55
+ self.stats['model_usage'][model] = self.stats['model_usage'].get(model, 0) + 1
56
+ self.stats['provider_usage'][provider] = self.stats['provider_usage'].get(provider, 0) + 1
57
+
58
+ def record_failure(self):
59
+ """Record failed request."""
60
+ self.stats['failed_requests'] += 1
61
+
62
+ def get_stats(self) -> Dict[str, Any]:
63
+ """
64
+ Get copy of statistics.
65
+
66
+ Returns:
67
+ Dictionary with all statistics
68
+ """
69
+ return self.stats.copy()
70
+
71
+ def get_cache_hit_rate(self) -> float:
72
+ """
73
+ Calculate cache hit rate.
74
+
75
+ Returns:
76
+ Cache hit rate as percentage (0-100)
77
+ """
78
+ total_cache_requests = self.stats['cache_hits'] + self.stats['cache_misses']
79
+ if total_cache_requests == 0:
80
+ return 0.0
81
+ return (self.stats['cache_hits'] / total_cache_requests) * 100
82
+
83
+ def get_success_rate(self) -> float:
84
+ """
85
+ Calculate success rate.
86
+
87
+ Returns:
88
+ Success rate as percentage (0-100)
89
+ """
90
+ if self.stats['total_requests'] == 0:
91
+ return 0.0
92
+ return (self.stats['successful_requests'] / self.stats['total_requests']) * 100
93
+
94
+ def reset_stats(self):
95
+ """Reset all statistics to zero."""
96
+ self.stats = {
97
+ 'total_requests': 0,
98
+ 'successful_requests': 0,
99
+ 'failed_requests': 0,
100
+ 'cache_hits': 0,
101
+ 'cache_misses': 0,
102
+ 'total_tokens_used': 0,
103
+ 'total_cost_usd': 0.0,
104
+ 'model_usage': {},
105
+ 'provider_usage': {}
106
+ }
107
+ logger.info("Statistics reset")
@@ -0,0 +1,13 @@
1
+ """
2
+ Language detection modules.
3
+
4
+ Script-based and dictionary-based language detection.
5
+ """
6
+
7
+ from .script_detector import ScriptDetector
8
+ from .language_detector import LanguageDetector
9
+
10
+ __all__ = [
11
+ 'ScriptDetector',
12
+ 'LanguageDetector',
13
+ ]
@@ -0,0 +1,90 @@
1
+ """
2
+ Dictionary-based language detection.
3
+
4
+ Detects language using common word dictionaries.
5
+ """
6
+
7
+ from typing import Optional
8
+
9
+
10
+ class LanguageDetector:
11
+ """Detect language using common word dictionaries."""
12
+
13
+ def __init__(self):
14
+ # Common words for each language
15
+ self.english_words = {
16
+ 'the', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for', 'of',
17
+ 'with', 'by', 'from', 'about', 'into', 'through', 'during', 'before',
18
+ 'after', 'above', 'below', 'up', 'down', 'out', 'off', 'over', 'under',
19
+ 'again', 'further', 'then', 'once', 'here', 'there', 'when', 'where',
20
+ 'why', 'how', 'all', 'any', 'both', 'each', 'few', 'more', 'most',
21
+ 'other', 'some', 'such', 'no', 'nor', 'not', 'only', 'own', 'same',
22
+ 'so', 'than', 'too', 'very', 'can', 'will', 'just', 'should', 'now'
23
+ }
24
+
25
+ self.russian_words = {
26
+ 'и', 'в', 'не', 'на', 'я', 'быть', 'он', 'с', 'что', 'а', 'по',
27
+ 'это', 'она', 'этот', 'к', 'но', 'они', 'мы', 'как', 'из', 'у',
28
+ 'который', 'то', 'за', 'свой', 'от', 'со', 'для', 'о', 'же', 'ты',
29
+ 'все', 'если', 'люди', 'время', 'так', 'его', 'жизнь', 'может',
30
+ 'год', 'только', 'над', 'еще', 'дом', 'после', 'большой', 'должен',
31
+ 'хотеть', 'между'
32
+ }
33
+
34
+ self.spanish_words = {
35
+ 'el', 'la', 'de', 'que', 'y', 'a', 'en', 'un', 'es', 'se', 'no',
36
+ 'te', 'lo', 'le', 'da', 'su', 'por', 'son', 'con', 'para', 'al',
37
+ 'del', 'los', 'las', 'una', 'como', 'pero', 'sus', 'ha', 'me', 'si',
38
+ 'sin', 'sobre', 'este', 'ya', 'entre', 'cuando', 'todo', 'esta',
39
+ 'ser', 'dos', 'también', 'fue', 'había', 'muy', 'hasta', 'desde',
40
+ 'está'
41
+ }
42
+
43
+ self.portuguese_words = {
44
+ 'o', 'a', 'de', 'que', 'e', 'do', 'da', 'em', 'um', 'para', 'é',
45
+ 'com', 'não', 'uma', 'os', 'no', 'se', 'na', 'por', 'mais', 'as',
46
+ 'dos', 'como', 'mas', 'foi', 'ao', 'ele', 'das', 'tem', 'à', 'seu',
47
+ 'sua', 'ou', 'ser', 'quando', 'muito', 'há', 'nos', 'já', 'está',
48
+ 'eu', 'também', 'só', 'pelo', 'pela', 'até', 'isso', 'ela', 'entre',
49
+ 'era', 'depois', 'sem', 'mesmo', 'aos', 'ter', 'seus', 'suas',
50
+ 'numa', 'pelos', 'pelas'
51
+ }
52
+
53
+ def detect_language(self, text: str) -> Optional[str]:
54
+ """
55
+ Detect language of text using common word dictionaries.
56
+
57
+ Args:
58
+ text: Text to analyze
59
+
60
+ Returns:
61
+ Language code or None if detection fails
62
+ """
63
+ if not text or len(text.strip()) < 3:
64
+ return None
65
+
66
+ text_lower = text.lower().strip()
67
+ words = set(text_lower.split())
68
+
69
+ # Count matches for each language
70
+ en_matches = len(words & self.english_words)
71
+ ru_matches = len(words & self.russian_words)
72
+ es_matches = len(words & self.spanish_words)
73
+ pt_matches = len(words & self.portuguese_words)
74
+
75
+ # Find the language with most matches
76
+ max_matches = max(en_matches, ru_matches, es_matches, pt_matches)
77
+
78
+ if max_matches == 0:
79
+ return 'en' # Default to English if no matches
80
+
81
+ if en_matches == max_matches:
82
+ return 'en'
83
+ elif ru_matches == max_matches:
84
+ return 'ru'
85
+ elif es_matches == max_matches:
86
+ return 'es'
87
+ elif pt_matches == max_matches:
88
+ return 'pt'
89
+
90
+ return 'en' # Default fallback
@@ -0,0 +1,153 @@
1
+ """
2
+ Script-based language detection.
3
+
4
+ Detects language based on character scripts (CJK, Cyrillic, etc.).
5
+ """
6
+
7
+ import re
8
+ from typing import Optional
9
+
10
+
11
+ class ScriptDetector:
12
+ """Detect language based on character scripts."""
13
+
14
+ def __init__(self):
15
+ # CJK character ranges for detection
16
+ self.cjk_ranges = [
17
+ (0x4E00, 0x9FFF), # CJK Unified Ideographs
18
+ (0x3400, 0x4DBF), # CJK Extension A
19
+ (0x20000, 0x2A6DF), # CJK Extension B
20
+ (0x2A700, 0x2B73F), # CJK Extension C
21
+ (0x2B740, 0x2B81F), # CJK Extension D
22
+ (0x3040, 0x309F), # Hiragana
23
+ (0x30A0, 0x30FF), # Katakana
24
+ (0xAC00, 0xD7AF), # Hangul Syllables
25
+ ]
26
+
27
+ def detect_language(self, text: str) -> str:
28
+ """
29
+ Detect language of text using character scripts.
30
+
31
+ Args:
32
+ text: Text to analyze
33
+
34
+ Returns:
35
+ Language code (ko, ja, zh, ru, or en)
36
+ """
37
+ if not text or not text.strip():
38
+ return 'unknown'
39
+
40
+ # Clean text for better detection
41
+ cleaned_text = self.clean_text(text)
42
+
43
+ if not cleaned_text:
44
+ return 'unknown'
45
+
46
+ # Check for CJK characters
47
+ if self.contains_cjk(text):
48
+ # Simple CJK detection
49
+ if self.contains_korean(text):
50
+ return 'ko'
51
+ elif self.contains_japanese(text):
52
+ return 'ja'
53
+ else:
54
+ return 'zh' # Default to Chinese for other CJK
55
+
56
+ # Check for Cyrillic (Russian/Ukrainian/Belarusian)
57
+ if self.contains_cyrillic(text):
58
+ return 'ru' # Default to Russian for Cyrillic
59
+
60
+ # Default to English for Latin script
61
+ return 'en'
62
+
63
+ def contains_cjk(self, text: str) -> bool:
64
+ """
65
+ Check if text contains CJK characters.
66
+
67
+ Args:
68
+ text: Text to check
69
+
70
+ Returns:
71
+ True if text contains CJK characters
72
+ """
73
+ for char in text:
74
+ char_code = ord(char)
75
+ for start, end in self.cjk_ranges:
76
+ if start <= char_code <= end:
77
+ return True
78
+ return False
79
+
80
+ def contains_korean(self, text: str) -> bool:
81
+ """
82
+ Check if text contains Korean characters.
83
+
84
+ Args:
85
+ text: Text to check
86
+
87
+ Returns:
88
+ True if text contains Hangul syllables
89
+ """
90
+ for char in text:
91
+ char_code = ord(char)
92
+ if 0xAC00 <= char_code <= 0xD7AF: # Hangul Syllables
93
+ return True
94
+ return False
95
+
96
+ def contains_japanese(self, text: str) -> bool:
97
+ """
98
+ Check if text contains Japanese characters.
99
+
100
+ Args:
101
+ text: Text to check
102
+
103
+ Returns:
104
+ True if text contains Hiragana or Katakana
105
+ """
106
+ for char in text:
107
+ char_code = ord(char)
108
+ if (0x3040 <= char_code <= 0x309F or # Hiragana
109
+ 0x30A0 <= char_code <= 0x30FF): # Katakana
110
+ return True
111
+ return False
112
+
113
+ def contains_cyrillic(self, text: str) -> bool:
114
+ """
115
+ Check if text contains Cyrillic characters.
116
+
117
+ Args:
118
+ text: Text to check
119
+
120
+ Returns:
121
+ True if text contains Cyrillic characters
122
+ """
123
+ for char in text:
124
+ char_code = ord(char)
125
+ if 0x0400 <= char_code <= 0x04FF: # Cyrillic
126
+ return True
127
+ return False
128
+
129
+ @staticmethod
130
+ def clean_text(text: str) -> str:
131
+ """
132
+ Clean text for better language detection.
133
+
134
+ Removes URLs, excessive whitespace, and numbers.
135
+
136
+ Args:
137
+ text: Text to clean
138
+
139
+ Returns:
140
+ Cleaned text
141
+ """
142
+ if not text:
143
+ return ""
144
+
145
+ # Remove excessive whitespace
146
+ text = ' '.join(text.split())
147
+
148
+ # Remove URLs and technical terms
149
+ text = re.sub(r'https?://\S+', '', text)
150
+ text = re.sub(r'www\.\S+', '', text)
151
+ text = re.sub(r'\b\d+\b', '', text) # Remove standalone numbers
152
+
153
+ return text.strip()
@@ -0,0 +1,11 @@
1
+ """
2
+ Statistics tracking for translation.
3
+
4
+ Tracks usage, cache performance, and costs.
5
+ """
6
+
7
+ from .stats_tracker import StatsTracker
8
+
9
+ __all__ = [
10
+ 'StatsTracker',
11
+ ]
@@ -0,0 +1,85 @@
1
+ """
2
+ Translation statistics tracking.
3
+
4
+ Tracks translation usage, cache performance, and costs.
5
+ """
6
+
7
+ from typing import Dict, Any
8
+
9
+
10
+ class StatsTracker:
11
+ """Track translation statistics."""
12
+
13
+ def __init__(self):
14
+ self.stats = {
15
+ 'total_translations': 0,
16
+ 'cache_hits': 0,
17
+ 'cache_misses': 0,
18
+ 'total_tokens_used': 0,
19
+ 'total_cost_usd': 0.0,
20
+ 'language_pairs': {},
21
+ 'successful_translations': 0,
22
+ 'failed_translations': 0
23
+ }
24
+
25
+ def record_translation(
26
+ self,
27
+ source_language: str,
28
+ target_language: str,
29
+ response: Dict[str, Any]
30
+ ):
31
+ """
32
+ Record successful translation.
33
+
34
+ Args:
35
+ source_language: Source language code
36
+ target_language: Target language code
37
+ response: LLM response with tokens_used and cost_usd
38
+ """
39
+ self.stats['total_translations'] += 1
40
+ self.stats['successful_translations'] += 1
41
+
42
+ # Track tokens and cost
43
+ if response.get('tokens_used'):
44
+ self.stats['total_tokens_used'] += response['tokens_used']
45
+ if response.get('cost_usd'):
46
+ self.stats['total_cost_usd'] += response['cost_usd']
47
+
48
+ # Track language pairs
49
+ lang_pair = f"{source_language}-{target_language}"
50
+ self.stats['language_pairs'][lang_pair] = \
51
+ self.stats['language_pairs'].get(lang_pair, 0) + 1
52
+
53
+ def record_cache_hit(self):
54
+ """Record cache hit."""
55
+ self.stats['cache_hits'] += 1
56
+
57
+ def record_cache_miss(self):
58
+ """Record cache miss."""
59
+ self.stats['cache_misses'] += 1
60
+
61
+ def record_failure(self):
62
+ """Record translation failure."""
63
+ self.stats['failed_translations'] += 1
64
+
65
+ def get_stats(self) -> Dict[str, Any]:
66
+ """
67
+ Get translation statistics.
68
+
69
+ Returns:
70
+ Dictionary with statistics
71
+ """
72
+ return self.stats.copy()
73
+
74
+ def reset_stats(self):
75
+ """Reset all statistics to zero."""
76
+ self.stats = {
77
+ 'total_translations': 0,
78
+ 'cache_hits': 0,
79
+ 'cache_misses': 0,
80
+ 'total_tokens_used': 0,
81
+ 'total_cost_usd': 0.0,
82
+ 'language_pairs': {},
83
+ 'successful_translations': 0,
84
+ 'failed_translations': 0
85
+ }