#!/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 = """

Un viol

Le viol est un crime
(donc une infraction trĂšs grave punie d'une peine d'emprisonnement)

Le viol se définit comme :

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.

Mise en situation

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)