Spaces:
Runtime error
Runtime error
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) | |
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) |