Clemylia commited on
Commit
4b57dfb
·
verified ·
1 Parent(s): a374fc3

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +174 -8
README.md CHANGED
@@ -11,16 +11,182 @@ run: sh run.sh
11
 
12
  # 💖 Charlotte-APY : Portail d'Administration Tiny-Charlotte 🎀
13
 
14
- Ce Space héberge deux services :
15
- 1. **Interface d'administration (Streamlit)** sur le port 7860 (visible ci-dessus).
16
- 2. **API d'Inférence (FastAPI)** sur le port 7861 (accessible publiquement).
17
 
18
- ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
 
20
- ## 🔑 Accès à l'API de Production
 
21
 
22
- Si l'API n'est pas accessible via l'URL principale, veuillez essayer l'URL spécifique au port :
 
 
23
 
24
- `https://Clemylia-Charlotte-APY-7861.hf.space/v1/inference`
 
 
 
 
25
 
26
- Vous devez inclure un en-tête `Authorization: Bearer <votre_clé>` pour utiliser le service.
 
 
 
 
 
 
 
 
 
11
 
12
  # 💖 Charlotte-APY : Portail d'Administration Tiny-Charlotte 🎀
13
 
14
+ Pour utiliser l'API Tiny-charlotte,
15
+ dans votre propre application/script vous devez cloné le space en local et exécuter les codes suivant !
 
16
 
