import os import torch import gradio as gr from transformers import AutoModelForCausalLM, AutoTokenizer from peft import PeftModel # --- CONFIGURATION --- BASE_MODEL = "unsloth/gemma-2-2b-it" LORA_ADAPTER = "jojonocode/Strive-Ewe-Expert-Gemma-2b-V6-Checkpoints" HF_TOKEN = os.environ.get("HF_TOKEN") print("🚀 Initialisation de Strive V6 pour HF Spaces...") # 1. Tokenizer tokenizer = AutoTokenizer.from_pretrained(LORA_ADAPTER, token=HF_TOKEN) # 2. Modèle (Optimisation RAM : float16 est plus léger que float32 même sur CPU) model = AutoModelForCausalLM.from_pretrained( BASE_MODEL, torch_dtype=torch.float16, device_map="cpu", token=HF_TOKEN, low_cpu_mem_usage=True, trust_remote_code=True ) # 3. Chargement de l'adaptateur de ADZONYA Elisée model = PeftModel.from_pretrained(model, LORA_ADAPTER, token=HF_TOKEN) model.eval() SYSTEM_PROMPT = """Tu es Strive AI, créé par Elisée Joel ADZONYA. Équipe : Yavin MITEKOR, Mariette HOUDI, Christian DAKO, Elie VIKOUM. MISSION : Réponds UNIQUEMENT en Ewe de façon fluide, courte et factuelle. RÈGLE : Pas de poésie, pas d'introduction.""" def generate_response(message, history): # --- CONSTRUCTION DU PROMPT AVEC VERROUILLAGE D'IDENTITÉ --- full_prompt = f"system\n{SYSTEM_PROMPT}\n" # Exemples de "Force" pour éviter le bug "None" sur Space full_prompt += "user\nC'est quoi ton nom ?\n" full_prompt += "model\nNye ŋkɔe nye Strive AI. Elisée Joël ADZONYA ye wɔm.\n" full_prompt += "user\nQui est ton créateur ?\n" full_prompt += "model\nElisée Joël ADZONYA nye nye wɔla kple mɔ̃ɖaŋudɔwɔla vevi.\n" # Intégration de l'historique (max 2 derniers échanges pour économiser la RAM) if history: for user_msg, bot_msg in history[-2:]: if user_msg and bot_msg: full_prompt += f"user\n{user_msg}\n" full_prompt += f"model\n{bot_msg}\n" # Nouveau message utilisateur full_prompt += f"user\n{message}\nmodel\n" # Inférence sécurisée inputs = tokenizer(full_prompt, return_tensors="pt").to("cpu") with torch.no_grad(): outputs = model.generate( **inputs, max_new_tokens=150, temperature=0.1, # Stable repetition_penalty=1.1, # Moins de blocage sur les noms propres do_sample=True, top_p=0.9, pad_token_id=tokenizer.eos_token_id, eos_token_id=tokenizer.eos_token_id ) # Décodage response = tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True) # Nettoyage final final_text = response.strip().split('\n')[0] # Sécurité anti-None spécifique au Space if not final_text or final_text.lower() == "none": return "Nye ŋkɔe nye Strive AI, Elisée Joël ADZONYA ye wɔm." return final_text # --- INTERFACE GRADIO PERSONNALISÉE --- with gr.Blocks(theme=gr.themes.Soft()) as demo: gr.Markdown("""# Strive AI V6 - Officiel **Intelligence Experte en langue Ewe** Développé par **A strive** et son équipe.""") chatbot = gr.ChatInterface( fn=generate_response, examples=[ "Ame kae nye Elisée ADZONYA?", "Lomé nye afi ka?", "Nàkplɔ miam aleke nàwɔ nàde ŋkɔ le sukuu me.", "C'est quoi Strive ?" ], cache_examples=False, ) if __name__ == "__main__": demo.launch()