# AI-Typewriter Application Python qui **lit le contenu du presse-papier** sur un raccourci global, l'envoie à un modèle IA, puis réécrit la réponse **caractère par caractère** à chaque pression de touche physique. Une **fenêtre unifiée à trois onglets** (Profils / Authentification / Logs) permet de tout configurer sans fenêtres éparpillées. Fermer la fenêtre (✕) la masque dans la zone de notification — l'application continue de tourner. Le menu de l'icône de notification réaffiche la fenêtre dans le bon onglet, et la commutation de profil reste directement accessible depuis l'icône (sans afficher la fenêtre). Un profil spécialisé « Mathématiques (LaTeX) » marque les équations avec `[EQ]...[/EQ]` : l'application les intercepte et déclenche `Alt+=` pour ouvrir une équation (Word/OneNote) et `→` pour en sortir. ## Fonctionnement 1. L'utilisateur copie le texte à envoyer à l'IA. 2. Raccourci global par défaut : `Ctrl+Alt+A`. 3. L'application lit le presse-papier et envoie au modèle du profil actif. 4. Une icône reste disponible dans la zone de notification : elle permet d'ouvrir les journaux, d'ajouter/commuter des profils et de gérer les clés d'API. 5. Chaque touche physique appuyée ensuite écrit l'élément suivant de la réponse (caractère ou séquence d'équation). 6. Le hook clavier est libéré automatiquement à la fin de la réponse. ## Installation depuis les sources ```bash python -m venv .venv . .venv/bin/activate # Windows : .venv\Scripts\activate pip install -r requirements.txt pip install -e . python main.py ``` À la première exécution, l'application crée son fichier de configuration : `%APPDATA%\ai-typewriter\config.json` (Linux : `~/.config/ai-typewriter/config.json`). ## Configuration (profils) La configuration contient une liste de **profils** nommés et le profil actif. Chaque profil décrit : | Champ | Description | |---|---| | `name` | Libellé affiché dans les menus | | `provider` | `ollama`, `openai`, `openrouter`, `gemini`, `custom` (OpenAI-compatible) | | `model` | Nom du modèle (choisissable via le sélecteur) | | `server_url` | Base de l'instance (ex. `http://localhost:11434`) | | `credential` | Nom logique de la clé d'API (voir « Authentification ») | | `system_prompt` | Instructions données au modèle | | `equation_enabled` | Active l'interception des marqueurs d'équation | | `eq_start_marker` / `eq_end_marker` | Marqueurs (défaut `[EQ]` / `[/EQ]`) | | `eq_start_key` / `eq_end_key` | Touches déclenchées (défaut `alt+=` / `right`) | Deux profils sont créés par défaut : **Général** et **Mathématiques (LaTeX)**. ### Profil Mathématiques (LaTeX) Le prompt système demande au modèle de produire du LaTeX encadré par `[EQ]...[/EQ]`, par exemple : ```text Les racines sont [EQ]z_1 = x + iy[/EQ] et [EQ]z_2 = x - iy[/EQ]. ``` À chaque `[EQ]` l'application envoie `Alt+=` (ouvre une équation inline), tape le LaTeX littéralement, puis envoie `→` à chaque `[/EQ]`. Ce comportement est désactivé par défaut sur les autres profils (le texte est tapé tel quel). ## Fenêtre unifiée (onglets) L'application démarre avec **une seule fenêtre** comportant trois onglets : - **Profils** — liste de tous les profils (éditeur intégré) pour créer, modifier, supprimer ou activer un profil directement. - **Authentification** — enregistrement/vérification/suppression des clés d'API par référence. - **Logs** — journaux en temps réel (également écrits dans `~/.config/ai-typewriter/logs/app.log`). ## Zone de notification (icône) Fermer la fenêtre (✕) ne quitte **pas** l'application : elle est masquée et continue de tourner, avec l'icône toujours visible dans la zone de notification. Le menu de l'icône propose : - **Ouvrir les logs** — réaffiche la fenêtre dans l'onglet *Logs*. - **Ajouter un profil** — réaffiche la fenêtre dans l'onglet *Profils* (formulaire vierge pour créer). - **Modifier le profil** — sous-menu listant tous les profils pour choisir le profil actif **directement** (sans afficher la fenêtre). - **Gérer l'authentification** — réaffiche la fenêtre dans l'onglet *Authentification*. - **Quitter** — arrête complètement le processus. ### Sélection et téléchargement des modèles Dans le formulaire de profil, « Choisir / télécharger… » ouvre un sélecteur qui : - liste automatiquement les modèles déjà disponibles localement (Ollama `/api/tags`) ; - si connecté à Internet, permet de rechercher dans la bibliothèque publique d'Ollama, de vérifier un modèle exact et de lancer son téléchargement (`ollama pull`). ### Authentification des fournisseurs Les clés d'API ne sont **jamais écrites** dans le fichier de configuration. Chaque profil référence une clé par un nom logique ; la clé est stockée de façon sécurisée dans le **Gestionnaire d'identifiants de Windows** (via `keyring`). Le menu **Gérer l'authentification** permet de les enregistrer, vérifier ou supprimer. ## Compilation (Windows) ```bat build.bat ``` Le script crée `.venv`, installe les dépendances, puis produit un exécutable autonome **sans console** dans `dist\ai-typewriter.exe`. Il tourne directement en zone de notification. ## Test rapide sans hook clavier ni icône ```bash python main.py --debug --ask "Résume: bonjour tout le monde" ``` Envoie le prompt au profil actif et imprime la réponse brute (aucune icône ni interception clavier). ## Tests ```bash . .venv/bin/activate pytest ``` La suite couvre le découpage en actions (caractères/équations), le stepper, le dépôt de profils, les clients IA (Ollama/Gemini/OpenAI), le stockage sécurisé (keyring mocké) et le catalogue de modèles — sans réel hook clavier, réseau ni Gestionnaire d'identifiants.