17
+ # Cellule 1 : Lancement du Serveur FastAPI (Méthode Robuste)
18
+
19
+ ```
20
+ import sys
21
+ import os
22
+ import subprocess
23
+ import threading
24
+ import time
25
+ import nest_asyncio
26
+
27
+ # --- Installation et Chemin d'Accès ---
28
+ !pip install fastapi uvicorn requests nest-asyncio python-multipart starlette transformers torch --quiet
29
+ print("Dépendances vérifiées.")
30
+
31
+ # Chemin du dossier 'src' qui contient api_server.py et core_logic.py
32
+ src_path = os.path.abspath('Charlotte-APY/src')
33
+
34
+ # --- Définition des Paramètres du Serveur ---
35
+ # Le module est simplement 'api_server:app' car nous allons nous déplacer dans son répertoire.
36
+ FASTAPI_MODULE = "api_server:app"
37
+ FASTAPI_PORT = 8000
38
+ FASTAPI_CMD = f"uvicorn {FASTAPI_MODULE} --host 127.0.0.1 --port {FASTAPI_PORT}"
39
+
40
+ nest_asyncio.apply()
41
+
42
+ # --- Fonction de Lancement Robuste ---
43
+ def run_fastapi():
44
+ """
45
+ Lance le serveur FastAPI en changeant de répertoire de travail (CWD).
46
+ Ceci est essentiel pour que Python trouve 'api_server' et 'core_logic'
47
+ sans manipulation complexe du PYTHONPATH.
48
+ """
49
+
50
+ # CLÉ DE LA CORRECTION : Changer le répertoire de travail pour le dossier 'src'
51
+ if not os.path.exists(src_path):
52
+ print(f"❌ ERREUR: Le chemin {src_path} n'existe pas. Veuillez vérifier que le dépôt est cloné correctement.")
53
+ return
54
+
55
+ os.chdir(src_path)
56
+
57
+ print("\n-----------------------------------------------------")
58
+ print(f"Démarrage de FastAPI sur http://127.0.0.1:{FASTAPI_PORT}...")
59
+ print(f"Répertoire de travail actuel: {os.getcwd()}") # Doit pointer vers .../Charlotte-APY/src
60
+
61
+ try:
62
+ # Lancement non-bloquant du serveur
63
+ get_ipython().system(FASTAPI_CMD)
64
+ except NameError:
65
+ # Fallback pour un environnement Python standard
66
+ subprocess.run(FASTAPI_CMD, shell=True)
67
+ finally:
68
+ # Revenir au répertoire initial (racine de Colab) après l'exécution
69
+ os.chdir(os.path.abspath('..'))
70
+
71
+
72
+ # Lancement du serveur dans un thread séparé.
73
+ fastapi_thread = threading.Thread(target=run_fastapi, daemon=True)
74
+ fastapi_thread.start()
75
+
76
+ # Attendre le chargement du modèle
77
+ print("Attente de 30 secondes pour le démarrage du serveur et le chargement du modèle...")
78
+ time.sleep(30)
79
+ print("-----------------------------------------------------")
80
+ print("✅ Le serveur est censé être prêt ! Tentez l'appel API dans la cellule suivante.")
81
+
82
+ ```
83
+ Clone du space :
84
+ ```
85
+ git clone https://huggingface.co/spaces/Clemylia/Charlotte-APY
86
+ ```
87
+ Requête :
88
+
89
+ # Cellule 2 : Test du Client API
90
+
91
+ ```
92
+ import requests
93
+ import json
94
+ import time
95
+
96
+ # --- Configurations ---
97
+ API_BASE_URL = "http://127.0.0.1:8000/"
98
+ API_PATH = "v1/inference"
99
+ API_URL = API_BASE_URL + API_PATH
100
+
101
+ YOUR_API_KEY = "Tn-charlotte_Ma_Cle_12345ABCDEFG"
102
+ PROMPT = "Salut ? Explique-moi la différence entre l'espoir et l'optimisme en une phrase."
103
+
104
+ # --- Construction de la Requête ---
105
+ headers = {
106
+ "Content-Type": "application/json",
107
+ "Authorization": f"Bearer {YOUR_API_KEY}"
108
+ }
109
+ payload = {
110
+ "prompt": PROMPT,
111
+ }
112
+
113
+ # --- Appel API ---
114
+ print(f"🚀 Envoi de la requête locale à : {API_URL}")
115
+
116
+ try:
117
+ start_time = time.time()
118
+ response = requests.post(
119
+ API_URL,
120
+ headers=headers,
121
+ data=json.dumps(payload),
122
+ timeout=120
123
+ )
124
+
125
+ response.raise_for_status()
126
+ response_json = response.json()
127
+ end_time = time.time()
128
+
129
+ print("\n✅ Réponse reçue :")
130
+ print(json.dumps(response_json, indent=4, ensure_ascii=False))
131
+ print(f"\nDurée de l'appel : {end_time - start_time:.2f} secondes.")
132
+
133
+ except requests.exceptions.HTTPError as errh:
134
+ print(f"\n❌ Erreur HTTP ({response.status_code}) : {errh}")
135
+ try:
136
+ print(f"Détail du serveur : {response.json().get('detail', response.text)}")
137
+ except:
138
+ print("Réponse brute du serveur : Impossible de décoder JSON.")
139
+ except requests.exceptions.RequestException as e:
140
+ print(f"\n❌ Une erreur s'est produite lors de l'appel API : {e}")
141
+
142
+ Rechargement :
143
+ # Cellule 4 : Forcer le Rechargement du Module core_logic
144
+
145
+ import importlib
146
+ import core_logic # Importe le module initialement
147
+
148
+ print("Tentative de rechargement du module core_logic...")
149
+ try:
150
+ # Cette fonction force Python à relire le fichier core_logic.py depuis le disque
151
+ importlib.reload(core_logic)
152
+ print("✅ core_logic rechargé avec succès. La nouvelle fonction 'create_api_key' devrait être disponible.")
153
+ except NameError:
154
+ # Si le module n'était pas chargé
155
+ print("core_logic n'était pas chargé, le prochain appel Cellule 3 le chargera.")
156
+ except Exception as e:
157
+ print(f"❌ Erreur lors du rechargement : {e}")
158
+ ```
159
+ créer une clé ;
160
+
161
+
162
+ # Cellule 3 : Création d'une Nouvelle Clé d'API Valide (Correction)
163
+
164
+ ```
165
+ import sys
166
+ import os
167
+ import core_logic
168
+
169
+ # --- S'assurer que le chemin est correct (héritage de Cellule 1) ---
170
 
171
+ print("🔑 Tentative de création d'une nouvelle clé d'API...")
172
+ core_logic.init_db()
173
 
174
+ # 1. Utilisation de la fonction correcte, 'create_api_key'
175
+ # Ligne corrigée ci-dessous :
176
+ new_key = core_logic.create_api_key() # <-- CORRECTION
177
 
178
+ # 2. Récupère les données pour confirmation
179
+ if new_key:
180
+ key_data = core_logic.get_key_data(new_key)
181
+ else:
182
+ key_data = None
183
 
184
+ print("\n--- Résultat ---")
185
+ if key_data:
186
+ print(f"✅ Nouvelle clé d'API créée et enregistrée avec succès !")
187
+ print(f"Clé d'API à utiliser : **{new_key}**")
188
+ print(f"Quota initial : {key_data['max_quota']} tokens")
189
+ print("\n💡 Utilisez cette clé pour remplacer 'YOUR_API_KEY' dans la Cellule 2.")
190
+ else:
191
+ print("❌ Échec de la création de la clé.")
192
+ ```