django-lucy-assist 0.1.0__py3-none-any.whl → 1.0.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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-lucy-assist
3
- Version: 0.1.0
3
+ Version: 1.0.1
4
4
  Summary: Assistant IA intelligent Revolucy pour outil métier
5
5
  Author-email: Revolucy <hello@revolucy.fr>
6
6
  Maintainer-email: Maxence <hello@revolucy.fr>
@@ -68,11 +68,7 @@ Ajouter dans votre fichier `.env` :
68
68
 
69
69
  ```bash
70
70
  # ======================================== LUCY ASSIST ========================================
71
- # Clé API Claude
72
- ANTHROPIC_API_KEY=sk-ant-...
73
-
74
- # Configuration GitLab pour l'analyse de bugs (optionnel)
75
- GITLAB_URL=https://gitlab.example.com
71
+ CLAUDE_LUCY_ASSIST_API_KEY=sk-ant-...
76
72
  GITLAB_TOKEN=glpat-...
77
73
  GITLAB_PROJECT_ID=123
78
74
 
@@ -85,20 +81,13 @@ Puis dans votre `settings.py` :
85
81
  ```python
86
82
  import os
87
83
 
84
+ #############################################################################################################
88
85
  # Lucy Assist
89
- ANTHROPIC_API_KEY = os.getenv('ANTHROPIC_API_KEY')
90
- GITLAB_URL = os.getenv('GITLAB_URL')
91
- GITLAB_TOKEN = os.getenv('GITLAB_TOKEN')
92
- GITLAB_PROJECT_ID = os.getenv('GITLAB_PROJECT_ID')
93
- SIREN_CLIENT = os.getenv('SIREN_CLIENT')
94
-
95
- # Configuration avancée (optionnel)
96
- LUCY_ASSIST = {
97
- # Modèle de base personnalisé
98
- 'BASE_MODEL': 'mon_app.models.MonModeleBase',
99
- # Préfixe des apps du projet pour le mapping modèle -> app
100
- 'PROJECT_APPS_PREFIX': 'apps.',
101
- }
86
+ CLAUDE_LUCY_ASSIST_API_KEY = env('CLAUDE_LUCY_ASSIST_API_KEY', default=None)
87
+ GITLAB_URL = env('GITLAB_URL', default=None)
88
+ GITLAB_TOKEN = env('GITLAB_TOKEN', default=None)
89
+ GITLAB_PROJECT_ID = env('GITLAB_PROJECT_ID', default=None)
90
+ LUCY_ASSIST = {'PROJECT_APPS_PREFIX': 'apps.'}
102
91
  ```
103
92
 
104
93
  ### 3. Ajouter les URLs
@@ -197,10 +186,11 @@ Lucy Assist expose plusieurs endpoints API :
197
186
  ## Versionning
198
187
 
199
188
  - V1.0.0 | Création du module Lucy
189
+ - V1.0.1 | Correction de bugs
200
190
 
201
191
  ## Déploiement Pypi
202
192
 
203
- 1. `pip install build twine`
193
+ 1. `docker-compose exec django pip install build twine`
204
194
  2. `python -m build`
205
195
  3. `python -m twine upload dist/*`
206
196
  4. Indiquer le token présent dans 1Password
@@ -1,12 +1,12 @@
1
- lucy_assist/__init__.py,sha256=vTA2UPlEX6UiMaOIpDAPAKife5f2KyDOhxGiTQu5lio,335
1
+ lucy_assist/__init__.py,sha256=RRyzb-WXTuxiOWYG6fBuj_7joZEO2ho7XyE2yTRKZss,335
2
2
  lucy_assist/admin.py,sha256=-hNfuwuMfxgZVFQc_ODy6WcyZPxrM_8TfKsRMd0fj38,694
3
3
  lucy_assist/apps.py,sha256=zHZtlBXs5ML4CKtGg7xDyptSWzLfB1ks2VvbXF50hdo,264
4
- lucy_assist/conf.py,sha256=S24BxpkMrT54YfYgQcFjgNZY8y_wu8u7wfKcegUaH1Q,3535
4
+ lucy_assist/conf.py,sha256=xp5t-CRG4L7R-NOkb2sY6-XkmGee7M7Eb-jAVr-CAzk,3500
5
5
  lucy_assist/constantes.py,sha256=YppDWi1DQueMwJk3jmeGPDi-UTmSUUDSwR6sW7QzBn4,4083
6
6
  lucy_assist/context_processors.py,sha256=mDrr9G5XztDfJLGq_75X1rkJbVI5De08ys_pW3y12Dw,2210
7
7
  lucy_assist/signals.py,sha256=aQA84oe9JNL72eeV5kURTTV-9CcQpqakDle1Lv3dnFY,861
8
8
  lucy_assist/urls.py,sha256=Qr8jJjEyC_EFGAeiZnjhgTc-9P4Y-TqKDaYicWRp_GQ,1451
9
- lucy_assist/migrations/0001_initial.py,sha256=_3ARg4hFA76pfrJV7RI6nMNaygwcCL5JA_-21LGroWQ,5015
9
+ lucy_assist/migrations/0001_initial.py,sha256=Z4chOo4Ok_5VqQyHvfPS00ikyuefdwHF3LaH4SKpzoQ,4977
10
10
  lucy_assist/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  lucy_assist/models/__init__.py,sha256=JQMr50P94sBrKwwcNArRE_qnk7dLnknMKCabeRLskJc,415
12
12
  lucy_assist/models/base.py,sha256=Ql2AY7bzvcxZhxsPdCpbVEKvtWD-NBkHTLYZX4TjT3s,1532
@@ -16,17 +16,17 @@ lucy_assist/models/message.py,sha256=kf-ffMtLYNFhXYUrB3QSL97KKDJUOMrKaPjKeOcJa_o
16
16
  lucy_assist/models/project_context_cache.py,sha256=Bnb0VU7pv7QEvjOI6JSLEPvL4BxskCQ0ojWGxO7YDSM,6530
17
17
  lucy_assist/services/__init__.py,sha256=I0brW674WNIKkGHj2lj4sGEDD7HUAr5Z254dsbirdLk,691
18
18
  lucy_assist/services/bug_notification_service.py,sha256=BkY-xqeC153j6p5GWrc70W5jBKkBFD2Zx68qguNUOrU,6999
19
- lucy_assist/services/claude_service.py,sha256=QJIo983cSQ0k_9IKxYB50DxlRDJGPuEbrFGdzs6hl2c,15873
19
+ lucy_assist/services/claude_service.py,sha256=9eU28qGadHmUZYW3ExQZOfsH1pxcarzpYlcRhKJu3Yc,15897
20
20
  lucy_assist/services/context_service.py,sha256=GaZzUHNlJf9-0Mas4_nfi2RgycNLoWjYHCJxCoiwUnA,11997
21
21
  lucy_assist/services/crud_service.py,sha256=E8-xRxPXXbUuPakGXPsbZfImEJWZx4BZq5DhM5q2I08,11436
22
22
  lucy_assist/services/gitlab_service.py,sha256=uH83fwRSCwiRItznENpYQG4aPckjafYIV9z6OChUrZg,8056
23
23
  lucy_assist/services/project_context_service.py,sha256=bIuqTanc59gP_BLod3oQgWplxpiCgByg-kbUMe_57CQ,14053
24
24
  lucy_assist/services/tool_executor_service.py,sha256=fXLH4Aaip-HPX1nNRs8UQ1N77rGloBahSwOR9gPmjfU,13583
25
25
  lucy_assist/services/tools_definition.py,sha256=xUJCtFZ1uROxB7jNHY0X75fs5nzFAKr4VpSHtKgepxU,8974
26
- lucy_assist/static/lucy_assist/css/lucy-assist.css,sha256=VLsebnECg36dOykBldJALBKHW3CZUfukz_nq94rKklI,3333
26
+ lucy_assist/static/lucy_assist/css/lucy-assist.css,sha256=gUfj4OUTz_aFiXWau1iXtHEmfUCkUI2zGMfwkLk2nXs,18190
27
27
  lucy_assist/static/lucy_assist/image/icon-lucy.png,sha256=FOYlwXAt40Gr9jsWFmhgPivYOBFWKeYW0lxJI5Up-GM,6710
28
28
  lucy_assist/static/lucy_assist/js/lucy-assist.js,sha256=dmXtSPQ38LisoRWZd3R1Ms6OvVaEk3OrYKcVM0OMb_Q,28207
29
- lucy_assist/templates/lucy_assist/chatbot_sidebar.html,sha256=ptShZL89SPH4xk0RvFJheoZLJ-kWDSiPMvEqpbvnQVI,19827
29
+ lucy_assist/templates/lucy_assist/chatbot_sidebar.html,sha256=4U8dVNFv2b9KnR7_jAHbSf6laI8qFTNnIVNjVXMC2W0,18912
30
30
  lucy_assist/templates/lucy_assist/partials/documentation_content.html,sha256=byA2EvQT1GaMB5yTQHNt5ZfJKEew9_LxutU8s5muM9s,4143
31
31
  lucy_assist/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
32
  lucy_assist/tests/test_lucy_assist.py,sha256=KBvuED10_gOJWdaRS2zMigM3W5Kp00KhMEwaR8tvhUc,6949
@@ -38,7 +38,7 @@ lucy_assist/utils/message_utils.py,sha256=kABNVlfJTzmbRTVdauKPN5HVRqyw352xu_rlQr
38
38
  lucy_assist/utils/token_utils.py,sha256=rxe9jHjcRJcaIlcw0QuVmYXOjscTsUsxnhhI6RMBzDM,2608
39
39
  lucy_assist/views/__init__.py,sha256=uUPYpuHlBC8j7zKS_DDoWjwpCpRnOIXETY-S2-Ss0cY,288
40
40
  lucy_assist/views/api_views.py,sha256=C8Ftut7qNSauzFNoZ4yPMhiADeEma7aiqrQrN9Gx9Yk,23281
41
- django_lucy_assist-0.1.0.dist-info/METADATA,sha256=Otc1eK9jUnClf5Jy63wgJmAOcmjuMnfBpA20a3Totlw,5752
42
- django_lucy_assist-0.1.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
43
- django_lucy_assist-0.1.0.dist-info/top_level.txt,sha256=T-UCiwpn5yF3Oem3234TUpSVnEgbkrM2rGz9Tz5N-QA,12
44
- django_lucy_assist-0.1.0.dist-info/RECORD,,
41
+ django_lucy_assist-1.0.1.dist-info/METADATA,sha256=yyqUw7o-A0Nviz7O8Z7z4XWzWP-EIab77gXEUctl_rE,5626
42
+ django_lucy_assist-1.0.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
43
+ django_lucy_assist-1.0.1.dist-info/top_level.txt,sha256=T-UCiwpn5yF3Oem3234TUpSVnEgbkrM2rGz9Tz5N-QA,12
44
+ django_lucy_assist-1.0.1.dist-info/RECORD,,
lucy_assist/__init__.py CHANGED
@@ -5,7 +5,7 @@ Un chatbot IA basé sur Claude d'Anthropic, intégrable dans n'importe quelle
5
5
  application Django pour fournir une assistance contextuelle aux utilisateurs.
6
6
  """
7
7
 
8
- __version__ = '0.1.0'
8
+ __version__ = '1.0.1'
9
9
  __author__ = 'Revolucy'
10
10
 
11
11
  default_app_config = 'lucy_assist.apps.LucyAssistConfig'
lucy_assist/conf.py CHANGED
@@ -17,8 +17,8 @@ class LucyAssistSettings:
17
17
  # Peut être une string "mon_app.models.MonModele" ou une classe directement
18
18
  'BASE_MODEL': None,
19
19
 
20
- # Clé API Claude (peut aussi être définie via ANTHROPIC_API_KEY)
21
- 'CLAUDE_API_KEY': None,
20
+ # Clé API Claude (peut aussi être définie via CLAUDE_LUCY_ASSIST_API_KEY)
21
+ 'CLAUDE_LUCY_ASSIST_API_KEY': None,
22
22
 
23
23
  # Modèle Claude à utiliser
24
24
  'CLAUDE_MODEL': 'claude-sonnet-4-20250514',
@@ -67,11 +67,10 @@ class LucyAssistSettings:
67
67
  return self._settings[name]
68
68
 
69
69
  # Cas spéciaux pour les settings qui peuvent être définis au niveau global
70
- if name == 'CLAUDE_API_KEY':
70
+ if name == 'CLAUDE_LUCY_ASSIST_API_KEY':
71
71
  # Chercher dans plusieurs variables possibles
72
72
  return (
73
73
  getattr(settings, 'CLAUDE_LUCY_ASSIST_API_KEY', None) or
74
- getattr(settings, 'ANTHROPIC_API_KEY', None) or
75
74
  self.DEFAULTS[name]
76
75
  )
77
76
 
@@ -1,8 +1,8 @@
1
- # Generated migration for lucy_assist
1
+ # Generated by Django 6.0.1 on 2026-01-26 17:03
2
2
 
3
+ import django.db.models.deletion
3
4
  from django.conf import settings
4
5
  from django.db import migrations, models
5
- import django.db.models.deletion
6
6
 
7
7
 
8
8
  class Migration(migrations.Migration):
@@ -19,7 +19,7 @@ class Migration(migrations.Migration):
19
19
  fields=[
20
20
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
21
21
  ('created_date', models.DateTimeField(auto_now_add=True)),
22
- ('updated_date', models.DateTimeField(auto_now=True, null=True, blank=True)),
22
+ ('updated_date', models.DateTimeField(auto_now=True, null=True)),
23
23
  ('is_active', models.BooleanField(default=True)),
24
24
  ('tokens_disponibles', models.BigIntegerField(default=0)),
25
25
  ('prix_par_million_tokens', models.DecimalField(decimal_places=2, default=10.0, max_digits=10)),
@@ -33,12 +33,31 @@ class Migration(migrations.Migration):
33
33
  'verbose_name_plural': 'Configuration Lucy Assist',
34
34
  },
35
35
  ),
36
+ migrations.CreateModel(
37
+ name='ProjectContextCache',
38
+ fields=[
39
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
40
+ ('created_date', models.DateTimeField(auto_now_add=True)),
41
+ ('updated_date', models.DateTimeField(auto_now=True, null=True)),
42
+ ('is_active', models.BooleanField(default=True)),
43
+ ('cache_key', models.CharField(db_index=True, max_length=255, unique=True)),
44
+ ('contenu', models.JSONField(default=dict)),
45
+ ('content_hash', models.CharField(blank=True, max_length=64)),
46
+ ('expire_at', models.DateTimeField()),
47
+ ('tokens_economises', models.BigIntegerField(default=0)),
48
+ ('hit_count', models.IntegerField(default=0)),
49
+ ],
50
+ options={
51
+ 'verbose_name': 'Cache contexte projet',
52
+ 'verbose_name_plural': 'Caches contexte projet',
53
+ },
54
+ ),
36
55
  migrations.CreateModel(
37
56
  name='Conversation',
38
57
  fields=[
39
58
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
40
59
  ('created_date', models.DateTimeField(auto_now_add=True)),
41
- ('updated_date', models.DateTimeField(auto_now=True, null=True, blank=True)),
60
+ ('updated_date', models.DateTimeField(auto_now=True, null=True)),
42
61
  ('is_active', models.BooleanField(default=True)),
43
62
  ('titre', models.CharField(blank=True, max_length=255, null=True)),
44
63
  ('page_contexte', models.CharField(blank=True, max_length=500, null=True)),
@@ -55,7 +74,7 @@ class Migration(migrations.Migration):
55
74
  fields=[
56
75
  ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
57
76
  ('created_date', models.DateTimeField(auto_now_add=True)),
58
- ('updated_date', models.DateTimeField(auto_now=True, null=True, blank=True)),
77
+ ('updated_date', models.DateTimeField(auto_now=True, null=True)),
59
78
  ('is_active', models.BooleanField(default=True)),
60
79
  ('repondant', models.CharField(choices=[('UTILISATEUR', 'Utilisateur'), ('CHATBOT', 'Lucy Assist')], max_length=20)),
61
80
  ('contenu', models.TextField()),
@@ -70,23 +89,4 @@ class Migration(migrations.Migration):
70
89
  'ordering': ['created_date'],
71
90
  },
72
91
  ),
73
- migrations.CreateModel(
74
- name='ProjectContextCache',
75
- fields=[
76
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
77
- ('created_date', models.DateTimeField(auto_now_add=True)),
78
- ('updated_date', models.DateTimeField(auto_now=True, null=True, blank=True)),
79
- ('is_active', models.BooleanField(default=True)),
80
- ('cache_key', models.CharField(db_index=True, max_length=255, unique=True)),
81
- ('contenu', models.JSONField(default=dict)),
82
- ('content_hash', models.CharField(blank=True, max_length=64)),
83
- ('expire_at', models.DateTimeField()),
84
- ('tokens_economises', models.BigIntegerField(default=0)),
85
- ('hit_count', models.IntegerField(default=0)),
86
- ],
87
- options={
88
- 'verbose_name': 'Cache contexte projet',
89
- 'verbose_name_plural': 'Caches contexte projet',
90
- },
91
- ),
92
92
  ]
@@ -31,9 +31,9 @@ class ClaudeService:
31
31
  MAX_CONTEXT_TOKENS = 2000 # Limiter le contexte à 2000 tokens estimés
32
32
 
33
33
  def __init__(self):
34
- self.api_key = lucy_assist_settings.CLAUDE_API_KEY
34
+ self.api_key = lucy_assist_settings.CLAUDE_LUCY_ASSIST_API_KEY
35
35
  if not self.api_key:
36
- raise ValueError("CLAUDE_API_KEY non configurée dans les settings")
36
+ raise ValueError("CLAUDE_LUCY_ASSIST_API_KEY non configurée dans les settings")
37
37
 
38
38
  self.client = anthropic.Anthropic(api_key=self.api_key)
39
39
  self._project_context_service = None