django-cfg 1.2.0__py3-none-any.whl → 1.2.1__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.1"
36
36
  __license__ = "MIT"
37
37
 
38
38
  # Import registry for organized lazy loading
@@ -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
 
@@ -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.1
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=qZwBd0Ac7ik2b7q7ZAi6KXhdFqSC0mK3-7kyBvMDPtE,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
@@ -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
@@ -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.1.dist-info/METADATA,sha256=GpSQThJgLKU7_Qg965qDlKzhKqPpbyG4HVUoJoyTnVw,45738
438
+ django_cfg-1.2.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
439
+ django_cfg-1.2.1.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
440
+ django_cfg-1.2.1.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
441
+ django_cfg-1.2.1.dist-info/RECORD,,