mistral_translator 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +44 -0
- data/CONTRIBUTING.md +70 -0
- data/LICENSE.txt +6 -6
- data/README.md +212 -119
- data/README_TESTING.md +33 -0
- data/SECURITY.md +157 -0
- data/docs/.nojekyll +2 -0
- data/docs/404.html +30 -0
- data/docs/README.md +153 -0
- data/docs/advanced-usage/batch-processing.md +158 -0
- data/docs/advanced-usage/concurrent-async.md +270 -0
- data/docs/advanced-usage/error-handling.md +106 -0
- data/docs/advanced-usage/monitoring.md +133 -0
- data/docs/advanced-usage/summarization.md +86 -0
- data/docs/advanced-usage/translations.md +141 -0
- data/docs/api-reference/callbacks.md +231 -0
- data/docs/api-reference/configuration.md +74 -0
- data/docs/api-reference/errors.md +673 -0
- data/docs/api-reference/methods.md +539 -0
- data/docs/getting-started.md +179 -0
- data/docs/index.html +27 -0
- data/docs/installation.md +142 -0
- data/docs/migration-0.1.0-to-0.2.0.md +61 -0
- data/docs/rails-integration/adapters.md +84 -0
- data/docs/rails-integration/controllers.md +107 -0
- data/docs/rails-integration/jobs.md +97 -0
- data/docs/rails-integration/setup.md +339 -0
- data/examples/basic_usage.rb +129 -102
- data/examples/batch-job.rb +511 -0
- data/examples/monitoring-setup.rb +499 -0
- data/examples/rails-model.rb +399 -0
- data/lib/mistral_translator/adapters.rb +261 -0
- data/lib/mistral_translator/client.rb +103 -100
- data/lib/mistral_translator/client_helpers.rb +191 -0
- data/lib/mistral_translator/configuration.rb +191 -1
- data/lib/mistral_translator/errors.rb +16 -0
- data/lib/mistral_translator/helpers.rb +292 -0
- data/lib/mistral_translator/helpers_extensions.rb +150 -0
- data/lib/mistral_translator/levenshtein_helpers.rb +40 -0
- data/lib/mistral_translator/logger.rb +39 -8
- data/lib/mistral_translator/prompt_builder.rb +93 -41
- data/lib/mistral_translator/prompt_helpers.rb +83 -0
- data/lib/mistral_translator/prompt_metadata_helpers.rb +42 -0
- data/lib/mistral_translator/response_parser.rb +194 -23
- data/lib/mistral_translator/security.rb +72 -0
- data/lib/mistral_translator/summarizer.rb +41 -2
- data/lib/mistral_translator/translator.rb +174 -98
- data/lib/mistral_translator/translator_helpers.rb +268 -0
- data/lib/mistral_translator/version.rb +1 -1
- data/lib/mistral_translator.rb +51 -25
- metadata +55 -3
data/SECURITY.md
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# Sécurité - MistralTranslator
|
|
2
|
+
|
|
3
|
+
## 🔒 Améliorations de sécurité implémentées
|
|
4
|
+
|
|
5
|
+
### 1. Validation des entrées utilisateur
|
|
6
|
+
|
|
7
|
+
#### Validation basique (par défaut)
|
|
8
|
+
|
|
9
|
+
- **Longueur des textes** : Limite à 50 000 caractères maximum
|
|
10
|
+
- **Textes vides** : Acceptés et retournés comme chaîne vide (cas d'usage légitime)
|
|
11
|
+
- **Validation des batches** : Maximum 20 textes par batch
|
|
12
|
+
- **Validation des paramètres** : Vérification des types et valeurs
|
|
13
|
+
|
|
14
|
+
#### Protection contre les attaques courantes
|
|
15
|
+
|
|
16
|
+
- **Injection de code** : Détection des patterns dangereux
|
|
17
|
+
- **Scripts malveillants** : Filtrage des balises HTML/JavaScript
|
|
18
|
+
- **Injection SQL** : Détection des patterns SQL malveillants
|
|
19
|
+
- **Traversal de chemins** : Protection contre les accès non autorisés
|
|
20
|
+
|
|
21
|
+
### 2. Rate Limiting côté client
|
|
22
|
+
|
|
23
|
+
#### Fonctionnalités
|
|
24
|
+
|
|
25
|
+
- **Limite par défaut** : 50 requêtes par minute
|
|
26
|
+
- **Configuration flexible** : Limites personnalisables
|
|
27
|
+
- **Thread-safe** : Protection contre les conditions de course
|
|
28
|
+
- **Attente intelligente** : Délai automatique quand la limite est atteinte
|
|
29
|
+
|
|
30
|
+
#### Configuration
|
|
31
|
+
|
|
32
|
+
```ruby
|
|
33
|
+
# Via variables d'environnement
|
|
34
|
+
MISTRAL_RATE_LIMIT_MAX_REQUESTS=100
|
|
35
|
+
MISTRAL_RATE_LIMIT_WINDOW=60
|
|
36
|
+
|
|
37
|
+
# Via code
|
|
38
|
+
rate_limiter = MistralTranslator::Security::BasicRateLimiter.new(
|
|
39
|
+
max_requests: 100,
|
|
40
|
+
window_seconds: 60
|
|
41
|
+
)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 3. Gestion sécurisée des erreurs
|
|
45
|
+
|
|
46
|
+
#### Nouvelles exceptions
|
|
47
|
+
|
|
48
|
+
- `SecurityError` : Violations de sécurité détectées
|
|
49
|
+
- `RateLimitExceededError` : Limite de taux dépassée
|
|
50
|
+
|
|
51
|
+
#### Messages d'erreur sécurisés
|
|
52
|
+
|
|
53
|
+
- Aucune exposition d'informations sensibles
|
|
54
|
+
- Messages d'erreur génériques pour éviter les fuites
|
|
55
|
+
|
|
56
|
+
### 4. Optimisation de la taille
|
|
57
|
+
|
|
58
|
+
#### Réduction significative
|
|
59
|
+
|
|
60
|
+
- **Avant** : ~4000+ lignes avec validation complète
|
|
61
|
+
- **Après** : 3197 lignes avec sécurité essentielle
|
|
62
|
+
- **Gain** : ~20% de réduction de taille
|
|
63
|
+
|
|
64
|
+
#### Architecture modulaire
|
|
65
|
+
|
|
66
|
+
- Module de sécurité optionnel et léger
|
|
67
|
+
- Validation basique par défaut
|
|
68
|
+
- Possibilité d'extension future
|
|
69
|
+
|
|
70
|
+
## 🛡️ Utilisation sécurisée
|
|
71
|
+
|
|
72
|
+
### Configuration recommandée
|
|
73
|
+
|
|
74
|
+
```ruby
|
|
75
|
+
MistralTranslator.configure do |config|
|
|
76
|
+
config.api_key = ENV['MISTRAL_API_KEY']
|
|
77
|
+
config.enable_metrics = true
|
|
78
|
+
|
|
79
|
+
# Callbacks de sécurité
|
|
80
|
+
config.on_translation_error = lambda do |from, to, error, attempt, timestamp|
|
|
81
|
+
Rails.logger.error "[Security] Translation failed: #{error.class.name}"
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Cas d'usage légitimes
|
|
87
|
+
|
|
88
|
+
- **Textes vides** : Acceptés automatiquement (retournent une chaîne vide)
|
|
89
|
+
- **Même langue source/cible** : Retourne le texte original sans appel API
|
|
90
|
+
- **Validation permissive** : Focus sur la sécurité sans bloquer l'usage normal
|
|
91
|
+
|
|
92
|
+
### Bonnes pratiques
|
|
93
|
+
|
|
94
|
+
1. **Validation côté client** : Toujours valider les entrées avant l'envoi
|
|
95
|
+
2. **Gestion des erreurs** : Capturer et logger les erreurs de sécurité
|
|
96
|
+
3. **Monitoring** : Surveiller les tentatives de rate limiting
|
|
97
|
+
4. **Mise à jour** : Maintenir la gem à jour pour les dernières corrections
|
|
98
|
+
|
|
99
|
+
## 🔍 Tests de sécurité
|
|
100
|
+
|
|
101
|
+
### Couverture des tests
|
|
102
|
+
|
|
103
|
+
- Validation des entrées malveillantes
|
|
104
|
+
- Tests de rate limiting
|
|
105
|
+
- Vérification de la thread-safety
|
|
106
|
+
- Tests d'encodage et de format
|
|
107
|
+
|
|
108
|
+
### Exécution des tests
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
# Tests de sécurité uniquement
|
|
112
|
+
bundle exec rspec spec/mistral_translator/security_spec.rb
|
|
113
|
+
|
|
114
|
+
# Tests de sécurité existants
|
|
115
|
+
bundle exec rspec spec/mistral_translator/security_spec.rb
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## 📊 Métriques de sécurité
|
|
119
|
+
|
|
120
|
+
### Indicateurs surveillés
|
|
121
|
+
|
|
122
|
+
- Nombre de requêtes bloquées par validation
|
|
123
|
+
- Fréquence des rate limits
|
|
124
|
+
- Types d'erreurs de sécurité
|
|
125
|
+
- Temps de réponse moyen
|
|
126
|
+
|
|
127
|
+
### Accès aux métriques
|
|
128
|
+
|
|
129
|
+
```ruby
|
|
130
|
+
# Métriques globales
|
|
131
|
+
MistralTranslator.metrics
|
|
132
|
+
|
|
133
|
+
# Réinitialisation
|
|
134
|
+
MistralTranslator.reset_metrics!
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## 🚨 Signaler des vulnérabilités
|
|
138
|
+
|
|
139
|
+
Si vous découvrez une vulnérabilité de sécurité :
|
|
140
|
+
|
|
141
|
+
1. **Ne pas** ouvrir d'issue publique
|
|
142
|
+
2. Envoyer un email à : security@mistral-translator.dev
|
|
143
|
+
3. Inclure : description, étapes de reproduction, impact
|
|
144
|
+
|
|
145
|
+
## 📝 Changelog de sécurité
|
|
146
|
+
|
|
147
|
+
### Version 0.2.0
|
|
148
|
+
|
|
149
|
+
- ✅ Validation basique des entrées
|
|
150
|
+
- ✅ Rate limiting côté client
|
|
151
|
+
- ✅ Nouvelles exceptions de sécurité
|
|
152
|
+
- ✅ Optimisation de la taille de la gem
|
|
153
|
+
- ✅ Tests de sécurité complets
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
_Cette documentation est mise à jour à chaque amélioration de sécurité._
|
data/docs/.nojekyll
ADDED
data/docs/404.html
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<title>404 - MistralTranslator Docs</title>
|
|
6
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
|
7
|
+
<meta
|
|
8
|
+
name="description"
|
|
9
|
+
content="Page non trouvée - MistralTranslator documentation"
|
|
10
|
+
/>
|
|
11
|
+
<meta
|
|
12
|
+
name="viewport"
|
|
13
|
+
content="width=device-width, initial-scale=1.0, minimum-scale=1.0"
|
|
14
|
+
/>
|
|
15
|
+
<link
|
|
16
|
+
rel="stylesheet"
|
|
17
|
+
href="//cdn.jsdelivr.net/npm/docsify@4/lib/themes/vue.css"
|
|
18
|
+
/>
|
|
19
|
+
</head>
|
|
20
|
+
<body>
|
|
21
|
+
<div id="app"></div>
|
|
22
|
+
<script>
|
|
23
|
+
window.$docsify = {
|
|
24
|
+
name: "MistralTranslator",
|
|
25
|
+
repo: "peyochanchan/mistral_translator",
|
|
26
|
+
};
|
|
27
|
+
</script>
|
|
28
|
+
<script src="//cdn.jsdelivr.net/npm/docsify@4"></script>
|
|
29
|
+
</body>
|
|
30
|
+
</html>
|
data/docs/README.md
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
> **Navigation :** [🏠 Home](README.md) • [📖 API Reference](api-reference/methods.md) • [⚡ Advanced Usage](advanced-usage/translations.md) • [🛤️ Rails Integration](rails-integration/setup.md)
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Documentation MistralTranslator
|
|
6
|
+
|
|
7
|
+
Bienvenue dans la documentation complète de **MistralTranslator**, une gem Ruby puissante pour la traduction et la synthèse de texte utilisant l'API Mistral AI.
|
|
8
|
+
|
|
9
|
+
## 🚀 Démarrage Rapide
|
|
10
|
+
|
|
11
|
+
```ruby
|
|
12
|
+
# Installation
|
|
13
|
+
gem 'mistral_translator'
|
|
14
|
+
|
|
15
|
+
# Configuration
|
|
16
|
+
MistralTranslator.configure { |c| c.api_key = ENV['MISTRAL_API_KEY'] }
|
|
17
|
+
|
|
18
|
+
# Usage
|
|
19
|
+
result = MistralTranslator.translate("Bonjour le monde", from: "fr", to: "en")
|
|
20
|
+
# => "Hello world"
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 📚 Guide de Documentation
|
|
24
|
+
|
|
25
|
+
### 🎯 Pour Commencer
|
|
26
|
+
|
|
27
|
+
| Fichier | Description | Niveau |
|
|
28
|
+
| ------------------------------------------------------ | ----------------------------------------------- | -------- |
|
|
29
|
+
| [Installation](installation.md) | Installation de la gem et configuration de base | Débutant |
|
|
30
|
+
| [Guide de Démarrage](getting-started.md) | Premiers pas avec exemples simples | Débutant |
|
|
31
|
+
| [Exemples de Base](../examples/basic_usage.rb) | Code commenté pour débuter | Débutant |
|
|
32
|
+
| [Migration 0.1.0 → 0.2.0](migration-0.1.0-to-0.2.0.md) | Changements clés et guide de migration | Tous |
|
|
33
|
+
|
|
34
|
+
### ⚡ Fonctionnalités Avancées
|
|
35
|
+
|
|
36
|
+
| Fichier | Description | Contenu Principal |
|
|
37
|
+
| -------------------------------------------------------- | ---------------------------------------------- | ------------------------------------------------- |
|
|
38
|
+
| [Traductions Avancées](advanced-usage/translations.md) | Contexte, glossaires, HTML, auto-détection | `translate_with_confidence()`, `translate_auto()` |
|
|
39
|
+
| [Traitement par Lot](advanced-usage/batch-processing.md) | Optimisation batch, multi-langues, progression | `translate_batch()`, `translate_to_multiple()` |
|
|
40
|
+
| [Résumés Intelligents](advanced-usage/summarization.md) | Multi-niveaux, multi-langues, Rails | `summarize()`, `summarize_tiered()` |
|
|
41
|
+
| [Gestion des Erreurs](advanced-usage/error-handling.md) | Retry, circuit breaker, fallback strategies | Patterns de robustesse |
|
|
42
|
+
| [Monitoring](advanced-usage/monitoring.md) | Métriques, dashboard, alertes | Analytics et observabilité |
|
|
43
|
+
|
|
44
|
+
### 🛤️ Intégration Rails
|
|
45
|
+
|
|
46
|
+
| Fichier | Description | Gems Supportées |
|
|
47
|
+
| ------------------------------------------------------- | --------------------------------------- | ------------------------- |
|
|
48
|
+
| [Configuration Rails](rails-integration/setup.md) | Initializers, environnements, callbacks | Rails 7+ |
|
|
49
|
+
| [Adaptateurs de Modèles](rails-integration/adapters.md) | Intégration transparente avec gems I18n | Mobility, Globalize, I18n |
|
|
50
|
+
| [Jobs Asynchrones](rails-integration/jobs.md) | Traduction en arrière-plan | Sidekiq, ActiveJob |
|
|
51
|
+
| [Controllers & API](rails-integration/controllers.md) | Endpoints, dashboard admin | REST API, Admin UI |
|
|
52
|
+
|
|
53
|
+
### 📖 Référence API
|
|
54
|
+
|
|
55
|
+
| Fichier | Description | Usage |
|
|
56
|
+
| ----------------------------------------------- | ----------------------------------- | ----------------------------- |
|
|
57
|
+
| [Configuration](api-reference/configuration.md) | Toutes les options de configuration | `MistralTranslator.configure` |
|
|
58
|
+
| [Méthodes](api-reference/methods.md) | Documentation complète des méthodes | API publique |
|
|
59
|
+
| [Erreurs](api-reference/errors.md) | Types d'erreurs et codes de gestion | `rescue` patterns |
|
|
60
|
+
| [Callbacks](api-reference/callbacks.md) | Événements et hooks personnalisés | Monitoring custom |
|
|
61
|
+
|
|
62
|
+
### 💻 Exemples Pratiques
|
|
63
|
+
|
|
64
|
+
| Fichier | Description | Cas d'Usage |
|
|
65
|
+
| --------------------------------------------------- | --------------------------------- | --------------- |
|
|
66
|
+
| [Usage de Base](../examples/basic_usage.rb) | Script simple avec commentaires | Premier projet |
|
|
67
|
+
| [Modèle Rails](../examples/rails-model.rb) | Modèle complet avec traductions | App Rails |
|
|
68
|
+
| [Job de Traitement](../examples/batch-job.rb) | Job Sidekiq pour batch | Production |
|
|
69
|
+
| [Setup Monitoring](../examples/monitoring-setup.rb) | Configuration complète monitoring | Ops & Analytics |
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 🎯 Cas d'Usage Principaux
|
|
74
|
+
|
|
75
|
+
### 🌐 **Applications Multilingues**
|
|
76
|
+
|
|
77
|
+
- E-commerce international
|
|
78
|
+
- Sites web multilingues
|
|
79
|
+
- Applications SaaS globales
|
|
80
|
+
- Documentation technique
|
|
81
|
+
|
|
82
|
+
### 📝 **Traitement de Contenu**
|
|
83
|
+
|
|
84
|
+
- Résumés automatiques d'articles
|
|
85
|
+
- Synthèse de rapports
|
|
86
|
+
- Newsletter multilingues
|
|
87
|
+
- Support client automatisé
|
|
88
|
+
|
|
89
|
+
### 🔧 **Intégration Système**
|
|
90
|
+
|
|
91
|
+
- CMS multilingues
|
|
92
|
+
- APIs de traduction
|
|
93
|
+
- Workflows de contenu
|
|
94
|
+
- Automation marketing
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 🏃♂️ Parcours Recommandés
|
|
99
|
+
|
|
100
|
+
### **👶 Débutant - Premiers Pas**
|
|
101
|
+
|
|
102
|
+
1. [Installation](installation.md) - Installer et configurer
|
|
103
|
+
2. [Guide de Démarrage](getting-started.md) - Premiers exemples
|
|
104
|
+
3. [Exemples de Base](../examples/basic_usage.rb) - Code pratique
|
|
105
|
+
|
|
106
|
+
### **⚡ Développeur Rails**
|
|
107
|
+
|
|
108
|
+
1. [Configuration Rails](rails-integration/setup.md) - Setup Rails
|
|
109
|
+
2. [Adaptateurs](rails-integration/adapters.md) - Mobility/Globalize
|
|
110
|
+
3. [Modèle Rails](../examples/rails-model.rb) - Exemple complet
|
|
111
|
+
|
|
112
|
+
### **🚀 Usage Production**
|
|
113
|
+
|
|
114
|
+
1. [Gestion des Erreurs](advanced-usage/error-handling.md) - Robustesse
|
|
115
|
+
2. [Monitoring](advanced-usage/monitoring.md) - Observabilité
|
|
116
|
+
3. [Jobs Asynchrones](rails-integration/jobs.md) - Scalabilité
|
|
117
|
+
|
|
118
|
+
### **📊 Analytics & Ops**
|
|
119
|
+
|
|
120
|
+
1. [Monitoring](advanced-usage/monitoring.md) - Métriques
|
|
121
|
+
2. [Setup Monitoring](../examples/monitoring-setup.rb) - Configuration
|
|
122
|
+
3. [API Référence](api-reference/configuration.md) - Tuning avancé
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## 🆘 Aide et Support
|
|
127
|
+
|
|
128
|
+
- **🐛 Problème ?** → Consultez [Gestion des Erreurs](advanced-usage/error-handling.md)
|
|
129
|
+
- **⚙️ Configuration ?** → Voir [API Configuration](api-reference/configuration.md)
|
|
130
|
+
- **🛤️ Rails ?** → Section [Intégration Rails](rails-integration/setup.md)
|
|
131
|
+
- **📈 Performance ?** → Guide [Monitoring](advanced-usage/monitoring.md)
|
|
132
|
+
|
|
133
|
+
## 🎯 Navigation Rapide
|
|
134
|
+
|
|
135
|
+
**Recherche par fonctionnalité :**
|
|
136
|
+
|
|
137
|
+
- **Traduction simple** → [Getting Started](getting-started.md#traduction-simple)
|
|
138
|
+
- **Traduction HTML** → [Traductions Avancées](advanced-usage/translations.md#html-preservation)
|
|
139
|
+
- **Résumés** → [Résumés Intelligents](advanced-usage/summarization.md)
|
|
140
|
+
- **Batch processing** → [Traitement par Lot](advanced-usage/batch-processing.md)
|
|
141
|
+
- **Intégration Mobility** → [Adaptateurs](rails-integration/adapters.md#mobility)
|
|
142
|
+
- **Jobs Sidekiq** → [Jobs Asynchrones](rails-integration/jobs.md#sidekiq)
|
|
143
|
+
- **Dashboard admin** → [Controllers](rails-integration/controllers.md#dashboard)
|
|
144
|
+
|
|
145
|
+
**Par niveau de complexité :**
|
|
146
|
+
|
|
147
|
+
- 🟢 **Facile** : Installation, Getting Started, Exemples
|
|
148
|
+
- 🟡 **Moyen** : Traductions Avancées, Rails Setup, Jobs
|
|
149
|
+
- 🔴 **Avancé** : Error Handling, Monitoring, API Référence
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
_📝 Cette documentation est maintenue et mise à jour régulièrement. Pour des suggestions d'amélioration, n'hésitez pas à contribuer !_
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
> **Navigation :** [🏠 Home](README.md) • [📖 API Reference](api-reference/methods.md) • [⚡ Advanced Usage](advanced-usage/translations.md) • [🛤️ Rails Integration](rails-integration/setup.md)
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Traitement par Lot (Batch)
|
|
6
|
+
|
|
7
|
+
Optimisez vos traductions avec le traitement par lot et les traductions multiples.
|
|
8
|
+
|
|
9
|
+
## 📦 Batch Basique
|
|
10
|
+
|
|
11
|
+
```ruby
|
|
12
|
+
texts = ["Bonjour", "Comment ça va ?", "Au revoir"]
|
|
13
|
+
|
|
14
|
+
translator = MistralTranslator::Translator.new
|
|
15
|
+
results = translator.translate_batch(texts, from: "fr", to: "en")
|
|
16
|
+
|
|
17
|
+
results.each { |index, translation| puts "#{index}: #{translation}" }
|
|
18
|
+
# => 0: Hello
|
|
19
|
+
# => 1: How are you?
|
|
20
|
+
# => 2: Goodbye
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 🌍 Multi-langues
|
|
24
|
+
|
|
25
|
+
```ruby
|
|
26
|
+
# Vers plusieurs langues simultanément
|
|
27
|
+
results = translator.translate_to_multiple(
|
|
28
|
+
"Bienvenue",
|
|
29
|
+
from: "fr",
|
|
30
|
+
to: ["en", "es", "de", "it"],
|
|
31
|
+
use_batch: true # Optimisation
|
|
32
|
+
)
|
|
33
|
+
# => {"en" => "Welcome", "es" => "Bienvenido", ...}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## ⚡ Avec Gestion d'Erreurs
|
|
37
|
+
|
|
38
|
+
```ruby
|
|
39
|
+
# Fallback automatique en cas d'échec
|
|
40
|
+
results = MistralTranslator::Helpers.translate_batch_with_fallback(
|
|
41
|
+
texts,
|
|
42
|
+
from: "fr",
|
|
43
|
+
to: "en",
|
|
44
|
+
fallback_strategy: :individual # Retry individuellement
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
results.each do |index, result|
|
|
48
|
+
if result.is_a?(Hash) && result[:error]
|
|
49
|
+
puts "❌ Erreur #{index}: #{result[:error]}"
|
|
50
|
+
else
|
|
51
|
+
puts "✅ #{index}: #{result}"
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## 📊 Avec Progression
|
|
57
|
+
|
|
58
|
+
```ruby
|
|
59
|
+
# Pour gros volumes
|
|
60
|
+
MistralTranslator::Helpers.translate_with_progress(
|
|
61
|
+
large_texts.each_with_index.to_h,
|
|
62
|
+
from: "fr",
|
|
63
|
+
to: "en"
|
|
64
|
+
) do |current, total, key, result|
|
|
65
|
+
progress = (current.to_f / total * 100).round(1)
|
|
66
|
+
puts "📈 [#{progress}%] #{key}"
|
|
67
|
+
end
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## 🚦 Rate Limiting
|
|
71
|
+
|
|
72
|
+
```ruby
|
|
73
|
+
# Délai intelligent entre batches
|
|
74
|
+
def process_large_batch(texts, batch_size: 10)
|
|
75
|
+
texts.each_slice(batch_size).with_index do |batch, i|
|
|
76
|
+
results = translator.translate_batch(batch, from: "fr", to: "en")
|
|
77
|
+
|
|
78
|
+
# Pause entre batches (sauf le dernier)
|
|
79
|
+
sleep(2) unless i == (texts.size / batch_size.to_f).ceil - 1
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## 💾 Avec Cache
|
|
85
|
+
|
|
86
|
+
```ruby
|
|
87
|
+
def cached_batch_translate(texts, from:, to:)
|
|
88
|
+
results = []
|
|
89
|
+
to_translate = []
|
|
90
|
+
|
|
91
|
+
# Vérifier le cache
|
|
92
|
+
texts.each_with_index do |text, index|
|
|
93
|
+
cache_key = "translation:#{Digest::MD5.hexdigest(text)}:#{from}:#{to}"
|
|
94
|
+
cached = Rails.cache.read(cache_key)
|
|
95
|
+
|
|
96
|
+
if cached
|
|
97
|
+
results[index] = cached
|
|
98
|
+
else
|
|
99
|
+
to_translate << { text: text, index: index, cache_key: cache_key }
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Traduire seulement ce qui n'est pas en cache
|
|
104
|
+
unless to_translate.empty?
|
|
105
|
+
fresh_results = translator.translate_batch(
|
|
106
|
+
to_translate.map { |item| item[:text] },
|
|
107
|
+
from: from, to: to
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
# Sauver en cache
|
|
111
|
+
fresh_results.each do |batch_index, translation|
|
|
112
|
+
original_index = to_translate[batch_index][:index]
|
|
113
|
+
cache_key = to_translate[batch_index][:cache_key]
|
|
114
|
+
|
|
115
|
+
Rails.cache.write(cache_key, translation, expires_in: 24.hours)
|
|
116
|
+
results[original_index] = translation
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
results
|
|
121
|
+
end
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## 📈 Configuration Batch
|
|
125
|
+
|
|
126
|
+
```ruby
|
|
127
|
+
MistralTranslator.configure do |config|
|
|
128
|
+
config.retry_delays = [1, 3, 6] # Plus rapide pour batch
|
|
129
|
+
|
|
130
|
+
config.on_batch_complete = ->(size, duration, success, errors) {
|
|
131
|
+
rate = (success.to_f / size * 100).round(1)
|
|
132
|
+
puts "📊 Batch: #{success}/#{size} (#{rate}%) en #{duration.round(2)}s"
|
|
133
|
+
}
|
|
134
|
+
end
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## 🎯 Patterns Recommandés
|
|
138
|
+
|
|
139
|
+
**Petits volumes (< 50 textes) :**
|
|
140
|
+
|
|
141
|
+
- Batch simple sans optimisation
|
|
142
|
+
|
|
143
|
+
**Moyens volumes (50-500 textes) :**
|
|
144
|
+
|
|
145
|
+
- Batch avec cache + rate limiting
|
|
146
|
+
|
|
147
|
+
**Gros volumes (> 500 textes) :**
|
|
148
|
+
|
|
149
|
+
- Jobs asynchrones + progression + cache
|
|
150
|
+
|
|
151
|
+
**Multi-langues :**
|
|
152
|
+
|
|
153
|
+
- `use_batch: true` pour optimisation API
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
**Advanced Usage Navigation:**
|
|
158
|
+
[← Translations](advanced-usage/translations.md) | [Batch Processing](advanced-usage/batch-processing.md) | [Error Handling](advanced-usage/error-handling.md) | [Monitoring](advanced-usage/monitoring.md) | [Summarization](advanced-usage/summarization.md) →
|