django-cfg 1.1.82__py3-none-any.whl → 1.2.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 (244) hide show
  1. django_cfg/__init__.py +20 -448
  2. django_cfg/apps/accounts/README.md +3 -3
  3. django_cfg/apps/accounts/admin/__init__.py +0 -2
  4. django_cfg/apps/accounts/admin/activity.py +2 -9
  5. django_cfg/apps/accounts/admin/filters.py +0 -42
  6. django_cfg/apps/accounts/admin/inlines.py +8 -8
  7. django_cfg/apps/accounts/admin/otp.py +5 -5
  8. django_cfg/apps/accounts/admin/registration_source.py +1 -8
  9. django_cfg/apps/accounts/admin/user.py +12 -20
  10. django_cfg/apps/accounts/managers/user_manager.py +2 -129
  11. django_cfg/apps/accounts/migrations/0006_remove_twilioresponse_otp_secret_and_more.py +46 -0
  12. django_cfg/apps/accounts/models.py +3 -123
  13. django_cfg/apps/accounts/serializers/otp.py +40 -44
  14. django_cfg/apps/accounts/serializers/profile.py +0 -2
  15. django_cfg/apps/accounts/services/otp_service.py +98 -186
  16. django_cfg/apps/accounts/signals.py +25 -15
  17. django_cfg/apps/accounts/utils/auth_email_service.py +84 -0
  18. django_cfg/apps/accounts/views/otp.py +35 -36
  19. django_cfg/apps/agents/README.md +129 -0
  20. django_cfg/apps/agents/__init__.py +68 -0
  21. django_cfg/apps/agents/admin/__init__.py +17 -0
  22. django_cfg/apps/agents/admin/execution_admin.py +460 -0
  23. django_cfg/apps/agents/admin/registry_admin.py +360 -0
  24. django_cfg/apps/agents/admin/toolsets_admin.py +482 -0
  25. django_cfg/apps/agents/apps.py +29 -0
  26. django_cfg/apps/agents/core/__init__.py +20 -0
  27. django_cfg/apps/agents/core/agent.py +281 -0
  28. django_cfg/apps/agents/core/dependencies.py +154 -0
  29. django_cfg/apps/agents/core/exceptions.py +66 -0
  30. django_cfg/apps/agents/core/models.py +106 -0
  31. django_cfg/apps/agents/core/orchestrator.py +391 -0
  32. django_cfg/apps/agents/examples/__init__.py +3 -0
  33. django_cfg/apps/agents/examples/simple_example.py +161 -0
  34. django_cfg/apps/agents/integration/__init__.py +14 -0
  35. django_cfg/apps/agents/integration/middleware.py +80 -0
  36. django_cfg/apps/agents/integration/registry.py +345 -0
  37. django_cfg/apps/agents/integration/signals.py +50 -0
  38. django_cfg/apps/agents/management/__init__.py +3 -0
  39. django_cfg/apps/agents/management/commands/__init__.py +3 -0
  40. django_cfg/apps/agents/management/commands/create_agent.py +365 -0
  41. django_cfg/apps/agents/management/commands/orchestrator_status.py +191 -0
  42. django_cfg/apps/agents/managers/__init__.py +23 -0
  43. django_cfg/apps/agents/managers/execution.py +236 -0
  44. django_cfg/apps/agents/managers/registry.py +254 -0
  45. django_cfg/apps/agents/managers/toolsets.py +496 -0
  46. django_cfg/apps/agents/migrations/0001_initial.py +286 -0
  47. django_cfg/apps/agents/migrations/__init__.py +5 -0
  48. django_cfg/apps/agents/models/__init__.py +15 -0
  49. django_cfg/apps/agents/models/execution.py +215 -0
  50. django_cfg/apps/agents/models/registry.py +220 -0
  51. django_cfg/apps/agents/models/toolsets.py +305 -0
  52. django_cfg/apps/agents/patterns/__init__.py +24 -0
  53. django_cfg/apps/agents/patterns/content_agents.py +234 -0
  54. django_cfg/apps/agents/toolsets/__init__.py +15 -0
  55. django_cfg/apps/agents/toolsets/cache_toolset.py +285 -0
  56. django_cfg/apps/agents/toolsets/django_toolset.py +220 -0
  57. django_cfg/apps/agents/toolsets/file_toolset.py +324 -0
  58. django_cfg/apps/agents/toolsets/orm_toolset.py +319 -0
  59. django_cfg/apps/agents/urls.py +46 -0
  60. django_cfg/apps/knowbase/README.md +150 -0
  61. django_cfg/apps/knowbase/__init__.py +27 -0
  62. django_cfg/apps/knowbase/admin/__init__.py +23 -0
  63. django_cfg/apps/knowbase/admin/archive_admin.py +857 -0
  64. django_cfg/apps/knowbase/admin/chat_admin.py +386 -0
  65. django_cfg/apps/knowbase/admin/document_admin.py +650 -0
  66. django_cfg/apps/knowbase/admin/external_data_admin.py +685 -0
  67. django_cfg/apps/knowbase/apps.py +81 -0
  68. django_cfg/apps/knowbase/config/README.md +176 -0
  69. django_cfg/apps/knowbase/config/__init__.py +51 -0
  70. django_cfg/apps/knowbase/config/constance_fields.py +186 -0
  71. django_cfg/apps/knowbase/config/constance_settings.py +200 -0
  72. django_cfg/apps/knowbase/config/settings.py +444 -0
  73. django_cfg/apps/knowbase/examples/__init__.py +3 -0
  74. django_cfg/apps/knowbase/examples/external_data_usage.py +191 -0
  75. django_cfg/apps/knowbase/management/__init__.py +0 -0
  76. django_cfg/apps/knowbase/management/commands/__init__.py +0 -0
  77. django_cfg/apps/knowbase/management/commands/knowbase_stats.py +158 -0
  78. django_cfg/apps/knowbase/management/commands/setup_knowbase.py +59 -0
  79. django_cfg/apps/knowbase/managers/__init__.py +22 -0
  80. django_cfg/apps/knowbase/managers/archive.py +426 -0
  81. django_cfg/apps/knowbase/managers/base.py +32 -0
  82. django_cfg/apps/knowbase/managers/chat.py +141 -0
  83. django_cfg/apps/knowbase/managers/document.py +203 -0
  84. django_cfg/apps/knowbase/managers/external_data.py +471 -0
  85. django_cfg/apps/knowbase/migrations/0001_initial.py +427 -0
  86. django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +434 -0
  87. django_cfg/apps/knowbase/migrations/__init__.py +5 -0
  88. django_cfg/apps/knowbase/mixins/__init__.py +15 -0
  89. django_cfg/apps/knowbase/mixins/config.py +108 -0
  90. django_cfg/apps/knowbase/mixins/creator.py +81 -0
  91. django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +199 -0
  92. django_cfg/apps/knowbase/mixins/external_data_mixin.py +813 -0
  93. django_cfg/apps/knowbase/mixins/service.py +362 -0
  94. django_cfg/apps/knowbase/models/__init__.py +41 -0
  95. django_cfg/apps/knowbase/models/archive.py +599 -0
  96. django_cfg/apps/knowbase/models/base.py +58 -0
  97. django_cfg/apps/knowbase/models/chat.py +157 -0
  98. django_cfg/apps/knowbase/models/document.py +267 -0
  99. django_cfg/apps/knowbase/models/external_data.py +376 -0
  100. django_cfg/apps/knowbase/serializers/__init__.py +68 -0
  101. django_cfg/apps/knowbase/serializers/archive_serializers.py +386 -0
  102. django_cfg/apps/knowbase/serializers/chat_serializers.py +137 -0
  103. django_cfg/apps/knowbase/serializers/document_serializers.py +94 -0
  104. django_cfg/apps/knowbase/serializers/external_data_serializers.py +256 -0
  105. django_cfg/apps/knowbase/serializers/public_serializers.py +74 -0
  106. django_cfg/apps/knowbase/services/__init__.py +40 -0
  107. django_cfg/apps/knowbase/services/archive/__init__.py +42 -0
  108. django_cfg/apps/knowbase/services/archive/archive_service.py +541 -0
  109. django_cfg/apps/knowbase/services/archive/chunking_service.py +791 -0
  110. django_cfg/apps/knowbase/services/archive/exceptions.py +52 -0
  111. django_cfg/apps/knowbase/services/archive/extraction_service.py +508 -0
  112. django_cfg/apps/knowbase/services/archive/vectorization_service.py +362 -0
  113. django_cfg/apps/knowbase/services/base.py +53 -0
  114. django_cfg/apps/knowbase/services/chat_service.py +239 -0
  115. django_cfg/apps/knowbase/services/document_service.py +144 -0
  116. django_cfg/apps/knowbase/services/embedding/__init__.py +43 -0
  117. django_cfg/apps/knowbase/services/embedding/async_processor.py +244 -0
  118. django_cfg/apps/knowbase/services/embedding/batch_processor.py +250 -0
  119. django_cfg/apps/knowbase/services/embedding/batch_result.py +61 -0
  120. django_cfg/apps/knowbase/services/embedding/models.py +229 -0
  121. django_cfg/apps/knowbase/services/embedding/processors.py +148 -0
  122. django_cfg/apps/knowbase/services/embedding/utils.py +176 -0
  123. django_cfg/apps/knowbase/services/prompt_builder.py +191 -0
  124. django_cfg/apps/knowbase/services/search_service.py +293 -0
  125. django_cfg/apps/knowbase/signals/__init__.py +21 -0
  126. django_cfg/apps/knowbase/signals/archive_signals.py +211 -0
  127. django_cfg/apps/knowbase/signals/chat_signals.py +37 -0
  128. django_cfg/apps/knowbase/signals/document_signals.py +143 -0
  129. django_cfg/apps/knowbase/signals/external_data_signals.py +157 -0
  130. django_cfg/apps/knowbase/tasks/__init__.py +39 -0
  131. django_cfg/apps/knowbase/tasks/archive_tasks.py +316 -0
  132. django_cfg/apps/knowbase/tasks/document_processing.py +341 -0
  133. django_cfg/apps/knowbase/tasks/external_data_tasks.py +341 -0
  134. django_cfg/apps/knowbase/tasks/maintenance.py +195 -0
  135. django_cfg/apps/knowbase/urls.py +43 -0
  136. django_cfg/apps/knowbase/utils/__init__.py +12 -0
  137. django_cfg/apps/knowbase/utils/chunk_settings.py +261 -0
  138. django_cfg/apps/knowbase/utils/text_processing.py +375 -0
  139. django_cfg/apps/knowbase/utils/validation.py +99 -0
  140. django_cfg/apps/knowbase/views/__init__.py +28 -0
  141. django_cfg/apps/knowbase/views/archive_views.py +469 -0
  142. django_cfg/apps/knowbase/views/base.py +49 -0
  143. django_cfg/apps/knowbase/views/chat_views.py +181 -0
  144. django_cfg/apps/knowbase/views/document_views.py +183 -0
  145. django_cfg/apps/knowbase/views/public_views.py +129 -0
  146. django_cfg/apps/leads/admin.py +70 -0
  147. django_cfg/apps/newsletter/admin.py +234 -0
  148. django_cfg/apps/newsletter/admin_filters.py +124 -0
  149. django_cfg/apps/support/admin.py +196 -0
  150. django_cfg/apps/support/admin_filters.py +71 -0
  151. django_cfg/apps/support/templates/support/chat/ticket_chat.html +1 -1
  152. django_cfg/apps/urls.py +5 -4
  153. django_cfg/cli/README.md +1 -1
  154. django_cfg/cli/commands/create_project.py +2 -2
  155. django_cfg/cli/commands/info.py +1 -1
  156. django_cfg/config.py +44 -0
  157. django_cfg/core/config.py +29 -82
  158. django_cfg/core/environment.py +1 -1
  159. django_cfg/core/generation.py +19 -107
  160. django_cfg/{integration.py → core/integration.py} +18 -16
  161. django_cfg/core/validation.py +1 -1
  162. django_cfg/management/__init__.py +1 -1
  163. django_cfg/management/commands/__init__.py +1 -1
  164. django_cfg/management/commands/auto_generate.py +482 -0
  165. django_cfg/management/commands/migrator.py +19 -101
  166. django_cfg/management/commands/test_email.py +1 -1
  167. django_cfg/middleware/README.md +0 -158
  168. django_cfg/middleware/__init__.py +0 -2
  169. django_cfg/middleware/user_activity.py +3 -3
  170. django_cfg/models/api.py +145 -0
  171. django_cfg/models/base.py +287 -0
  172. django_cfg/models/cache.py +4 -4
  173. django_cfg/models/constance.py +25 -88
  174. django_cfg/models/database.py +9 -9
  175. django_cfg/models/drf.py +3 -36
  176. django_cfg/models/email.py +163 -0
  177. django_cfg/models/environment.py +276 -0
  178. django_cfg/models/limits.py +1 -1
  179. django_cfg/models/logging.py +366 -0
  180. django_cfg/models/revolution.py +41 -2
  181. django_cfg/models/security.py +125 -0
  182. django_cfg/models/services.py +1 -1
  183. django_cfg/modules/__init__.py +2 -56
  184. django_cfg/modules/base.py +78 -52
  185. django_cfg/modules/django_currency/service.py +2 -2
  186. django_cfg/modules/django_email.py +2 -2
  187. django_cfg/modules/django_health.py +267 -0
  188. django_cfg/modules/django_llm/llm/client.py +79 -17
  189. django_cfg/modules/django_llm/translator/translator.py +2 -2
  190. django_cfg/modules/django_logger.py +2 -2
  191. django_cfg/modules/django_ngrok.py +2 -2
  192. django_cfg/modules/django_tasks.py +68 -3
  193. django_cfg/modules/django_telegram.py +3 -3
  194. django_cfg/modules/django_twilio/sendgrid_service.py +2 -2
  195. django_cfg/modules/django_twilio/service.py +2 -2
  196. django_cfg/modules/django_twilio/simple_service.py +2 -2
  197. django_cfg/modules/django_twilio/twilio_service.py +2 -2
  198. django_cfg/modules/django_unfold/__init__.py +69 -0
  199. django_cfg/modules/{unfold → django_unfold}/callbacks.py +23 -22
  200. django_cfg/modules/django_unfold/dashboard.py +278 -0
  201. django_cfg/modules/django_unfold/icons/README.md +145 -0
  202. django_cfg/modules/django_unfold/icons/__init__.py +12 -0
  203. django_cfg/modules/django_unfold/icons/constants.py +2851 -0
  204. django_cfg/modules/django_unfold/icons/generate_icons.py +486 -0
  205. django_cfg/modules/django_unfold/models/__init__.py +42 -0
  206. django_cfg/modules/django_unfold/models/config.py +601 -0
  207. django_cfg/modules/django_unfold/models/dashboard.py +206 -0
  208. django_cfg/modules/django_unfold/models/dropdown.py +40 -0
  209. django_cfg/modules/django_unfold/models/navigation.py +73 -0
  210. django_cfg/modules/django_unfold/models/tabs.py +25 -0
  211. django_cfg/modules/{unfold → django_unfold}/system_monitor.py +2 -2
  212. django_cfg/modules/django_unfold/utils.py +140 -0
  213. django_cfg/registry/__init__.py +23 -0
  214. django_cfg/registry/core.py +61 -0
  215. django_cfg/registry/exceptions.py +11 -0
  216. django_cfg/registry/modules.py +12 -0
  217. django_cfg/registry/services.py +26 -0
  218. django_cfg/registry/third_party.py +52 -0
  219. django_cfg/routing/__init__.py +19 -0
  220. django_cfg/routing/callbacks.py +198 -0
  221. django_cfg/routing/routers.py +48 -0
  222. django_cfg/templates/admin/layouts/dashboard_with_tabs.html +8 -9
  223. django_cfg/templatetags/__init__.py +0 -0
  224. django_cfg/templatetags/django_cfg.py +33 -0
  225. django_cfg/urls.py +33 -0
  226. django_cfg/utils/path_resolution.py +1 -1
  227. django_cfg/utils/smart_defaults.py +7 -61
  228. django_cfg/utils/toolkit.py +663 -0
  229. {django_cfg-1.1.82.dist-info → django_cfg-1.2.0.dist-info}/METADATA +83 -86
  230. django_cfg-1.2.0.dist-info/RECORD +441 -0
  231. django_cfg/archive/django_sample.zip +0 -0
  232. django_cfg/models/unfold.py +0 -271
  233. django_cfg/modules/unfold/__init__.py +0 -29
  234. django_cfg/modules/unfold/dashboard.py +0 -318
  235. django_cfg/pyproject.toml +0 -370
  236. django_cfg/routers.py +0 -83
  237. django_cfg-1.1.82.dist-info/RECORD +0 -278
  238. /django_cfg/{exceptions.py → core/exceptions.py} +0 -0
  239. /django_cfg/modules/{unfold → django_unfold}/models.py +0 -0
  240. /django_cfg/modules/{unfold → django_unfold}/tailwind.py +0 -0
  241. /django_cfg/{version_check.py → utils/version_check.py} +0 -0
  242. {django_cfg-1.1.82.dist-info → django_cfg-1.2.0.dist-info}/WHEEL +0 -0
  243. {django_cfg-1.1.82.dist-info → django_cfg-1.2.0.dist-info}/entry_points.txt +0 -0
  244. {django_cfg-1.1.82.dist-info → django_cfg-1.2.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,427 @@
1
+ # Generated by Django 5.2.6 on 2025-09-16 18:23
2
+
3
+ import django.db.models.deletion
4
+ import pgvector.django.vector
5
+ import uuid
6
+ from django.conf import settings
7
+ from django.db import migrations, models
8
+
9
+
10
+ class Migration(migrations.Migration):
11
+ initial = True
12
+
13
+ dependencies = [
14
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
15
+ ]
16
+
17
+ operations = [
18
+ migrations.CreateModel(
19
+ name="ChatSession",
20
+ fields=[
21
+ (
22
+ "id",
23
+ models.UUIDField(
24
+ default=uuid.uuid4,
25
+ editable=False,
26
+ primary_key=True,
27
+ serialize=False,
28
+ ),
29
+ ),
30
+ ("created_at", models.DateTimeField(auto_now_add=True, db_index=True)),
31
+ ("updated_at", models.DateTimeField(auto_now=True)),
32
+ (
33
+ "title",
34
+ models.CharField(
35
+ blank=True,
36
+ help_text="Session title (auto-generated if empty)",
37
+ max_length=255,
38
+ ),
39
+ ),
40
+ (
41
+ "is_active",
42
+ models.BooleanField(
43
+ default=True, help_text="Whether session accepts new messages"
44
+ ),
45
+ ),
46
+ ("messages_count", models.PositiveIntegerField(default=0)),
47
+ ("total_tokens_used", models.PositiveIntegerField(default=0)),
48
+ (
49
+ "total_cost_usd",
50
+ models.DecimalField(
51
+ decimal_places=6,
52
+ default=0.0,
53
+ help_text="Total session cost for monitoring",
54
+ max_digits=10,
55
+ ),
56
+ ),
57
+ (
58
+ "model_name",
59
+ models.CharField(
60
+ default="openai/gpt-4o-mini",
61
+ help_text="LLM model used for this session",
62
+ max_length=100,
63
+ ),
64
+ ),
65
+ (
66
+ "temperature",
67
+ models.FloatField(
68
+ default=0.7, help_text="Temperature setting for LLM"
69
+ ),
70
+ ),
71
+ (
72
+ "max_context_chunks",
73
+ models.PositiveIntegerField(
74
+ default=5, help_text="Maximum chunks to include in context"
75
+ ),
76
+ ),
77
+ (
78
+ "user",
79
+ models.ForeignKey(
80
+ help_text="Owner of this record",
81
+ on_delete=django.db.models.deletion.CASCADE,
82
+ to=settings.AUTH_USER_MODEL,
83
+ ),
84
+ ),
85
+ ],
86
+ options={
87
+ "db_table": "django_cfg_knowbase_chat_sessions",
88
+ },
89
+ ),
90
+ migrations.CreateModel(
91
+ name="ChatMessage",
92
+ fields=[
93
+ (
94
+ "id",
95
+ models.UUIDField(
96
+ default=uuid.uuid4,
97
+ editable=False,
98
+ primary_key=True,
99
+ serialize=False,
100
+ ),
101
+ ),
102
+ ("created_at", models.DateTimeField(auto_now_add=True, db_index=True)),
103
+ ("updated_at", models.DateTimeField(auto_now=True)),
104
+ (
105
+ "role",
106
+ models.CharField(
107
+ choices=[
108
+ ("user", "User"),
109
+ ("assistant", "Assistant"),
110
+ ("system", "System"),
111
+ ],
112
+ help_text="Message sender role",
113
+ max_length=10,
114
+ ),
115
+ ),
116
+ ("content", models.TextField(help_text="Message content")),
117
+ (
118
+ "context_chunks",
119
+ models.JSONField(
120
+ default=list, help_text="IDs of chunks used for context"
121
+ ),
122
+ ),
123
+ (
124
+ "tokens_used",
125
+ models.PositiveIntegerField(
126
+ default=0, help_text="Tokens used for this message"
127
+ ),
128
+ ),
129
+ (
130
+ "cost_usd",
131
+ models.DecimalField(
132
+ decimal_places=6,
133
+ default=0.0,
134
+ help_text="Cost in USD for this message",
135
+ max_digits=10,
136
+ ),
137
+ ),
138
+ (
139
+ "processing_time_ms",
140
+ models.PositiveIntegerField(
141
+ default=0, help_text="Processing time in milliseconds"
142
+ ),
143
+ ),
144
+ (
145
+ "model_name",
146
+ models.CharField(
147
+ blank=True,
148
+ help_text="Model used for response generation",
149
+ max_length=100,
150
+ ),
151
+ ),
152
+ (
153
+ "finish_reason",
154
+ models.CharField(
155
+ blank=True,
156
+ help_text="Why the model stopped generating",
157
+ max_length=20,
158
+ ),
159
+ ),
160
+ (
161
+ "user",
162
+ models.ForeignKey(
163
+ help_text="Owner of this record",
164
+ on_delete=django.db.models.deletion.CASCADE,
165
+ to=settings.AUTH_USER_MODEL,
166
+ ),
167
+ ),
168
+ (
169
+ "session",
170
+ models.ForeignKey(
171
+ help_text="Parent chat session",
172
+ on_delete=django.db.models.deletion.CASCADE,
173
+ related_name="messages",
174
+ to="django_cfg_knowbase.chatsession",
175
+ ),
176
+ ),
177
+ ],
178
+ options={
179
+ "db_table": "django_cfg_knowbase_chat_messages",
180
+ "ordering": ["created_at"],
181
+ },
182
+ ),
183
+ migrations.CreateModel(
184
+ name="Document",
185
+ fields=[
186
+ (
187
+ "id",
188
+ models.UUIDField(
189
+ default=uuid.uuid4,
190
+ editable=False,
191
+ primary_key=True,
192
+ serialize=False,
193
+ ),
194
+ ),
195
+ ("created_at", models.DateTimeField(auto_now_add=True, db_index=True)),
196
+ ("updated_at", models.DateTimeField(auto_now=True)),
197
+ ("title", models.CharField(help_text="Document title", max_length=512)),
198
+ ("content", models.TextField(help_text="Full document content")),
199
+ (
200
+ "content_hash",
201
+ models.CharField(
202
+ db_index=True,
203
+ help_text="SHA-256 hash for duplicate detection",
204
+ max_length=64,
205
+ ),
206
+ ),
207
+ (
208
+ "file_type",
209
+ models.CharField(
210
+ default="text/plain",
211
+ help_text="MIME type of original file",
212
+ max_length=100,
213
+ ),
214
+ ),
215
+ (
216
+ "file_size",
217
+ models.PositiveIntegerField(
218
+ default=0, help_text="Original file size in bytes"
219
+ ),
220
+ ),
221
+ (
222
+ "processing_status",
223
+ models.CharField(
224
+ choices=[
225
+ ("pending", "Pending"),
226
+ ("processing", "Processing"),
227
+ ("completed", "Completed"),
228
+ ("failed", "Failed"),
229
+ ("cancelled", "Cancelled"),
230
+ ],
231
+ db_index=True,
232
+ default="pending",
233
+ max_length=20,
234
+ ),
235
+ ),
236
+ ("processing_started_at", models.DateTimeField(blank=True, null=True)),
237
+ (
238
+ "processing_completed_at",
239
+ models.DateTimeField(blank=True, null=True),
240
+ ),
241
+ ("processing_error", models.TextField(blank=True, default="")),
242
+ ("chunks_count", models.PositiveIntegerField(default=0)),
243
+ ("total_tokens", models.PositiveIntegerField(default=0)),
244
+ (
245
+ "total_cost_usd",
246
+ models.DecimalField(
247
+ decimal_places=6,
248
+ default=0.0,
249
+ help_text="Total processing cost in USD",
250
+ max_digits=10,
251
+ ),
252
+ ),
253
+ (
254
+ "metadata",
255
+ models.JSONField(
256
+ default=dict, help_text="Additional document metadata"
257
+ ),
258
+ ),
259
+ (
260
+ "user",
261
+ models.ForeignKey(
262
+ help_text="Owner of this record",
263
+ on_delete=django.db.models.deletion.CASCADE,
264
+ to=settings.AUTH_USER_MODEL,
265
+ ),
266
+ ),
267
+ ],
268
+ options={
269
+ "db_table": "django_cfg_knowbase_documents",
270
+ },
271
+ ),
272
+ migrations.CreateModel(
273
+ name="DocumentChunk",
274
+ fields=[
275
+ (
276
+ "id",
277
+ models.UUIDField(
278
+ default=uuid.uuid4,
279
+ editable=False,
280
+ primary_key=True,
281
+ serialize=False,
282
+ ),
283
+ ),
284
+ ("created_at", models.DateTimeField(auto_now_add=True, db_index=True)),
285
+ ("updated_at", models.DateTimeField(auto_now=True)),
286
+ ("content", models.TextField(help_text="Chunk text content")),
287
+ (
288
+ "chunk_index",
289
+ models.PositiveIntegerField(
290
+ help_text="Sequential chunk number within document"
291
+ ),
292
+ ),
293
+ (
294
+ "embedding",
295
+ pgvector.django.vector.VectorField(
296
+ dimensions=1536,
297
+ help_text="Vector embedding for semantic search",
298
+ ),
299
+ ),
300
+ (
301
+ "token_count",
302
+ models.PositiveIntegerField(
303
+ default=0, help_text="Number of tokens in chunk"
304
+ ),
305
+ ),
306
+ (
307
+ "character_count",
308
+ models.PositiveIntegerField(
309
+ default=0, help_text="Number of characters in chunk"
310
+ ),
311
+ ),
312
+ (
313
+ "embedding_model",
314
+ models.CharField(
315
+ default="text-embedding-ada-002",
316
+ help_text="Model used for embedding generation",
317
+ max_length=100,
318
+ ),
319
+ ),
320
+ (
321
+ "embedding_cost",
322
+ models.DecimalField(
323
+ decimal_places=6,
324
+ default=0.0,
325
+ help_text="Cost in USD for embedding generation",
326
+ max_digits=10,
327
+ ),
328
+ ),
329
+ (
330
+ "metadata",
331
+ models.JSONField(default=dict, help_text="Chunk-specific metadata"),
332
+ ),
333
+ (
334
+ "document",
335
+ models.ForeignKey(
336
+ help_text="Parent document",
337
+ on_delete=django.db.models.deletion.CASCADE,
338
+ related_name="chunks",
339
+ to="django_cfg_knowbase.document",
340
+ ),
341
+ ),
342
+ (
343
+ "user",
344
+ models.ForeignKey(
345
+ help_text="Owner of this record",
346
+ on_delete=django.db.models.deletion.CASCADE,
347
+ to=settings.AUTH_USER_MODEL,
348
+ ),
349
+ ),
350
+ ],
351
+ options={
352
+ "db_table": "django_cfg_knowbase_document_chunks",
353
+ "ordering": ["document", "chunk_index"],
354
+ },
355
+ ),
356
+ migrations.AddIndex(
357
+ model_name="chatsession",
358
+ index=models.Index(
359
+ fields=["user", "-created_at"], name="django_cfg_knowbase_ch_user_id_227a9f_idx"
360
+ ),
361
+ ),
362
+ migrations.AddIndex(
363
+ model_name="chatsession",
364
+ index=models.Index(
365
+ fields=["is_active"], name="django_cfg_knowbase_ch_is_acti_6fcdc8_idx"
366
+ ),
367
+ ),
368
+ migrations.AddIndex(
369
+ model_name="chatmessage",
370
+ index=models.Index(
371
+ fields=["session", "-created_at"], name="django_cfg_knowbase_ch_session_782e67_idx"
372
+ ),
373
+ ),
374
+ migrations.AddIndex(
375
+ model_name="chatmessage",
376
+ index=models.Index(fields=["role"], name="django_cfg_knowbase_ch_role_e0d53e_idx"),
377
+ ),
378
+ migrations.AddIndex(
379
+ model_name="chatmessage",
380
+ index=models.Index(
381
+ fields=["-created_at"], name="django_cfg_knowbase_ch_created_49bad9_idx"
382
+ ),
383
+ ),
384
+ migrations.AddIndex(
385
+ model_name="document",
386
+ index=models.Index(
387
+ fields=["user", "processing_status"],
388
+ name="django_cfg_knowbase_do_user_id_3f12df_idx",
389
+ ),
390
+ ),
391
+ migrations.AddIndex(
392
+ model_name="document",
393
+ index=models.Index(
394
+ fields=["content_hash"], name="django_cfg_knowbase_do_content_0655c8_idx"
395
+ ),
396
+ ),
397
+ migrations.AddIndex(
398
+ model_name="document",
399
+ index=models.Index(
400
+ fields=["-processing_completed_at"],
401
+ name="django_cfg_knowbase_do_process_f2c2a8_idx",
402
+ ),
403
+ ),
404
+ migrations.AddConstraint(
405
+ model_name="document",
406
+ constraint=models.UniqueConstraint(
407
+ fields=("user", "content_hash"), name="unique_user_document"
408
+ ),
409
+ ),
410
+ migrations.AddIndex(
411
+ model_name="documentchunk",
412
+ index=models.Index(fields=["user"], name="django_cfg_knowbase_do_user_id_a4e4de_idx"),
413
+ ),
414
+ migrations.AddIndex(
415
+ model_name="documentchunk",
416
+ index=models.Index(
417
+ fields=["document", "chunk_index"],
418
+ name="django_cfg_knowbase_do_documen_64aaaa_idx",
419
+ ),
420
+ ),
421
+ migrations.AddConstraint(
422
+ model_name="documentchunk",
423
+ constraint=models.UniqueConstraint(
424
+ fields=("document", "chunk_index"), name="unique_document_chunk"
425
+ ),
426
+ ),
427
+ ]