Spaces:
Runtime error
Runtime error
File size: 4,365 Bytes
c8d78f6 |
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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
from flask import Flask, request, jsonify
from flask_cors import CORS # Import Flask-CORS
import requests
import logging
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator
from langdetect import detect
# Initialize Flask app
app = Flask(__name__)
# Enable CORS for all routes
CORS(app)
# IBM Watson API Credentials
IBM_API_KEY = "NNFdMnmNWYNw1bx4MuHOIAnmWABci3-5aZ_wZXmyrIYw"
# IBM Watson Service URLs
WATSONX_API_URL = "https://us-south.ml.cloud.ibm.com/ml/v1/text/generation?version=2023-05-29"
PROJECT_ID = "8323eb5c-db81-438a-8ae1-1696d9550cbf"
MODEL_ID = "ibm/granite-20b-multilingual"
# Logging setup
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Function to get OAuth token
def get_access_token(api_key):
token_url = "https://iam.cloud.ibm.com/identity/token"
headers = {"Content-Type": "application/x-www-form-urlencoded"}
data = {"grant_type": "urn:ibm:params:oauth:grant-type:apikey", "apikey": api_key}
response = requests.post(token_url, headers=headers, data=data)
if response.status_code != 200:
logger.error("Failed to get access token: %s", response.text)
raise Exception(f"Failed to get access token: {response.text}")
token = response.json()["access_token"]
return token
# Get access token
access_token = get_access_token(IBM_API_KEY)
@app.route('/translate', methods=['POST'])
def translate():
try:
# Get input data
data = request.get_json()
# Check for 'text' and 'target_language' in the request
if 'text' not in data or 'target_language' not in data:
return jsonify({"error": "Missing 'text' or 'target_language' in request body"}), 400
text = data['text']
target_language = data.get('target_language', 'en') # Use 'en' if target_language is not provided
# Step 1: Detect the language of the input text
detected_language = detect(text)
logger.info(f"Detected language: {detected_language}")
target_language="es"
# Step 2: If the detected language is the same as the target language, skip translation
if detected_language == target_language:
return jsonify({
"original_text": text,
"detected_language": detected_language,
"translated_text": text
})
# Step 3: Translate text using WatsonX AI (Granite model) or fallback to Language Translator
try:
headers = {
"Accept": "application/json",
"Content-Type": "application/json",
"Authorization": f"Bearer {access_token}"
}
body = {
"input": f"Translate the following text from {detected_language} to {target_language}: '{text}'",
"parameters": {
"decoding_method": "greedy",
"max_new_tokens": 900,
"min_new_tokens": 0,
"repetition_penalty": 1.05
},
"model_id": MODEL_ID,
"project_id": PROJECT_ID
}
response = requests.post(WATSONX_API_URL, headers=headers, json=body)
logger.info(f"API Response: {response.text}") # Log the response to understand what's happening
if response.status_code != 200:
raise Exception(f"Granite translation failed: {response.text}")
data = response.json()
# Extract translation
translated_text = data.get("results", [{}])[0].get("generated_text", "").strip()
if not translated_text:
translated_text = "Translation failed or empty response"
logger.info(f"Translated text: {translated_text}")
except Exception as e:
logger.error(f"Granite translation failed, fallback to Watson Language Translator: {e}")
translated_text = "Translation failed"
# Return the translated text
return jsonify({
"original_text": text,
"detected_language": detected_language,
"translated_text": translated_text
})
except Exception as e:
logger.error(f"Translation processing failed: {e}")
return jsonify({"error": str(e)}), 500
if __name__ == "__main__":
app.run(debug=True) |