isana25 commited on
Commit
c8d78f6
·
verified ·
1 Parent(s): 5872e5f

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +117 -0
app.py ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, request, jsonify
2
+ from flask_cors import CORS # Import Flask-CORS
3
+ import requests
4
+ import logging
5
+ from ibm_cloud_sdk_core.authenticators import IAMAuthenticator
6
+ from langdetect import detect
7
+
8
+ # Initialize Flask app
9
+ app = Flask(__name__)
10
+
11
+ # Enable CORS for all routes
12
+ CORS(app)
13
+
14
+ # IBM Watson API Credentials
15
+ IBM_API_KEY = "NNFdMnmNWYNw1bx4MuHOIAnmWABci3-5aZ_wZXmyrIYw"
16
+
17
+ # IBM Watson Service URLs
18
+ WATSONX_API_URL = "https://us-south.ml.cloud.ibm.com/ml/v1/text/generation?version=2023-05-29"
19
+ PROJECT_ID = "8323eb5c-db81-438a-8ae1-1696d9550cbf"
20
+ MODEL_ID = "ibm/granite-20b-multilingual"
21
+
22
+ # Logging setup
23
+ logging.basicConfig(level=logging.INFO)
24
+ logger = logging.getLogger(__name__)
25
+
26
+ # Function to get OAuth token
27
+ def get_access_token(api_key):
28
+ token_url = "https://iam.cloud.ibm.com/identity/token"
29
+ headers = {"Content-Type": "application/x-www-form-urlencoded"}
30
+ data = {"grant_type": "urn:ibm:params:oauth:grant-type:apikey", "apikey": api_key}
31
+ response = requests.post(token_url, headers=headers, data=data)
32
+ if response.status_code != 200:
33
+ logger.error("Failed to get access token: %s", response.text)
34
+ raise Exception(f"Failed to get access token: {response.text}")
35
+ token = response.json()["access_token"]
36
+ return token
37
+
38
+ # Get access token
39
+ access_token = get_access_token(IBM_API_KEY)
40
+ @app.route('/translate', methods=['POST'])
41
+ def translate():
42
+ try:
43
+ # Get input data
44
+ data = request.get_json()
45
+
46
+ # Check for 'text' and 'target_language' in the request
47
+ if 'text' not in data or 'target_language' not in data:
48
+ return jsonify({"error": "Missing 'text' or 'target_language' in request body"}), 400
49
+
50
+ text = data['text']
51
+ target_language = data.get('target_language', 'en') # Use 'en' if target_language is not provided
52
+
53
+ # Step 1: Detect the language of the input text
54
+ detected_language = detect(text)
55
+ logger.info(f"Detected language: {detected_language}")
56
+ target_language="es"
57
+ # Step 2: If the detected language is the same as the target language, skip translation
58
+ if detected_language == target_language:
59
+ return jsonify({
60
+ "original_text": text,
61
+ "detected_language": detected_language,
62
+ "translated_text": text
63
+ })
64
+
65
+ # Step 3: Translate text using WatsonX AI (Granite model) or fallback to Language Translator
66
+ try:
67
+ headers = {
68
+ "Accept": "application/json",
69
+ "Content-Type": "application/json",
70
+ "Authorization": f"Bearer {access_token}"
71
+ }
72
+
73
+ body = {
74
+ "input": f"Translate the following text from {detected_language} to {target_language}: '{text}'",
75
+ "parameters": {
76
+ "decoding_method": "greedy",
77
+ "max_new_tokens": 900,
78
+ "min_new_tokens": 0,
79
+ "repetition_penalty": 1.05
80
+ },
81
+ "model_id": MODEL_ID,
82
+ "project_id": PROJECT_ID
83
+ }
84
+
85
+ response = requests.post(WATSONX_API_URL, headers=headers, json=body)
86
+
87
+ logger.info(f"API Response: {response.text}") # Log the response to understand what's happening
88
+
89
+ if response.status_code != 200:
90
+ raise Exception(f"Granite translation failed: {response.text}")
91
+
92
+ data = response.json()
93
+
94
+ # Extract translation
95
+ translated_text = data.get("results", [{}])[0].get("generated_text", "").strip()
96
+ if not translated_text:
97
+ translated_text = "Translation failed or empty response"
98
+
99
+ logger.info(f"Translated text: {translated_text}")
100
+
101
+ except Exception as e:
102
+ logger.error(f"Granite translation failed, fallback to Watson Language Translator: {e}")
103
+ translated_text = "Translation failed"
104
+
105
+ # Return the translated text
106
+ return jsonify({
107
+ "original_text": text,
108
+ "detected_language": detected_language,
109
+ "translated_text": translated_text
110
+ })
111
+
112
+ except Exception as e:
113
+ logger.error(f"Translation processing failed: {e}")
114
+ return jsonify({"error": str(e)}), 500
115
+
116
+ if __name__ == "__main__":
117
+ app.run(debug=True)