File size: 3,754 Bytes
f4f1a7f
8ad6eca
34afdf9
cae091c
8ad6eca
60e19cb
8ad6eca
cae091c
810f0a6
8ad6eca
34afdf9
810f0a6
55d3cc2
1cb924f
8ad6eca
55d3cc2
810f0a6
8ad6eca
 
810f0a6
ebbe976
8ad6eca
ebbe976
8ad6eca
 
55d3cc2
810f0a6
8ad6eca
 
55d3cc2
810f0a6
 
 
 
55d3cc2
f4f1a7f
810f0a6
f4f1a7f
cae091c
810f0a6
 
 
 
 
 
 
1cb924f
810f0a6
1cb924f
 
 
cae091c
810f0a6
f4f1a7f
 
810f0a6
cae091c
8ad6eca
 
 
 
1cb924f
40d9857
810f0a6
8ad6eca
810f0a6
ebbe976
 
8ad6eca
f4f1a7f
810f0a6
8ad6eca
ebbe976
810f0a6
 
 
 
 
 
 
 
f4f1a7f
810f0a6
 
40d9857
 
810f0a6
 
 
 
 
 
 
 
 
 
 
f4f1a7f
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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"<start_of_turn>system\n{SYSTEM_PROMPT}<end_of_turn>\n"
    
    # Exemples de "Force" pour éviter le bug "None" sur Space
    full_prompt += "<start_of_turn>user\nC'est quoi ton nom ?<end_of_turn>\n"
    full_prompt += "<start_of_turn>model\nNye ŋkɔe nye Strive AI. Elisée Joël ADZONYA ye wɔm.<end_of_turn>\n"
    full_prompt += "<start_of_turn>user\nQui est ton créateur ?<end_of_turn>\n"
    full_prompt += "<start_of_turn>model\nElisée Joël ADZONYA nye nye wɔla kple mɔ̃ɖaŋudɔwɔla vevi.<end_of_turn>\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"<start_of_turn>user\n{user_msg}<end_of_turn>\n"
                full_prompt += f"<start_of_turn>model\n{bot_msg}<end_of_turn>\n"
    
    # Nouveau message utilisateur
    full_prompt += f"<start_of_turn>user\n{message}<end_of_turn>\n<start_of_turn>model\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()