Update app.py
Browse files
app.py
CHANGED
|
@@ -2,6 +2,7 @@ from flask import Flask, request, jsonify, render_template
|
|
| 2 |
import os
|
| 3 |
from flask_cors import CORS
|
| 4 |
from openai import OpenAI
|
|
|
|
| 5 |
|
| 6 |
# Load API key and base URL from environment variables
|
| 7 |
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") or os.getenv("GEMINI_API_KEY")
|
|
@@ -41,12 +42,69 @@ Response Rules:
|
|
| 41 |
app = Flask(__name__, template_folder="templates", static_folder="static")
|
| 42 |
CORS(app)
|
| 43 |
|
| 44 |
-
|
| 45 |
-
def translate_text(text, target_lang):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
try:
|
| 47 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 48 |
except Exception as e:
|
| 49 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 50 |
|
| 51 |
@app.route("/", methods=["GET"])
|
| 52 |
def home():
|
|
@@ -62,9 +120,27 @@ def chat():
|
|
| 62 |
if not user_message:
|
| 63 |
return jsonify({"error": "Message is required"}), 400
|
| 64 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 65 |
messages = [
|
| 66 |
{"role": "system", "content": SYSTEM_INSTRUCTION},
|
| 67 |
-
{"role": "user", "content": f"Context Data:\n{CONTEXT_DATA}\n\nUser Query: {
|
| 68 |
]
|
| 69 |
|
| 70 |
# Call OpenAI (or OpenAI-compatible) chat API
|
|
@@ -75,13 +151,59 @@ def chat():
|
|
| 75 |
)
|
| 76 |
ai_response = response.choices[0].message.content.strip()
|
| 77 |
|
|
|
|
| 78 |
if target_lang.lower() != "en":
|
| 79 |
ai_response = translate_text(ai_response, target_lang)
|
| 80 |
|
| 81 |
return jsonify({"response": ai_response})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 82 |
except Exception as e:
|
| 83 |
return jsonify({"error": str(e)}), 500
|
| 84 |
|
| 85 |
-
|
| 86 |
if __name__ == '__main__':
|
|
|
|
|
|
|
|
|
|
| 87 |
app.run(debug=True, host='0.0.0.0', port=7860, threaded=True)
|
|
|
|
| 2 |
import os
|
| 3 |
from flask_cors import CORS
|
| 4 |
from openai import OpenAI
|
| 5 |
+
from translate import Translator
|
| 6 |
|
| 7 |
# Load API key and base URL from environment variables
|
| 8 |
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") or os.getenv("GEMINI_API_KEY")
|
|
|
|
| 42 |
app = Flask(__name__, template_folder="templates", static_folder="static")
|
| 43 |
CORS(app)
|
| 44 |
|
| 45 |
+
# Translation function with auto language detection
|
| 46 |
+
def translate_text(text, target_lang, source_lang='auto'):
|
| 47 |
+
"""
|
| 48 |
+
Translate text to desired language using Microsoft Translator
|
| 49 |
+
|
| 50 |
+
Args:
|
| 51 |
+
text (str): Text to translate
|
| 52 |
+
target_lang (str): Target language code (e.g., 'es', 'fr', 'de', 'hi', 'zh')
|
| 53 |
+
source_lang (str): Source language code (default: 'auto' for auto-detection)
|
| 54 |
+
|
| 55 |
+
Returns:
|
| 56 |
+
str: Translated text or original text if translation fails
|
| 57 |
+
"""
|
| 58 |
try:
|
| 59 |
+
# Skip translation if target language is English and text appears to be in English
|
| 60 |
+
if target_lang.lower() == 'en':
|
| 61 |
+
return text
|
| 62 |
+
|
| 63 |
+
# Create translator instance
|
| 64 |
+
translator = Translator(to_lang=target_lang, from_lang=source_lang)
|
| 65 |
+
translated = translator.translate(text)
|
| 66 |
+
|
| 67 |
+
# Return translated text if successful
|
| 68 |
+
if translated and translated.strip():
|
| 69 |
+
return translated
|
| 70 |
+
else:
|
| 71 |
+
return text # Return original if translation is empty
|
| 72 |
+
|
| 73 |
except Exception as e:
|
| 74 |
+
print(f"Translation error: {str(e)}")
|
| 75 |
+
return text # Return original text if translation fails
|
| 76 |
+
|
| 77 |
+
# Language code mapping for common languages
|
| 78 |
+
LANGUAGE_CODES = {
|
| 79 |
+
'english': 'en',
|
| 80 |
+
'spanish': 'es',
|
| 81 |
+
'french': 'fr',
|
| 82 |
+
'german': 'de',
|
| 83 |
+
'italian': 'it',
|
| 84 |
+
'portuguese': 'pt',
|
| 85 |
+
'russian': 'ru',
|
| 86 |
+
'chinese': 'zh',
|
| 87 |
+
'japanese': 'ja',
|
| 88 |
+
'korean': 'ko',
|
| 89 |
+
'arabic': 'ar',
|
| 90 |
+
'hindi': 'hi',
|
| 91 |
+
'dutch': 'nl',
|
| 92 |
+
'swedish': 'sv',
|
| 93 |
+
'norwegian': 'no',
|
| 94 |
+
'danish': 'da',
|
| 95 |
+
'finnish': 'fi',
|
| 96 |
+
'polish': 'pl',
|
| 97 |
+
'czech': 'cs',
|
| 98 |
+
'hungarian': 'hu',
|
| 99 |
+
'romanian': 'ro',
|
| 100 |
+
'turkish': 'tr',
|
| 101 |
+
'greek': 'el',
|
| 102 |
+
'hebrew': 'he',
|
| 103 |
+
'thai': 'th',
|
| 104 |
+
'vietnamese': 'vi',
|
| 105 |
+
'indonesian': 'id',
|
| 106 |
+
'malay': 'ms'
|
| 107 |
+
}
|
| 108 |
|
| 109 |
@app.route("/", methods=["GET"])
|
| 110 |
def home():
|
|
|
|
| 120 |
if not user_message:
|
| 121 |
return jsonify({"error": "Message is required"}), 400
|
| 122 |
|
| 123 |
+
# Normalize language code (handle full language names)
|
| 124 |
+
target_lang = target_lang.lower()
|
| 125 |
+
if target_lang in LANGUAGE_CODES:
|
| 126 |
+
target_lang = LANGUAGE_CODES[target_lang]
|
| 127 |
+
|
| 128 |
+
# Translate user message to English for processing if it's not in English
|
| 129 |
+
processed_message = user_message
|
| 130 |
+
if target_lang != "en":
|
| 131 |
+
try:
|
| 132 |
+
# Try to translate user message to English for better AI understanding
|
| 133 |
+
english_translator = Translator(to_lang='en', from_lang='auto')
|
| 134 |
+
processed_message = english_translator.translate(user_message)
|
| 135 |
+
if not processed_message or not processed_message.strip():
|
| 136 |
+
processed_message = user_message # Fallback to original
|
| 137 |
+
except Exception as e:
|
| 138 |
+
print(f"User message translation error: {str(e)}")
|
| 139 |
+
processed_message = user_message # Use original message
|
| 140 |
+
|
| 141 |
messages = [
|
| 142 |
{"role": "system", "content": SYSTEM_INSTRUCTION},
|
| 143 |
+
{"role": "user", "content": f"Context Data:\n{CONTEXT_DATA}\n\nUser Query: {processed_message}"}
|
| 144 |
]
|
| 145 |
|
| 146 |
# Call OpenAI (or OpenAI-compatible) chat API
|
|
|
|
| 151 |
)
|
| 152 |
ai_response = response.choices[0].message.content.strip()
|
| 153 |
|
| 154 |
+
# Translate AI response to target language if not English
|
| 155 |
if target_lang.lower() != "en":
|
| 156 |
ai_response = translate_text(ai_response, target_lang)
|
| 157 |
|
| 158 |
return jsonify({"response": ai_response})
|
| 159 |
+
|
| 160 |
+
except Exception as e:
|
| 161 |
+
error_message = f"Error: {str(e)}"
|
| 162 |
+
# Try to translate error message if target language is specified
|
| 163 |
+
if 'target_lang' in locals() and target_lang.lower() != "en":
|
| 164 |
+
try:
|
| 165 |
+
error_message = translate_text(error_message, target_lang)
|
| 166 |
+
except:
|
| 167 |
+
pass # Use original error message if translation fails
|
| 168 |
+
|
| 169 |
+
return jsonify({"error": error_message}), 500
|
| 170 |
+
|
| 171 |
+
@app.route("/languages", methods=["GET"])
|
| 172 |
+
def get_languages():
|
| 173 |
+
"""Endpoint to get available language codes"""
|
| 174 |
+
return jsonify({"languages": LANGUAGE_CODES})
|
| 175 |
+
|
| 176 |
+
@app.route("/translate", methods=["POST"])
|
| 177 |
+
def translate_endpoint():
|
| 178 |
+
"""Standalone translation endpoint"""
|
| 179 |
+
try:
|
| 180 |
+
data = request.get_json()
|
| 181 |
+
text = data.get("text")
|
| 182 |
+
target_lang = data.get("target_lang", "en")
|
| 183 |
+
source_lang = data.get("source_lang", "auto")
|
| 184 |
+
|
| 185 |
+
if not text:
|
| 186 |
+
return jsonify({"error": "Text is required"}), 400
|
| 187 |
+
|
| 188 |
+
# Normalize language code
|
| 189 |
+
target_lang = target_lang.lower()
|
| 190 |
+
if target_lang in LANGUAGE_CODES:
|
| 191 |
+
target_lang = LANGUAGE_CODES[target_lang]
|
| 192 |
+
|
| 193 |
+
translated = translate_text(text, target_lang, source_lang)
|
| 194 |
+
|
| 195 |
+
return jsonify({
|
| 196 |
+
"original_text": text,
|
| 197 |
+
"translated_text": translated,
|
| 198 |
+
"source_lang": source_lang,
|
| 199 |
+
"target_lang": target_lang
|
| 200 |
+
})
|
| 201 |
+
|
| 202 |
except Exception as e:
|
| 203 |
return jsonify({"error": str(e)}), 500
|
| 204 |
|
|
|
|
| 205 |
if __name__ == '__main__':
|
| 206 |
+
print("Starting Flask app with translation support...")
|
| 207 |
+
print("Available language codes:", list(LANGUAGE_CODES.keys()))
|
| 208 |
+
print("Install dependencies: pip install translate")
|
| 209 |
app.run(debug=True, host='0.0.0.0', port=7860, threaded=True)
|