133 lines
3.7 KiB
Markdown
133 lines
3.7 KiB
Markdown
# 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.
|
|
5. Le temps de génération de la réponse est journalisé.
|
|
6. Quand la réponse arrive, le mode dactylographie s'active.
|
|
7. Chaque touche physique appuyée est interceptée et remplacée par le prochain caractère de la réponse IA.
|
|
8. Le hook clavier est libéré automatiquement après le dernier caractère.
|
|
|
|
L'application n'interprète pas les équations et ne lance pas `Alt+=`. Elle écrit uniquement le texte généré, caractère par caractère. Pour les maths, le modèle peut produire du LaTeX encadré par des marqueurs `[EQ]...[/EQ]`, puis la gestion Word peut être faite ailleurs.
|
|
|
|
## 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.
|
|
|
|
### Configuration maths LaTeX
|
|
|
|
Pour laisser le modèle générer du LaTeX tout en indiquant clairement les débuts/fins d'équations :
|
|
|
|
```bash
|
|
cp config.math-latex.template config.json
|
|
```
|
|
|
|
Cette config garde :
|
|
|
|
```json
|
|
"math_text_format": "plain"
|
|
```
|
|
|
|
Donc l'application ne transforme rien. Elle tape littéralement la réponse reçue, caractère par caractère.
|
|
|
|
Exemple de réponse demandée au modèle :
|
|
|
|
```text
|
|
Les racines sont [EQ]z_1 = x + iy[/EQ] et [EQ]z_2 = x - iy[/EQ].
|
|
```
|
|
|
|
Pour les fractions, intégrales, sommes, etc., le modèle peut utiliser du LaTeX standard dans les balises :
|
|
|
|
```text
|
|
On obtient [EQ]\frac{a+b}{c+d}[/EQ] puis [EQ]\int_0^1 f(x)\,dx[/EQ].
|
|
```
|
|
|
|
Modes disponibles :
|
|
|
|
- `plain` : mode recommandé ; injecte la réponse exactement telle que le modèle l'a renvoyée.
|
|
- `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"
|
|
```
|