ERNESTMIND2.5 / git_storage.py
ernestmindres's picture
Update git_storage.py
86c2ed6 verified
# git_storage.py
import json
from huggingface_hub import HfApi, CommitOperationAdd
from os import environ
from huggingface_hub.errors import HfHubHTTPError # <-- AJOUTER CET IMPORT
# Configuration du dépôt
REPO_ID = "ernestmindres/ernestmind_user_data"
# L'API_TOKEN est lu directement depuis les secrets de l'environnement (Secret HF_TOKEN)
# Nous le laissons ici, mais nous allons le vérifier dans les fonctions.
API_TOKEN = environ.get("HF_TOKEN")
# NOTE: Nous allons rendre les fonctions save/create plus robustes en
# recréant l'objet HfApi si nécessaire ou en vérifiant le token.
# Initialisation de l'API Hugging Face
# Ceci est conservé pour la lecture (load), mais nous allons être plus prudents pour l'écriture.
api = HfApi(token=API_TOKEN)
def get_authenticated_api():
"""Vérifie le jeton et retourne un objet HfApi."""
# Re-lire la variable d'environnement au cas où elle serait chargée plus tard
current_token = environ.get("HF_TOKEN")
if not current_token:
raise ValueError("Erreur d'authentification: Le secret HF_TOKEN est manquant ou non chargé dans l'environnement.")
return HfApi(token=current_token)
def load_users_data():
"""Charge le fichier users.json depuis le dépôt."""
# ... (pas de changement ici, la lecture est conservée telle quelle, car elle fonctionne)
try:
# Télécharge et charge le fichier users.json
users_file = api.hf_hub_download(
repo_id=REPO_ID,
filename="users.json",
repo_type="dataset" # <-- CORRECTION: Spécifier le type de dépôt
)
with open(users_file, "r", encoding="utf-8") as f:
return json.load(f)
except Exception as e:
# ... (reste inchangé)
if "Repository Not Found" in str(e) or "Cannot find file" in str(e):
print(f"Dépôt ou fichier users.json non trouvé (ce qui est normal au premier lancement): {e}")
return {}
print(f"Erreur lors du chargement des données utilisateurs: {e}")
return {}
# Chemin du fichier temporaire pour l'écriture locale (correction pour PermissionError)
LOCAL_USERS_FILE_PATH = "/tmp/users.json"
def save_users_data(users_data, commit_message="Update users data"):
"""
Sauvegarde les données utilisateurs dans users.json
et les commite sur le dépôt Hugging Face.
"""
try:
# 1. Utiliser une API authentifiée
authenticated_api = get_authenticated_api() # <-- APPEL À LA VÉRIFICATION DU TOKEN
# 2. Écriture du fichier users.json en local dans le répertoire /tmp
with open(LOCAL_USERS_FILE_PATH, "w", encoding="utf-8") as f:
json.dump(users_data, f, indent=4)
# 3. Définition de l'opération de commit
operations = [
CommitOperationAdd(path_in_repo="users.json", path_or_fileobj=LOCAL_USERS_FILE_PATH)
]
# 4. Commit sur le dépôt
authenticated_api.create_commit( # <-- UTILISATION DE L'API AUTHENTIFIÉE
repo_id=REPO_ID,
operations=operations,
commit_message=commit_message,
repo_type="dataset" #
)
print(f"Fichier users.json commité avec succès. Message: '{commit_message}'")
return True
except HfHubHTTPError as e: # <-- MEILLEURE GESTION POUR LES ERREURS HF
print(f"ERREUR HTTP HUGGING FACE (401/404/403) : {e}")
return False
except ValueError as e: # <-- GESTION DE L'ERREUR DE TOKEN MANQUANT
print(f"ERREUR CRITIQUE DE CONFIGURATION : {e}")
return False
except Exception as e:
# Log d'erreur général pour les autres problèmes (réseau, disque, etc.)
import traceback
print("---------- LOG D'ERREUR HUGGING FACE (GÉNÉRAL) ----------")
print(f"Échec de l'opération de commit sur le dépôt {REPO_ID}.")
print(f"Erreur complète : {e}")
traceback.print_exc()
print("--------------------------------------------")
return False
def create_user_data_structure(user_id):
"""
Crée la structure initiale des conversations pour un nouvel utilisateur
dans le dépôt Hugging Face.
"""
try:
# 1. Utiliser une API authentifiée
authenticated_api = get_authenticated_api() # <-- APPEL À LA VÉRIFICATION DU TOKEN
# ... (le reste de la logique de création de fichier)
file_path = f"conversations/{user_id}.json"
operations = [
CommitOperationAdd(
path_in_repo=file_path,
path_or_fileobj=json.dumps({"conversations": {}}, indent=4)
)
]
# Commit sur le dépôt
authenticated_api.create_commit( # <-- UTILISATION DE L'API AUTHENTIFIÉE
repo_id=REPO_ID,
operations=operations,
commit_message=f"feat: Add new user conversation file: {user_id}",
repo_type="dataset" #
)
print(f"Structure de données pour l'utilisateur {user_id} créée.")
return True
except Exception as e:
print(f"Erreur lors de la création de la structure de données pour {user_id}: {e}")
return False