Spaces:
Sleeping
Sleeping
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() |