Charlotte-APY / README.md
Clemylia's picture
Update README.md
115b6a0 verified
metadata
title: Charlotte-APY
emoji: 💖
colorFrom: pink
colorTo: purple
sdk: docker
run: sh run.sh

💖 Charlotte-APY : Portail d'Administration Tiny-Charlotte 🎀

Pour utiliser l'API Tiny-charlotte, dans votre propre application/script vous devez cloné le space en local et exécuter les codes suivant !

Cellule 1 : Lancement du Serveur FastAPI (Méthode Robuste)

import sys
import os
import subprocess
import threading
import time
import nest_asyncio

# --- Installation et Chemin d'Accès ---
!pip install fastapi uvicorn requests nest-asyncio python-multipart starlette transformers torch --quiet
print("Dépendances vérifiées.")

# Chemin du dossier 'src' qui contient api_server.py et core_logic.py
src_path = os.path.abspath('Charlotte-APY/src')

# --- Définition des Paramètres du Serveur ---
# Le module est simplement 'api_server:app' car nous allons nous déplacer dans son répertoire.
FASTAPI_MODULE = "api_server:app"
FASTAPI_PORT = 8000
FASTAPI_CMD = f"uvicorn {FASTAPI_MODULE} --host 127.0.0.1 --port {FASTAPI_PORT}"

nest_asyncio.apply()

# --- Fonction de Lancement Robuste ---
def run_fastapi():
    """
    Lance le serveur FastAPI en changeant de répertoire de travail (CWD).
    Ceci est essentiel pour que Python trouve 'api_server' et 'core_logic'
    sans manipulation complexe du PYTHONPATH.
    """
    
    # CLÉ DE LA CORRECTION : Changer le répertoire de travail pour le dossier 'src'
    if not os.path.exists(src_path):
        print(f"❌ ERREUR: Le chemin {src_path} n'existe pas. Veuillez vérifier que le dépôt est cloné correctement.")
        return
        
    os.chdir(src_path)
    
    print("\n-----------------------------------------------------")
    print(f"Démarrage de FastAPI sur http://127.0.0.1:{FASTAPI_PORT}...")
    print(f"Répertoire de travail actuel: {os.getcwd()}") # Doit pointer vers .../Charlotte-APY/src
    
    try:
        # Lancement non-bloquant du serveur
        get_ipython().system(FASTAPI_CMD)
    except NameError:
        # Fallback pour un environnement Python standard
        subprocess.run(FASTAPI_CMD, shell=True)
    finally:
        # Revenir au répertoire initial (racine de Colab) après l'exécution
        os.chdir(os.path.abspath('..'))


# Lancement du serveur dans un thread séparé.
fastapi_thread = threading.Thread(target=run_fastapi, daemon=True)
fastapi_thread.start()

# Attendre le chargement du modèle
print("Attente de 30 secondes pour le démarrage du serveur et le chargement du modèle...")
time.sleep(30) 
print("-----------------------------------------------------")
print("✅ Le serveur est censé être prêt ! Tentez l'appel API dans la cellule suivante.")

Clone du space :

git clone https://huggingface.co/spaces/Clemylia/Charlotte-APY

Requête :

Cellule 2 : Test du Client API

import requests
import json
import time

# --- Configurations ---
API_BASE_URL = "http://127.0.0.1:8000/"
API_PATH = "v1/inference"
API_URL = API_BASE_URL + API_PATH

YOUR_API_KEY = "Tn-charlotte_Ma_Cle_12345ABCDEFG"
PROMPT = "Salut ? Explique-moi la différence entre l'espoir et l'optimisme en une phrase."

# --- Construction de la Requête ---
headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {YOUR_API_KEY}"
}
payload = {
    "prompt": PROMPT,
}

# --- Appel API ---
print(f"🚀 Envoi de la requête locale à : {API_URL}")

try:
    start_time = time.time()
    response = requests.post(
        API_URL,
        headers=headers,
        data=json.dumps(payload),
        timeout=120
    )

    response.raise_for_status()
    response_json = response.json()
    end_time = time.time()

    print("\n✅ Réponse reçue :")
    print(json.dumps(response_json, indent=4, ensure_ascii=False))
    print(f"\nDurée de l'appel : {end_time - start_time:.2f} secondes.")

except requests.exceptions.HTTPError as errh:
    print(f"\n❌ Erreur HTTP ({response.status_code}) : {errh}")
    try:
        print(f"Détail du serveur : {response.json().get('detail', response.text)}")
    except:
        print("Réponse brute du serveur : Impossible de décoder JSON.")
except requests.exceptions.RequestException as e:
    print(f"\n❌ Une erreur s'est produite lors de l'appel API : {e}")

Rechargement :

Cellule 4 : Forcer le Rechargement du Module core_logic

import importlib
import core_logic # Importe le module initialement

print("Tentative de rechargement du module core_logic...")
try:
    # Cette fonction force Python à relire le fichier core_logic.py depuis le disque
    importlib.reload(core_logic)
    print("✅ core_logic rechargé avec succès. La nouvelle fonction 'create_api_key' devrait être disponible.")
except NameError:
    # Si le module n'était pas chargé
    print("core_logic n'était pas chargé, le prochain appel Cellule 3 le chargera.")
except Exception as e:
    print(f"❌ Erreur lors du rechargement : {e}")

créer une clé ;

Cellule 3 : Création d'une Nouvelle Clé d'API Valide (Correction)

import sys
import os
import core_logic 

# --- S'assurer que le chemin est correct (héritage de Cellule 1) ---

print("🔑 Tentative de création d'une nouvelle clé d'API...")
core_logic.init_db() 

# 1. Utilisation de la fonction correcte, 'create_api_key'
# Ligne corrigée ci-dessous :
new_key = core_logic.create_api_key() # <-- CORRECTION

# 2. Récupère les données pour confirmation
if new_key:
    key_data = core_logic.get_key_data(new_key)
else:
    key_data = None

print("\n--- Résultat ---")
if key_data:
    print(f"✅ Nouvelle clé d'API créée et enregistrée avec succès !")
    print(f"Clé d'API à utiliser : **{new_key}**")
    print(f"Quota initial : {key_data['max_quota']} tokens")
    print("\n💡 Utilisez cette clé pour remplacer 'YOUR_API_KEY' dans la Cellule 2.")
else:
    print("❌ Échec de la création de la clé.")