# ai-typewriter Application Python qui lit la dernière entrée texte du presse-papier avec un raccourci global, l'envoie à un modèle IA, puis remplace chaque pression de touche suivante par le caractère suivant de la réponse. ## Fonctionnement 1. L'utilisateur copie manuellement le texte à envoyer à l'IA. 2. Raccourci global par défaut : `Ctrl+Alt+A`. 3. L'application lit directement la dernière entrée du presse-papier, sans simuler `Ctrl+C`. 4. Le texte capturé est journalisé puis envoyé à Ollama ou Gemini avec le system prompt strict : > Réponds directement et de manière ultra-concise. Aucune phrase d'introduction, aucune salutation, aucun formatage superflu. Uniquement la réponse brute. 5. Le temps de génération de la réponse est journalisé. 6. Quand la réponse arrive, le premier caractère est écrit automatiquement. 7. Le mode dactylographie s'active ensuite : chaque touche physique est interceptée et remplacée par le prochain caractère de la réponse. 8. Le hook clavier est libéré automatiquement après le dernier caractère. ## Installation depuis les sources ```bash python -m venv .venv . .venv/bin/activate pip install -r requirements.txt cp config.json.template config.json python main.py ``` Sous Linux, le paquet `keyboard` nécessite souvent les droits root ou l'accès aux périphériques `/dev/input`. Sous Windows, lancez l'exécutable dans une session utilisateur normale. ## Configuration Copiez `config.json.template` vers `config.json` puis adaptez : ```json { "provider": "ollama", "model": "llama3.1", "api_key": "", "server_url": "http://localhost:11434", "hotkey": "ctrl+alt+a", "request_timeout_seconds": 300, "math_text_format": "plain" } ``` ### Ollama ```json { "provider": "ollama", "model": "llama3.1", "server_url": "http://localhost:11434" } ``` ### Gemini ```json { "provider": "gemini", "model": "gemini-1.5-flash", "api_key": "VOTRE_CLE", "server_url": "https://generativelanguage.googleapis.com" } ``` ### Timeout IA `request_timeout_seconds` vaut `300` par défaut. Si Ollama charge un gros modèle ou répond lentement, augmentez cette valeur. Mettez `0` pour désactiver le timeout côté application. ### Mode mathématique Word La configuration générale reste simple (`math_text_format: "plain"`). Pour les réponses mathématiques, utilisez l'exemple dédié : ```bash cp config.math-word.template config.json ``` Ce fichier active : ```json "math_text_format": "word_equation" ``` Dans ce mode, l'application ne devine plus les maths automatiquement. Elle suit uniquement les balises explicites renvoyées par le modèle : ```text La solution est [EQ]z_1 = x + iy[/EQ]. ``` Injection réelle : 1. texte normal : `La solution est ` ; 2. à `[EQ]`, l'application envoie `Alt+=` ; 3. elle tape `z_1 = x + iy` dans l'éditeur d'équation Word ; 4. à `[/EQ]`, elle envoie `Espace` puis `Flèche droite` pour convertir et sortir de l'équation ; 5. elle reprend le texte normal : `.`. Le prompt de `config.math-word.template` demande aussi au modèle d'éviter le LaTeX non souhaité, notamment `\\frac`, `\\dfrac`, `\\tfrac`, `\\left`, `\\right`, `$`, `$$`, `\\(` et `\\[`. Modes disponibles : - `plain` : injecte la réponse exactement telle que le modèle l'a renvoyée. - `word_equation` : crée des objets Équation Word uniquement pour les blocs `[EQ]...[/EQ]`. - `unicode` : ancien mode texte Unicode (`z_1` → `z₁`, `x^2` → `x²`) sans objet équation. ## Compilation ### Windows Après clonage du dépôt, lancez simplement : ```bat build.bat ``` Le script crée `.venv`, installe les dépendances, nettoie les anciens artefacts puis génère un exécutable Windows autonome : ```text dist\ai-typewriter.exe ``` ### Commande PyInstaller équivalente ```bash pyinstaller --onefile --paths src --name ai-typewriter.exe main.py ``` L'exécutable est généré dans `dist/`. Le binaire n'est pas versionné Git. ## Test rapide sans hook clavier ```bash python main.py --config config.json --ask "Résume: bonjour tout le monde" ```