#!/usr/bin/env python import os from collections.abc import Iterator from threading import Thread import gradio as gr import spaces import torch from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer DESCRIPTION = " " if not torch.cuda.is_available(): DESCRIPTION += "\n
Running on CPU đ„¶ This demo does not work on CPU.
" MAX_INPUT_TOKEN_LENGTH = int(os.getenv("MAX_INPUT_TOKEN_LENGTH", "4096")) if torch.cuda.is_available(): model_id = "mistralai/Mistral-7B-Instruct-v0.3" model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.float16, device_map="auto") tokenizer = AutoTokenizer.from_pretrained(model_id) @spaces.GPU def generate(message: str, chat_history: list[dict]) -> Iterator[str]: """Fonction de gĂ©nĂ©ration sans sliders : les paramĂštres de gĂ©nĂ©ration (max_new_tokens, tempĂ©rature, etc.) sont fixĂ©s en dur. """ # On convertit la question en minuscules pour la comparer plus facilement lower_msg = message.strip().lower() # RĂ©ponse fixe pour "C'est quoi un viol ?" if lower_msg == "câest quoi un viol ?" or lower_msg == "c'est quoi un viol ?": fixed_response = """Le viol est un crime
(donc une infraction trĂšs grave punie d'une peine d'emprisonnement)
Le viol se définit comme :
OU
SOIT entre :
OU
SOIT avec :
Ainsi, le viol peut ĂȘtre commis sur :
đQuâest-ce que je fais si jâai vĂ©cu ça ? ? Retourne au menu principal et clique sur le nuage « jâai besoin de ton aide ».
đComment est puni.e le.a violeur ?
đRetrouves la dĂ©finition sur le site LĂ©gifrance, Articles 222-22 et suivants du Code pĂ©nal
""" yield fixed_response return # (Exemple) RĂ©ponse fixe pour "C'est quoi le consentement ? Comment savoir si ma copine a envie de moi ?" if lower_msg == "câest quoi le consentement ? comment savoir si ma copine a envie de moi ?": fixed_response = """Le consentement, pour exister, doit passer par : **Le questionnement de soi-mĂȘme** : il semble nĂ©cessaire de s'intĂ©resser Ă ce que lâon veut prĂ©cisĂ©ment et ce que lâon ne veut pas. Savoir clairement ce que lâon veut faire permet dâĂȘtre en capacitĂ© de le dire Ă lâautre Ă haute voix. Le questionnement de lâautre sur ses envies (clique sur le nuage comment demander le consentement de lâautre si tu veux plus de dĂ©tails). Le respect de son corps et du corps de lâautre, ainsi que de ses envies : faire quelque chose qui nâest pas expressĂ©ment dĂ©sirĂ© par lâautre, tu ne feras point. â ïž **Attention** : Le consentement se limite Ă un moment donnĂ©. Tu as le droit de ne pas consentir Ă une pratique spĂ©cifique, de ne plus consentir au rapport sexuel mĂȘme aprĂšs avoir donnĂ© ton consentement. Tu es prĂ©cieux. Ainsi, il nâexiste pas de devoir sexuel : aucun acte nâest dĂ» Ă lâautre dans toutes les situations. Le consentement se pĂ©rime. Il nâexiste que de maniĂšre temporaire et pour une action particuliĂšre.Billy et Alex sâembrassent. Alex glisse ses mains sous le pull de Billy. Mais Billy nâest pas sĂ»r dâen avoir envie et se sent mal Ă lâaise. Billy a lâimpression dâĂȘtre touchĂ© sans son aval. Alex aurait dĂ» lui demander âEst-ce que je peux ?â ou âEst-ce que tu en as envie ?â
Billy arrĂȘte dâembrasser Alex et lui dit âJâai envie de toi, mais je veux aller Ă mon rythme.â Cela ne veut pas dire que Billy refusera pour toujours tout contact avec Alex. Dans un monde normal, Billy et Alex se demandent Ă chaque progression de leur rapport sâils ont envie.
*đ Comment sâassurer de son consentement ?
* *Retournes sur la page principale et cliques sur le nuage correspondant pour voir toutes les façons de faire. Choisis ce qui te convient et ce qui te rend Ă lâaise đ
* """ yield fixed_response return # Sinon, gĂ©nĂ©ration classique max_new_tokens = 1024 temperature = 0.6 top_p = 0.9 top_k = 50 repetition_penalty = 1.2 conversation = [*chat_history, {"role": "user", "content": message}] input_ids = tokenizer.apply_chat_template(conversation, return_tensors="pt") if input_ids.shape[1] > MAX_INPUT_TOKEN_LENGTH: input_ids = input_ids[:, -MAX_INPUT_TOKEN_LENGTH:] gr.Warning(f"Trimmed input from conversation as it was longer than {MAX_INPUT_TOKEN_LENGTH} tokens.") input_ids = input_ids.to(model.device) streamer = TextIteratorStreamer(tokenizer, timeout=20.0, skip_prompt=True, skip_special_tokens=True) generate_kwargs = dict( {"input_ids": input_ids}, streamer=streamer, max_new_tokens=max_new_tokens, do_sample=True, top_p=top_p, top_k=top_k, temperature=temperature, num_beams=1, repetition_penalty=repetition_penalty, ) t = Thread(target=model.generate, kwargs=generate_kwargs) t.start() outputs = [] for text in streamer: outputs.append(text) yield "".join(outputs) # Interface Gradio demo = gr.ChatInterface( fn=generate, stop_btn=None, examples=[ ["Câest quoi un viol ?"], ["Câest quoi le consentement ? Comment savoir si ma copine a envie de moi ?"], ["Câest quoi une agression sexuelle ?"], ["Câest quoi un attouchement ?"], ["Câest quoi un harcĂšlement sexuel ?"], ["Est-ce illĂ©gal de visionner du porno ?"], ["Mon copain me demande un nude, dois-je le faire ?"], ["Mon ancien copain me menace de poster des photos de moi nue sur internet, que faire ?"], ["Que puis-je faire si un membre de ma famille me touche dâune maniĂšre bizarre, mais que jâai peur de parler ou de ne pas ĂȘtre cru ?"], ], type="messages", description=DESCRIPTION, css_paths="style.css", ) if __name__ == "__main__": demo.queue(max_size=20).launch(share=True)