File size: 3,378 Bytes
9b73d16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3e41026
9b73d16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
from flask import Flask, render_template, request, jsonify
from googletrans import Translator
import io
import asyncio
from dotenv import load_dotenv
import os
import logging
from chatbot import process_uploaded_file, index_documents, rag_chatbot

# Set up logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# Load environment variables
load_dotenv()
app = Flask(__name__)

LANGUAGE_MAP = {
    "English (US)": "en",
    "Hindi (India)": "hi",
    "Spanish (Spain)": "es",
    "French (France)": "fr",
    "German (Germany)": "de",
    "Arabic (Saudi Arabia)": "ar"
}

@app.route('/')
def index():
    return render_template("index.html")

@app.route('/api/upload_document', methods=['POST'])
def upload_document():
    try:
        if 'file' not in request.files:
            return jsonify({"error": "No file uploaded"}), 400
        
        file = request.files['file']
        if file.filename == '':
            return jsonify({"error": "No file selected"}), 400
        
        # Process file without saving locally
        file_stream = io.BytesIO(file.read())
        documents = process_uploaded_file(file_stream, file.filename)
        
        # Index documents in Pinecone
        vector_store = index_documents(documents)
        
        return jsonify({"message": f"Successfully processed and indexed {len(documents)} chunks from {file.filename}"})
    
    except Exception as e:
        logger.error(f"Error in upload_document: {str(e)}")
        return jsonify({"error": str(e)}), 500

@app.route('/api/process_text', methods=['POST'])
def process_text():
    # Get JSON payload
    data = request.get_json()
    try:
        original_text = data['text']
        language_name = data['language']
    except (KeyError, TypeError):
        return jsonify({"error": "Missing 'text' or 'language' in JSON payload"}), 400

    # Map language name to language code
    if language_name not in LANGUAGE_MAP:
        return jsonify({"error": f"Unsupported language: {language_name}"}), 400
    original_lang_code = LANGUAGE_MAP[language_name]
    
    logger.info(f"Original Text: {original_text}")
    logger.info(f"Original Language: {language_name} ({original_lang_code})")
    
    # Define an async function for translation
    def translate_async(text, dest_lang):
        translator = Translator()
        translated = translator.translate(text, dest=dest_lang)
        return translated.text
    
    # Translate to English
    if original_lang_code != "en":
        translated_text = asyncio.run(translate_async(original_text, dest_lang="en"))
    else:
        translated_text = original_text
    
    logger.info(f"Translated to English: {translated_text}")
    
    # Process with RAG
    response = rag_chatbot(translated_text)
    logger.info(f"English Response: {response}")
    
    # Translate response back to original language
    if original_lang_code != "en":
        final_response = asyncio.run(translate_async(response, dest_lang=original_lang_code))
    else:
        final_response = response
    
    logger.info(f"Final Response (in original language): {final_response}")
    
    # Return the final response
    return jsonify({"response": final_response, "language": language_name})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=7860)