commit 0460984618db0c8b94b596799af6747cb7c232bc Author: truetype Date: Fri Jan 9 18:06:45 2026 +0100 Initial commit: Ollama Translator Web App diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..146e317 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +# Ambiente virtuale +venv/ +ENV/ +env/ + +# File Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +*.egg-info/ +dist/ +build/ + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# File di log +*.log + diff --git a/ReadMe.MD b/ReadMe.MD new file mode 100644 index 0000000..f6f9ea4 --- /dev/null +++ b/ReadMe.MD @@ -0,0 +1,231 @@ +# 🌍 Traduttore Ollama + +Un'applicazione web moderna per tradurre testi lunghi utilizzando modelli locali di Ollama. Supporta oltre 30 lingue e utilizza chunking intelligente per gestire testi di qualsiasi lunghezza. + +## πŸ“‹ Caratteristiche + +- βœ… **Supporto multi-lingua**: 30+ lingue (cinese, inglese, spagnolo, francese, tedesco, italiano, giapponese, coreano, russo, arabo, e molte altre) +- βœ… **Gestione testi lunghi**: Chunking automatico a 500 token per elaborare documenti estesi +- βœ… **UI moderna e responsiva**: Design elegante con gradient background e animazioni fluide +- βœ… **Barra di progresso**: Visualizzazione in tempo reale dell'elaborazione dei chunk +- βœ… **Ottimizzazione modello**: Parametri `top_p=0.6` e `repeat_penalty=1.1` per miglior qualitΓ  +- βœ… **Copia negli appunti**: Pulsante per copiare la traduzione con un click +- βœ… **Gestione errori robusta**: Messaggi di errore chiari e dettagliati +- βœ… **Health check**: Verificare lo stato di Ollama e i modelli disponibili + +## πŸš€ Installazione Rapida + +### Prerequisiti + +- **Python 3.8+** +- **Ollama** in esecuzione su `192.168.0.170:11434` con il modello `xieweicong95/HY-MT1.5-1.8B` scaricato + +### Step 1: Clona o crea la directory del progetto + +mkdir ollama-traduttore +cd ollama-traduttore + +### Step 2: Crea l'ambiente virtuale + +**Su Windows (CMD o PowerShell):** +python -m venv venv +venv\Scripts\activate + +**Su Linux/Mac:** +python3 -m venv venv +source venv/bin/activate + +### Step 3: Installa le dipendenze + +pip install -r requirements.txt + +### Step 4: Assicurati che Ollama sia pronto + +# Verifica che Ollama sia in esecuzione +ollama list + +# Se il modello non Γ¨ presente, scaricalo +ollama pull xieweicong95/HY-MT1.5-1.8B + +# Avvia Ollama (se non Γ¨ giΓ  running) +ollama serve + +### Step 5: Avvia l'applicazione + +python app.py + +L'applicazione sarΓ  disponibile su: **`http://localhost:5000`** + +## πŸ“ Struttura del Progetto + +ollama-traduttore/ +β”œβ”€β”€ app.py # Backend Flask +β”œβ”€β”€ requirements.txt # Dipendenze Python +β”œβ”€β”€ templates/ +β”‚ └── index.html # Frontend HTML/CSS/JS +└── venv/ # Ambiente virtuale + +## πŸ”§ Configurazione + +### Cambiare l'indirizzo di Ollama + +Se Ollama Γ¨ su un indirizzo/porta diverso, modifica `app.py`: + +OLLAMA_BASE_URL = "http://192.168.0.170:11434" # Cambia questo + +### Cambiare il modello + +Per usare un modello diverso, modifica in `app.py`: + +OLLAMA_MODEL = "xieweicong95/HY-MT1.5-1.8B" # Cambia questo + +### Regolare i parametri di traduzione + +I parametri di qualitΓ  sono configurabili in `app.py`: + +OLLAMA_PARAMS = { + "top_p": 0.6, # DiversitΓ  del sampling (0.0-1.0) + "repeat_penalty": 1.1 # PenalitΓ  per ripetizioni (1.0-2.0) +} + +## πŸ“– Come Usare + +1. **Incolla il testo** da tradurre nella textarea +2. **Seleziona la lingua di destinazione** dal dropdown +3. **Opzionalmente**, specifica la lingua sorgente (default: autodetect) +4. **Clicca "Traduci"** e attendi il completamento +5. **Copia la traduzione** con il pulsante "Copia" o selezionala manualmente + +### Lingue Supportate + +#### Principali / Molto comuni +- Cinese (mandarino) semplificato +- Cinese tradizionale +- Cantonese (dialetto) +- Inglese +- Spagnolo +- Francese +- Tedesco +- Italiano +- Portoghese +- Giapponese +- Coreano +- Russo +- Arabo +- Turco + +#### Europee e minori +- Olandese +- Polacco +- Ceco +- Islandese +- Estone +- Ucraino + +#### Asia e Medio Oriente +- Vietnamita +- Tailandese +- Malese +- Indonesiano +- Filippino / Tagalog +- Birmano (Myanmar) +- Khmer / Cambogiano +- Persiano +- Ebraico +- Hindi +- Marathi +- Bengali +- Tamil +- Gujarati + +## πŸ”Œ API Endpoints + +### POST `/api/translate` + +Traduce un testo usando Ollama. + +**Request:** +{ + "prompt": "Translate the following text into [Language]...", + "model": "xieweicong95/HY-MT1.5-1.8B", + "stream": false +} + +**Response:** +{ + "success": true, + "translation": "Testo tradotto...", + "response": "Testo tradotto...", + "model": "xieweicong95/HY-MT1.5-1.8B" +} + +### GET `/api/health` + +Verifica lo stato di Ollama e i modelli disponibili. + +**Response:** +{ + "status": "healthy", + "ollama_url": "http://192.168.0.170:11434", + "available_models": ["xieweicong95/HY-MT1.5-1.8B", "..."], + "target_model": "xieweicong95/HY-MT1.5-1.8B", + "model_available": true +} + +## πŸ› οΈ Troubleshooting + +### Errore: "Impossibile connettersi a Ollama" + +1. Verifica che Ollama sia in esecuzione: `ollama serve` +2. Controlla l'indirizzo IP e la porta in `app.py` +3. Assicurati che il firewall non blocchi la connessione + +### Errore: "Modello non trovato" + +Scarica il modello: +ollama pull xieweicong95/HY-MT1.5-1.8B + +### Timeout della richiesta + +Aumenta il timeout in `app.py`: +timeout=300 # Aumenta da 300 secondi (5 minuti) + +### Traduzione lenta + +- Riduci il numero di chunk aumentando `maxTokens` in `index.html` +- Aumenta le risorse assegnate a Ollama +- Considera l'uso di un modello piΓΉ piccolo + +## πŸ“Š Performance + +- **Tempo di risposta**: Dipende dal modello e dalla lunghezza del testo +- **Limite chunk**: 500 token (configurabile) +- **Timeout**: 5 minuti per chunk +- **RAM consigliata**: Almeno 8GB per il modello HY-MT1.5-1.8B + +## πŸ” Sicurezza + +- L'applicazione Γ¨ accessibile solo in locale per impostazione predefinita +- I dati non vengono salvati, solo elaborati in tempo reale +- Usa HTTPS in produzione + +## πŸ“ Licenza + +Questo progetto utilizza Ollama (Open Source) e Flask (BSD License). + +## 🀝 Contributi + +Suggerimenti e miglioramenti sono benvenuti! + +## πŸ“§ Supporto + +Per problemi o domande: +1. Verifica il section Troubleshooting +2. Controlla i log di Flask per errori +3. Assicurati che Ollama sia configurato correttamente + +--- + +**Versione**: 1.0.0 +**Ultima modifica**: Gennaio 2026 +**Modello**: xieweicong95/HY-MT1.5-1.8B \ No newline at end of file diff --git a/app.py b/app.py new file mode 100644 index 0000000..936e655 --- /dev/null +++ b/app.py @@ -0,0 +1,146 @@ +from flask import Flask, render_template, request, jsonify +import requests +import json +import os + +app = Flask(__name__) + +# Configurazione Ollama +OLLAMA_BASE_URL = "http://192.168.0.170:11434" +OLLAMA_MODEL = "xieweicong95/HY-MT1.5-1.8B" +OLLAMA_PARAMS = { + "top_p": 0.6, + "repeat_penalty": 1.1 +} + +@app.route('/') +def index(): + return render_template('index.html') + +@app.route('/api/translate', methods=['POST']) +def translate(): + """ + Endpoint per tradurre testo usando Ollama. + Accetta JSON con: + - prompt: il prompt da inviare a Ollama + - model: il modello da usare + - stream: boolean per streaming (default: False) + """ + try: + data = request.get_json() + + if not data or 'prompt' not in data: + return jsonify({'error': 'Prompt non fornito'}), 400 + + prompt = data.get('prompt') + model = data.get('model', OLLAMA_MODEL) + stream = data.get('stream', False) + + # Costruisci il payload per Ollama + payload = { + "model": model, + "prompt": prompt, + "stream": stream, + **OLLAMA_PARAMS # Aggiungi i parametri top_p e repeat_penalty + } + + # Invia la richiesta a Ollama + response = requests.post( + f"{OLLAMA_BASE_URL}/api/generate", + json=payload, + timeout=300 # Timeout di 5 minuti per testi lunghi + ) + + if response.status_code != 200: + return jsonify({ + 'error': f'Errore Ollama: {response.status_code}', + 'details': response.text + }), response.status_code + + # Se non Γ¨ streaming, la risposta Γ¨ JSON diretto + if not stream: + result = response.json() + translation = result.get('response', '').strip() + + # Pulisci la traduzione da eventuali prefissi + if translation.startswith('Translation:'): + translation = translation.replace('Translation:', '', 1).strip() + + return jsonify({ + 'success': True, + 'translation': translation, + 'response': translation, + 'model': model + }) + else: + # Se Γ¨ streaming, concatena le risposte + full_response = "" + for line in response.iter_lines(): + if line: + chunk = json.loads(line) + full_response += chunk.get('response', '') + + translation = full_response.strip() + if translation.startswith('Translation:'): + translation = translation.replace('Translation:', '', 1).strip() + + return jsonify({ + 'success': True, + 'translation': translation, + 'response': translation, + 'model': model + }) + + except requests.exceptions.Timeout: + return jsonify({ + 'error': 'Timeout della richiesta', + 'details': 'La richiesta a Ollama ha impiegato troppo tempo' + }), 408 + + except requests.exceptions.ConnectionError: + return jsonify({ + 'error': 'Errore di connessione', + 'details': f'Impossibile connettersi a Ollama su {OLLAMA_BASE_URL}' + }), 503 + + except Exception as e: + return jsonify({ + 'error': 'Errore interno del server', + 'details': str(e) + }), 500 + +@app.route('/api/health', methods=['GET']) +def health(): + """Controlla lo stato di Ollama""" + try: + response = requests.get( + f"{OLLAMA_BASE_URL}/api/tags", + timeout=5 + ) + + if response.status_code == 200: + models = response.json().get('models', []) + model_names = [m.get('name') for m in models] + + return jsonify({ + 'status': 'healthy', + 'ollama_url': OLLAMA_BASE_URL, + 'available_models': model_names, + 'target_model': OLLAMA_MODEL, + 'model_available': OLLAMA_MODEL in model_names + }) + else: + return jsonify({ + 'status': 'unhealthy', + 'error': f'Ollama ha risposto con status {response.status_code}' + }), 503 + + except Exception as e: + return jsonify({ + 'status': 'error', + 'error': str(e), + 'ollama_url': OLLAMA_BASE_URL + }), 503 + +if __name__ == '__main__': + app.run(debug=True, host='0.0.0.0', port=5000) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..411f23b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +Flask==3.0.0 +requests==2.31.0 \ No newline at end of file diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..2722a3b --- /dev/null +++ b/templates/index.html @@ -0,0 +1,587 @@ + + + + + + Traduttore con Ollama + + + +
+
+

🌍 Traduttore Ollama

+

Traduci testi lunghi con modelli locali

+
+ +
+
+ + +
+ 0 caratteri +
+
+ +
+
+ + +
+ +
+ + +
+
+ +
+ + +
+ +
+
+ +
+
+
+
+
+
+ Elaborazione: 0% +
+
+ + +
+
+ + + +