{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "8c956371",
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install ctransformers huggingface-hub -q"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4696d130",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/matheo/.conda/envs/projet_ia5/lib/python3.11/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
      "  from .autonotebook import tqdm as notebook_tqdm\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Téléchargement du modèle: mistral-7b-instruct-v0.1.Q4_K_M.gguf...\n",
      "Modèle téléchargé dans: /home/matheo/.cache/huggingface/hub/models--TheBloke--Mistral-7B-Instruct-v0.1-GGUF/snapshots/731a9fc8f06f5f5e2db8a0cf9d256197eb6e05d1/mistral-7b-instruct-v0.1.Q4_K_M.gguf\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "from ctransformers import AutoModelForCausalLM\n",
    "from huggingface_hub import hf_hub_download\n",
    "\n",
    "model_repo = \"TheBloke/Mistral-7B-Instruct-v0.1-GGUF\"\n",
    "model_file = \"mistral-7b-instruct-v0.1.Q4_K_M.gguf\"\n",
    "\n",
    "model_path = hf_hub_download(repo_id=model_repo, filename=model_file)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6da8586d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Chargement du modèle sur le CPU (cela peut prendre un moment)...\n",
      "Modèle chargé avec succès.\n"
     ]
    }
   ],
   "source": [
    "llm = AutoModelForCausalLM.from_pretrained(\n",
    "    model_path,\n",
    "    model_type=\"mistral\",\n",
    "    context_length=4096,\n",
    "    gpu_layers=0          # Force l'utilisation du CPU\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f8b27196",
   "metadata": {},
   "outputs": [],
   "source": [
    "def traduire_style_epoque(texte_original: str, epoque_originale: str, epoque_cible: str) -> str:\n",
    "    \n",
    "    # Un \"prompt\" système pour guider le modèle.\n",
    "    # Le format [INST]...[/INST] est spécifique à Mistral Instruct.\n",
    "    prompt = f\"\"\"[INST] Tu es un expert en histoire de la littérature française et un écrivain.\n",
    "    Ta tâche est de réécrire le texte suivant, qui a été écrit dans le style de l'époque \"{epoque_originale}\", pour qu'il corresponde parfaitement au style (vocabulaire, grammaire, syntaxe) de l'époque \"{epoque_cible}\".\n",
    "    Le sens, les idées et le contenu du texte original doivent être préservés au maximum. Ne fais que modifier le style.\n",
    "\n",
    "    TEXTE ORIGINAL ({epoque_originale}):\n",
    "    {texte_original}\n",
    "\n",
    "    RÉÉCRITURE ({epoque_cible}):\n",
    "    [/INST]\"\"\"\n",
    "    \n",
    "    reponse = llm(\n",
    "        prompt, \n",
    "        temperature=0.7, \n",
    "        max_new_tokens=1024, \n",
    "        top_k=40\n",
    "    )\n",
    "    \n",
    "    return reponse"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3120a8cc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Génération de la traduction stylistique de '2024' vers '1670 (style Molière ou La Fontaine)'...\n",
      "--------------------------------------------------\n",
      "\n",
      "--- TEXTE ORIGINAL (2024) ---\n",
      "\n",
      "Salut les gars,\n",
      "J'ai checké le nouveau projet sur le drive, c'est vraiment un truc de ouf.\n",
      "Mon boss m'a dit que le client est super content et que le lancement est prévu pour ce week-end. \n",
      "On va pouvoir décompresser, c'est trop cool.\n",
      "\n",
      "\n",
      "--- TEXTE TRADUIT (1670 (style Molière ou La Fontaine)) ---\n",
      " Salut mes amis,\n",
      "J'ai vérifié le dernier projet sur mon bureau à la nuit, et je suis très content que cela soit bien arrivé.\n",
      "Mon patron m'a informé que le client est extrêmement satisfait et que le lancement est prévu pour ce weekend. \n",
      "On peut décomprimer, c'est trop magnifique.\n"
     ]
    }
   ],
   "source": [
    "# Moderne vers Ancien ---\n",
    "\n",
    "texte_moderne = \"\"\"\n",
    "Salut les gars,\n",
    "J'ai checké le nouveau projet sur le drive, c'est vraiment un truc de ouf.\n",
    "Mon boss m'a dit que le client est super content et que le lancement est prévu pour ce week-end. \n",
    "On va pouvoir décompresser, c'est trop cool.\n",
    "\"\"\"\n",
    "epoque_source_1 = \"2024\"\n",
    "epoque_cible_1 = \"1670 (style Molière ou La Fontaine)\"\n",
    "\n",
    "texte_traduit_1 = traduire_style_epoque(texte_moderne, epoque_source_1, epoque_cible_1)\n",
    "\n",
    "print(\"\\n--- TEXTE TRADUIT (\" + epoque_cible_1 + \") ---\")\n",
    "print(texte_traduit_1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a745126d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Génération de la traduction stylistique de '1720' vers '2024 (style email professionnel)'...\n",
      "--------------------------------------------------\n",
      "\n",
      "--- TEXTE ORIGINAL (1720) ---\n",
      "\n",
      "Monseigneur,\n",
      "Je me fais l'honneur de vous adresser la présente missive afin de requérir votre bienveillance. \n",
      "Les affaires de votre domaine prospèrent, mais la météo capricieuse menace les récoltes.\n",
      "Je crains fort que la disette ne frappe nos manants si le ciel ne nous est point plus clément.\n",
      "Votre très humble et dévoué serviteur.\n",
      "\n",
      "\n",
      "--- TEXTE TRADUIT (2024 (style email professionnel)) ---\n",
      " Subject: Inquiry of Goodwill - Impact of Unfavorable Weather on Crop Yield\n",
      "\n",
      "Dear Sir,\n",
      "\n",
      "I trust this message finds you well and in good spirits. I am reaching out to kindly request your assistance with a matter of utmost concern for our community.\n",
      "\n",
      "As you are aware, the agricultural sector has been thriving under your leadership. However, recent weather conditions have posed an unprecedented challenge - excessive rainfall followed by sudden droughts have disrupted crop growth and yield. This unpredictable climate jeopardizes not only the livelihoods of our farmers but also food security for future generations.\n",
      "\n",
      "I urge you to consider taking proactive measures to mitigate the impact of these extreme weather events on agricultural productivity. It would be greatly appreciated if we could discuss potential solutions at your earliest convenience. \n",
      "\n",
      "Thank you in advance for considering this matter and for your continued commitment towards the welfare of our region.\n",
      "\n",
      "Best regards,\n",
      "[Your Name]\n"
     ]
    }
   ],
   "source": [
    "# Ancien vers Moderne ---\n",
    "\n",
    "texte_ancien = \"\"\"\n",
    "Monseigneur,\n",
    "Je me fais l'honneur de vous adresser la présente missive afin de requérir votre bienveillance. \n",
    "Les affaires de votre domaine prospèrent, mais la météo capricieuse menace les récoltes.\n",
    "Je crains fort que la disette ne frappe nos manants si le ciel ne nous est point plus clément.\n",
    "Votre très humble et dévoué serviteur.\n",
    "\"\"\"\n",
    "epoque_source_2 = \"1720\"\n",
    "epoque_cible_2 = \"2024 (style email professionnel)\"\n",
    "\n",
    "texte_traduit_2 = traduire_style_epoque(texte_ancien, epoque_source_2, epoque_cible_2)\n",
    "\n",
    "print(\"\\n--- TEXTE TRADUIT (\" + epoque_cible_2 + \") ---\")\n",
    "print(texte_traduit_2)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "projet_ia5",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
