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 CHANGED
@@ -32,7 +32,7 @@ Example:
32
32
  default_app_config = "django_cfg.apps.DjangoCfgConfig"
33
33
 
34
34
  # Version information
35
- __version__ = "1.2.0"
35
+ __version__ = "1.2.2"
36
36
  __license__ = "MIT"
37
37
 
38
38
  # Import registry for organized lazy loading
@@ -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
- return settings.api_keys.openai if env else os.getenv("OPENAI_API_KEY")
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
- return settings.api_keys.openrouter if env else os.getenv("OPENROUTER_API_KEY")
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.get('content', ''),
113
- tokens_used=response.get('tokens_used', 0),
114
- cost_usd=response.get('cost_usd', 0.0),
115
- processing_time_ms=int(response.get('processing_time', 0) * 1000),
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.get('finish_reason', 'stop')
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.get('tokens_used', 0)
122
- session.total_cost_usd = safe_float(session.total_cost_usd, 0.0) + safe_float(response.get('cost_usd', 0.0), 0.0)
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.get('content', ''),
133
- 'tokens_used': response.get('tokens_used', 0),
134
- 'cost_usd': safe_float(response.get('cost_usd', 0.0), 0.0),
135
- 'processing_time_ms': int(response.get('processing_time', 0) * 1000),
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
 
@@ -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": 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=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.0
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=NDf_y4m6etxEFaLBunp8iOfVK57GgIjh79E-TqMJkYM,1630
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=e7uLBbePtyFw-eQoakbwEedRku4scpDCmwmqc-O5SFE,6350
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=l8m7Gfev2xqvEIg7ekn3nDF_cL8VbPAlYnYvTSyGh9w,13185
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=4-Vi6rEpNDj1ldoGoisyxqxCR2FjkV1jwHfWE_7dCk0,8396
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=HO4fSHyYALOKmLiLsm2Ir-G2DgCsZGHuoncq8FVRp5s,18048
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=XYLMWq_ChKjdmQH4MkVgOVP1HEdM6k9id7XfsPGwpAc,25533
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.0.dist-info/METADATA,sha256=szJlXEuvQbepbzl4AsO5PCg0J9eSPR4efeHs6PcV-ag,45738
438
- django_cfg-1.2.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
439
- django_cfg-1.2.0.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
440
- django_cfg-1.2.0.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
441
- django_cfg-1.2.0.dist-info/RECORD,,
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,,