django-cfg 1.2.0__py3-none-any.whl → 1.2.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +1 -1
- django_cfg/apps/accounts/views/otp.py +9 -0
- django_cfg/apps/knowbase/config/settings.py +8 -2
- django_cfg/apps/knowbase/services/chat_service.py +11 -11
- django_cfg/apps/tasks/views.py +13 -0
- django_cfg/modules/django_llm/llm/client.py +12 -2
- {django_cfg-1.2.0.dist-info → django_cfg-1.2.2.dist-info}/METADATA +1 -1
- {django_cfg-1.2.0.dist-info → django_cfg-1.2.2.dist-info}/RECORD +11 -11
- {django_cfg-1.2.0.dist-info → django_cfg-1.2.2.dist-info}/WHEEL +0 -0
- {django_cfg-1.2.0.dist-info → django_cfg-1.2.2.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.2.0.dist-info → django_cfg-1.2.2.dist-info}/licenses/LICENSE +0 -0
django_cfg/__init__.py
CHANGED
@@ -24,6 +24,15 @@ class OTPViewSet(viewsets.GenericViewSet):
|
|
24
24
|
"""OTP authentication ViewSet with nested router support."""
|
25
25
|
|
26
26
|
permission_classes = [permissions.AllowAny]
|
27
|
+
serializer_class = OTPRequestSerializer # Default serializer for the viewset
|
28
|
+
|
29
|
+
def get_serializer_class(self):
|
30
|
+
"""Return the appropriate serializer class based on the action."""
|
31
|
+
if self.action == 'request_otp':
|
32
|
+
return OTPRequestSerializer
|
33
|
+
elif self.action == 'verify_otp':
|
34
|
+
return OTPVerifySerializer
|
35
|
+
return super().get_serializer_class()
|
27
36
|
|
28
37
|
@extend_schema(
|
29
38
|
request=OTPRequestSerializer,
|
@@ -75,12 +75,18 @@ class EmbeddingConfig(BaseModel):
|
|
75
75
|
@property
|
76
76
|
def openai_api_key(self) -> Optional[str]:
|
77
77
|
"""Get OpenAI API key from environment configuration."""
|
78
|
-
|
78
|
+
try:
|
79
|
+
return settings.api_keys.openai
|
80
|
+
except AttributeError:
|
81
|
+
return os.getenv("OPENAI_API_KEY")
|
79
82
|
|
80
83
|
@property
|
81
84
|
def openrouter_api_key(self) -> Optional[str]:
|
82
85
|
"""Get OpenRouter API key from environment configuration."""
|
83
|
-
|
86
|
+
try:
|
87
|
+
return settings.api_keys.openrouter
|
88
|
+
except AttributeError:
|
89
|
+
return os.getenv("OPENROUTER_API_KEY")
|
84
90
|
|
85
91
|
|
86
92
|
class ChunkingConfig(BaseModel):
|
@@ -109,17 +109,17 @@ class ChatService(BaseService):
|
|
109
109
|
session=session,
|
110
110
|
user=self.user,
|
111
111
|
role=ChatMessage.MessageRole.ASSISTANT,
|
112
|
-
content=response.
|
113
|
-
tokens_used=response.
|
114
|
-
cost_usd=response.
|
115
|
-
processing_time_ms=int(response.
|
112
|
+
content=response.content,
|
113
|
+
tokens_used=response.tokens_used,
|
114
|
+
cost_usd=response.cost_usd,
|
115
|
+
processing_time_ms=int(response.processing_time * 1000),
|
116
116
|
model_name=session.model_name,
|
117
|
-
finish_reason=response.
|
117
|
+
finish_reason=response.finish_reason
|
118
118
|
)
|
119
119
|
|
120
120
|
# Update session statistics (messages_count is handled by signals)
|
121
|
-
session.total_tokens_used += response.
|
122
|
-
session.total_cost_usd = safe_float(session.total_cost_usd, 0.0) + safe_float(response.
|
121
|
+
session.total_tokens_used += response.tokens_used
|
122
|
+
session.total_cost_usd = safe_float(session.total_cost_usd, 0.0) + safe_float(response.cost_usd, 0.0)
|
123
123
|
session.save()
|
124
124
|
|
125
125
|
# Auto-generate session title if empty
|
@@ -129,10 +129,10 @@ class ChatService(BaseService):
|
|
129
129
|
|
130
130
|
result = {
|
131
131
|
'message_id': str(assistant_message.id),
|
132
|
-
'content': response.
|
133
|
-
'tokens_used': response.
|
134
|
-
'cost_usd': safe_float(response.
|
135
|
-
'processing_time_ms': int(response.
|
132
|
+
'content': response.content,
|
133
|
+
'tokens_used': response.tokens_used,
|
134
|
+
'cost_usd': safe_float(response.cost_usd, 0.0),
|
135
|
+
'processing_time_ms': int(response.processing_time * 1000),
|
136
136
|
'model_used': session.model_name
|
137
137
|
}
|
138
138
|
|
django_cfg/apps/tasks/views.py
CHANGED
@@ -36,6 +36,19 @@ class TaskManagementViewSet(viewsets.GenericViewSet):
|
|
36
36
|
|
37
37
|
authentication_classes = [SessionAuthentication, BasicAuthentication]
|
38
38
|
permission_classes = [IsAdminUser]
|
39
|
+
serializer_class = APIResponseSerializer # Default serializer for the viewset
|
40
|
+
|
41
|
+
def get_serializer_class(self):
|
42
|
+
"""Return the appropriate serializer class based on the action."""
|
43
|
+
if self.action == 'queue_status':
|
44
|
+
return QueueStatusSerializer
|
45
|
+
elif self.action == 'queue_manage':
|
46
|
+
return QueueActionSerializer
|
47
|
+
elif self.action == 'worker_manage':
|
48
|
+
return WorkerActionSerializer
|
49
|
+
elif self.action == 'task_statistics':
|
50
|
+
return TaskStatisticsSerializer
|
51
|
+
return super().get_serializer_class()
|
39
52
|
|
40
53
|
def get_tasks_service(self):
|
41
54
|
"""Get DjangoTasks service instance."""
|
@@ -253,6 +253,11 @@ class LLMClient(BaseCfgModule):
|
|
253
253
|
if model is None:
|
254
254
|
model = self.default_models[self.primary_provider]
|
255
255
|
|
256
|
+
# For OpenAI, remove provider prefix if present
|
257
|
+
api_model = model
|
258
|
+
if self.primary_provider == "openai" and model.startswith("openai/"):
|
259
|
+
api_model = model.replace("openai/", "")
|
260
|
+
|
256
261
|
# Generate cache key
|
257
262
|
request_hash = self.cache.generate_request_hash(
|
258
263
|
messages=messages,
|
@@ -283,7 +288,7 @@ class LLMClient(BaseCfgModule):
|
|
283
288
|
try:
|
284
289
|
# Prepare parameters
|
285
290
|
params = {
|
286
|
-
"model":
|
291
|
+
"model": api_model,
|
287
292
|
"messages": messages,
|
288
293
|
"stream": False
|
289
294
|
}
|
@@ -573,9 +578,14 @@ class LLMClient(BaseCfgModule):
|
|
573
578
|
else:
|
574
579
|
# Use real OpenAI embedding API
|
575
580
|
embedding_client = self.clients[embedding_provider]
|
581
|
+
# For OpenAI, remove provider prefix if present
|
582
|
+
api_model = model
|
583
|
+
if embedding_provider == "openai" and model.startswith("openai/"):
|
584
|
+
api_model = model.replace("openai/", "")
|
585
|
+
|
576
586
|
response = embedding_client.embeddings.create(
|
577
587
|
input=text,
|
578
|
-
model=
|
588
|
+
model=api_model
|
579
589
|
)
|
580
590
|
|
581
591
|
# Extract embedding data
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: django-cfg
|
3
|
-
Version: 1.2.
|
3
|
+
Version: 1.2.2
|
4
4
|
Summary: 🚀 Production-ready Django configuration framework with type-safe settings, smart automation, and modern developer experience
|
5
5
|
Project-URL: Homepage, https://github.com/markolofsen/django-cfg
|
6
6
|
Project-URL: Documentation, https://django-cfg.readthedocs.io
|
@@ -1,5 +1,5 @@
|
|
1
1
|
django_cfg/README.md,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
django_cfg/__init__.py,sha256=
|
2
|
+
django_cfg/__init__.py,sha256=vaV1dOHjmG0bQG8EVAfNGOmb37ySIF-WZ33RKip8VHI,1630
|
3
3
|
django_cfg/apps.py,sha256=k84brkeXJI7EgKZLEpTkM9YFZofKI4PzhFOn1cl9Msc,1656
|
4
4
|
django_cfg/config.py,sha256=0cuRJVEnf03WzvEqhwzLvn9Zi1805C5KG1yk27ekABA,1190
|
5
5
|
django_cfg/urls.py,sha256=bpRFjMonQuk4UCUMxx4ueBX3YDNB7HXKFwEghQ3KR3o,793
|
@@ -47,7 +47,7 @@ django_cfg/apps/accounts/templates/emails/welcome_email.txt,sha256=jVIr4O9_jOOSU
|
|
47
47
|
django_cfg/apps/accounts/utils/auth_email_service.py,sha256=LMneikyFUH4oTnpg8p77sTh4_-nM7Yp8xvZri4zfhG4,3179
|
48
48
|
django_cfg/apps/accounts/utils/notifications.py,sha256=G_EOQe6JFqYvPVooFXJUcF5YvLx8Lnd_GMLfFwKTLiI,24914
|
49
49
|
django_cfg/apps/accounts/views/__init__.py,sha256=mQRa06_tfIkemXL2MMa05Yj2w1G3pbu2VjC7h4ZE1TI,239
|
50
|
-
django_cfg/apps/accounts/views/otp.py,sha256=
|
50
|
+
django_cfg/apps/accounts/views/otp.py,sha256=w5bKHe_fojKyK8PSUf8XqmB-DyKn8JcvgCo6Qh0J82U,6756
|
51
51
|
django_cfg/apps/accounts/views/profile.py,sha256=9fNXLK5d98a7jT3ZbkVyh3KzzUTm414P45ybZZeba0Y,5418
|
52
52
|
django_cfg/apps/accounts/views/webhook.py,sha256=hGe8f59HvKi6lKXymPxfT1_s4BaeZjrsPnlQI4Yx_tE,10756
|
53
53
|
django_cfg/apps/agents/README.md,sha256=CTK46bM6AgxoV8AkoH_t6HkGI6OUduL0oqrseQTCFeQ,3077
|
@@ -111,7 +111,7 @@ django_cfg/apps/knowbase/config/README.md,sha256=9Uv6bzBQhBIRffT4MykroIcG472oUTE
|
|
111
111
|
django_cfg/apps/knowbase/config/__init__.py,sha256=IArKoqnqUClMMkLvAs82bRZVTH5KVRID0BXq11lu-1A,1790
|
112
112
|
django_cfg/apps/knowbase/config/constance_fields.py,sha256=RpkNE7dy8bfLP81HgHKOiEGrHKTFU87oGjApua9SC94,8193
|
113
113
|
django_cfg/apps/knowbase/config/constance_settings.py,sha256=KjxlHb3btxRyEYoOO-d_vW2glcy5cHp5cj4uWHg8-W0,7564
|
114
|
-
django_cfg/apps/knowbase/config/settings.py,sha256=
|
114
|
+
django_cfg/apps/knowbase/config/settings.py,sha256=X_h0MXId6ZFwZ19dizp5OGDZfmNmCJW9YEu6DOVFLPE,13295
|
115
115
|
django_cfg/apps/knowbase/examples/__init__.py,sha256=-uJe4FFA9h8DAg17HYI-7U10_zfH07dYL4ET1Ntq40o,81
|
116
116
|
django_cfg/apps/knowbase/examples/external_data_usage.py,sha256=bUaIBkUkeucdPQGyYDVY_lpZ1wcA_voK7uVPiskxebo,6398
|
117
117
|
django_cfg/apps/knowbase/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -147,7 +147,7 @@ django_cfg/apps/knowbase/serializers/external_data_serializers.py,sha256=llmlL3b
|
|
147
147
|
django_cfg/apps/knowbase/serializers/public_serializers.py,sha256=KpSWMxFzZSSvwiUEcT73ugN-SD5-v0bbTubFRjg6CYs,2601
|
148
148
|
django_cfg/apps/knowbase/services/__init__.py,sha256=wxAuV717CRGneC01qJs_-1c6OOhCLRtZ2iqCuJN4w9w,791
|
149
149
|
django_cfg/apps/knowbase/services/base.py,sha256=ZZRdFWRyz8MQeTLaXIgyAdus5VzzUZ0l4ki-NEInPGA,1927
|
150
|
-
django_cfg/apps/knowbase/services/chat_service.py,sha256=
|
150
|
+
django_cfg/apps/knowbase/services/chat_service.py,sha256=f3QF8D7JAJ1AzUHTrKRE21XkNagjep_o57eSFOZbo1M,8273
|
151
151
|
django_cfg/apps/knowbase/services/document_service.py,sha256=pzBqQO0eOkH5xpFEO33qlEBMge_fq7vJjzVEi3CuymE,5009
|
152
152
|
django_cfg/apps/knowbase/services/prompt_builder.py,sha256=WWkUR9r3tPe8-6f-gxFsFR5YUbYuhBjiep-G_hI0vnQ,7428
|
153
153
|
django_cfg/apps/knowbase/services/search_service.py,sha256=7r4oXY9453YVcCwqH9_xW8HFlv6CPfYlqBFXLxtl6bw,11174
|
@@ -257,7 +257,7 @@ django_cfg/apps/tasks/admin.py,sha256=_P_JJgoPGS4cGjq6P-Pgj7E8ncsQ3nkeieB8D_EVDG
|
|
257
257
|
django_cfg/apps/tasks/apps.py,sha256=WXQvQjFVBuiO7s1ikd4Sf15YKRTvruVzMTo82uNXY08,383
|
258
258
|
django_cfg/apps/tasks/serializers.py,sha256=o323j6bmeNAVCu-FA3Jrve2tLuFOHMgkfXgZUdsTuS8,2751
|
259
259
|
django_cfg/apps/tasks/urls.py,sha256=NwEk6Vjq_ETEzzbx6R-9Qv3EbCxmX31xfzLICrlQ6cw,587
|
260
|
-
django_cfg/apps/tasks/views.py,sha256=
|
260
|
+
django_cfg/apps/tasks/views.py,sha256=ja6G2Ea3e9Km-m_-3D4-ka3VUIXxPpFp9NTlE2d9gOk,18639
|
261
261
|
django_cfg/apps/tasks/static/tasks/css/dashboard.css,sha256=mDtAwFWzNrWEJkbkQFewmzFSYRXgTfGIXVkfWkbcUW0,4765
|
262
262
|
django_cfg/apps/tasks/static/tasks/js/api.js,sha256=01OL5P0AO4fg9vCjVNx5s1mGgh6Ate69rucfA27CS3c,4048
|
263
263
|
django_cfg/apps/tasks/static/tasks/js/dashboard.js,sha256=iBizGudFpzkX29cJbYv7Zim2xHx94uoBtmPCJ7t6TzE,23496
|
@@ -354,7 +354,7 @@ django_cfg/modules/django_llm/__init__.py,sha256=Nirl7Ap3sv5qS5EWM0IEUl_ul-mSYac
|
|
354
354
|
django_cfg/modules/django_llm/example.py,sha256=uL3hbRHHuvmWrNzMI7uSV5wrbIck5yqcgrfRGmA76Wg,13066
|
355
355
|
django_cfg/modules/django_llm/llm/__init__.py,sha256=sLx3bbLUx1h-k5aYoljlAeIg9tDzyd5C9ZFJvccbNSA,192
|
356
356
|
django_cfg/modules/django_llm/llm/cache.py,sha256=cYcbGpVF7zLUvLVvbqKtrJJnAPwno4ubL77UBI7x4bo,5653
|
357
|
-
django_cfg/modules/django_llm/llm/client.py,sha256=
|
357
|
+
django_cfg/modules/django_llm/llm/client.py,sha256=XRGn_v7xvrrf0E-WULTPVURhELn6C75jS-YmaHhiDX8,26022
|
358
358
|
django_cfg/modules/django_llm/llm/costs.py,sha256=1L5YTlIIJTWmY0_jKC8sEMZs1YRMDeStz-r-BpyZ2Vo,7490
|
359
359
|
django_cfg/modules/django_llm/llm/extractor.py,sha256=6LCq3IZUO5zKefwNEQ4EkszLGLGEA_YFLvAUPoRBdMc,2694
|
360
360
|
django_cfg/modules/django_llm/llm/models.py,sha256=0bgKsjveu3wpfBTaDsFbdwMC95e08j8EQtlAuRyxVg8,6009
|
@@ -434,8 +434,8 @@ django_cfg/utils/path_resolution.py,sha256=C9As6p4Q9l3VeoVkFDRPQWGrzAWf8O8UxLVka
|
|
434
434
|
django_cfg/utils/smart_defaults.py,sha256=b6A1z7VO1NJGq0oUQXN5P97c3k_Ssgw6qUi0mK-4TlM,19786
|
435
435
|
django_cfg/utils/toolkit.py,sha256=Td8_iXNaftonF_xdZP4Y3uO65nuA_4_zditn5Q_Pfcw,23310
|
436
436
|
django_cfg/utils/version_check.py,sha256=jI4v3YMdQriUEeb_TvRl511sDghy6I75iKRDUaNpucs,4800
|
437
|
-
django_cfg-1.2.
|
438
|
-
django_cfg-1.2.
|
439
|
-
django_cfg-1.2.
|
440
|
-
django_cfg-1.2.
|
441
|
-
django_cfg-1.2.
|
437
|
+
django_cfg-1.2.2.dist-info/METADATA,sha256=lqpgLyCzW9gfyYxukos7i7ohkUmutMF63ceutC9tqgE,45738
|
438
|
+
django_cfg-1.2.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
439
|
+
django_cfg-1.2.2.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
|
440
|
+
django_cfg-1.2.2.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
|
441
|
+
django_cfg-1.2.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|