code-translator / app.py
shital2024's picture
Upload 5 files
364061c verified
import streamlit as st
import requests
import os
import google.generativeai as genai
import tensorflow as tf
import numpy as np
from tensorflow.keras.layers import TextVectorization
# --- Config ---
vocab_size = 10000
sequence_length = 150
# Load API keys
HF_API_TOKEN = os.getenv("HF_API_TOKEN")
GEMINI_API_KEY = os.getenv("GOOGLE_API_KEY")
# Hugging Face setup
MODEL_ID = "Salesforce/codet5p-770m"
API_URL = f"https://api-inference.huggingface.co/models/{MODEL_ID}"
HEADERS = {"Authorization": f"Bearer {HF_API_TOKEN}"}
genai.configure(api_key="AIzaSyBkc8CSEhyYwZAuUiJfzF1Xtns-RYmBOpg")
# --- Load Local Model & Vectorizers ---
model = tf.keras.models.load_model("java_to_python_seq2seq_model.h5")
java_vectorizer = TextVectorization(max_tokens=vocab_size, output_sequence_length=sequence_length)
python_vectorizer = TextVectorization(max_tokens=vocab_size, output_sequence_length=sequence_length)
# Dummy adaptation to initialize
java_vectorizer.adapt(tf.data.Dataset.from_tensor_slices(["public class Main { public static void main(String[] args) {} }"]))
python_vectorizer.adapt(tf.data.Dataset.from_tensor_slices(["def main():\n pass"]))
python_vocab = python_vectorizer.get_vocabulary()
index_to_word = dict(enumerate(python_vocab))
# --- Translator Functions ---
def fallback_translate_with_gemini(code_snippet, source_lang, target_lang):
prompt = f"""You are a code translation expert. Convert the following {source_lang} code to {target_lang}:
{code_snippet}
Ensure the translation is accurate and follows {target_lang} best practices.
Do not give any explanation. Only give the translated code.
"""
try:
model = genai.GenerativeModel("gemini-1.5-pro")
response = model.generate_content(prompt)
return response.text.strip() if response else "Translation failed."
except Exception as e:
return f"Gemini API Error: {str(e)}"
def translate_with_local_model(code_snippet):
try:
java_seq = java_vectorizer(tf.constant([code_snippet]))
python_in = tf.constant([[1] + [0] * (sequence_length - 1)])
translated_tokens = []
for i in range(sequence_length):
preds = model.predict([java_seq, python_in], verbose=0)
next_token = tf.argmax(preds[0, i]).numpy()
translated_tokens.append(next_token)
if next_token == 0:
break
if i + 1 < sequence_length:
python_in = tf.tensor_scatter_nd_update(
python_in, [[0, i + 1]], [next_token]
)
tokens = [index_to_word.get(t, "") for t in translated_tokens]
return " ".join(tokens).replace("[UNK]", "").strip()
except Exception as e:
return f"Local Model Error: {str(e)}"
def translate_code(code_snippet, source_lang, target_lang):
prompt = f"Translate the following {source_lang} code to {target_lang}:\n\n{code_snippet}\n\nTranslated {target_lang} Code:\n"
response = requests.post(API_URL, headers=HEADERS, json={
"inputs": prompt,
"parameters": {"max_new_tokens": 150, "temperature": 0.2, "top_k": 50}
})
if response.status_code == 200:
generated_text = response.json()[0]["generated_text"]
translated_code = generated_text.split(f"Translated {target_lang} Code:\n")[-1].strip()
return translated_code
else:
return f"Error: {response.status_code}, {response.text}"
# --- Streamlit UI ---
st.title("πŸ”„ Programming Language Translator")
st.write("Translate code between programming languages using 3-tier logic:")
languages = ["Python", "Java", "C++", "C"]
source_lang = st.selectbox("Select source language", languages)
target_lang = st.selectbox("Select target language", languages)
code_input = st.text_area("Enter your code here:", height=200)
# State initialization
if "translate_attempts" not in st.session_state:
st.session_state.translate_attempts = 0
st.session_state.translated_code = ""
if st.button("Translate"):
if code_input.strip():
st.session_state.translate_attempts += 1
attempt = st.session_state.translate_attempts
with st.spinner(f"Translating..."):
# First click
if attempt == 1:
if source_lang == "Java" and target_lang == "Python":
st.session_state.translated_code = translate_with_local_model(code_input)
else:
st.session_state.translated_code = translate_code(code_input, source_lang, target_lang)
else:
# Second and later attempts -> Gemini
st.session_state.translated_code = fallback_translate_with_gemini(code_input, source_lang, target_lang)
st.subheader("Translated Code:")
st.code(st.session_state.translated_code, language=target_lang.lower())
else:
st.warning("⚠️ Please enter some code before translating.")
# Best version. It doesn't having trained model only.
# import streamlit as st
# import requests
# import os # To access environment variables
# import google.generativeai as genai # Import Gemini API
# # Load API keys from environment variables
# HF_API_TOKEN = os.getenv("HF_API_TOKEN")
# GEMINI_API_KEY = os.getenv("GOOGLE_API_KEY")
# # Set up Hugging Face API
# MODEL_ID = "Salesforce/codet5p-770m" # CodeT5+ (Recommended)
# API_URL = f"https://api-inference.huggingface.co/models/{MODEL_ID}"
# HEADERS = {"Authorization": f"Bearer {HF_API_TOKEN}"}
# # Initialize Gemini API
# genai.configure(api_key='AIzaSyBkc8CSEhyYwZAuUiJfzF1Xtns-RYmBOpg')
# def translate_code(code_snippet, source_lang, target_lang):
# """Translate code using Hugging Face API."""
# prompt = f"Translate the following {source_lang} code to {target_lang}:\n\n{code_snippet}\n\nTranslated {target_lang} Code:\n"
# response = requests.post(API_URL, headers=HEADERS, json={
# "inputs": prompt,
# "parameters": {
# "max_new_tokens": 150,
# "temperature": 0.2,
# "top_k": 50
# }
# })
# if response.status_code == 200:
# generated_text = response.json()[0]["generated_text"]
# translated_code = generated_text.split(f"Translated {target_lang} Code:\n")[-1].strip()
# return translated_code
# else:
# return f"Error: {response.status_code}, {response.text}"
# def fallback_translate_with_gemini(code_snippet, source_lang, target_lang):
# """Fallback function using Gemini API for translation."""
# prompt = f"""You are a code translation expert. Convert the following {source_lang} code to {target_lang}:
# {code_snippet}
# Ensure the translation is accurate and follows {target_lang} best practices.
# Do not give any explaination. only give the translated code.
# """
# try:
# model = genai.GenerativeModel("gemini-1.5-pro")
# response = model.generate_content(prompt)
# return response.text.strip() if response else "Translation failed."
# except Exception as e:
# return f"Gemini API Error: {str(e)}"
# # Streamlit UI
# st.title("πŸ”„ Code Translator with Gemini AI")
# st.write("Translate code between different programming languages using AI.")
# languages = ["Python", "Java", "C++", "C"]
# source_lang = st.selectbox("Select source language", languages)
# target_lang = st.selectbox("Select target language", languages)
# code_input = st.text_area("Enter your code here:", height=200)
# # Initialize session state
# if "translate_attempts" not in st.session_state:
# st.session_state.translate_attempts = 0
# st.session_state.translated_code = ""
# if st.button("Translate"):
# if code_input.strip():
# st.session_state.translate_attempts += 1
# with st.spinner("Translating..."):
# if st.session_state.translate_attempts == 1:
# # First attempt using the pretrained model
# st.session_state.translated_code = translate_code(code_input, source_lang, target_lang)
# else:
# # Second attempt uses Gemini API
# st.session_state.translated_code = fallback_translate_with_gemini(code_input, source_lang, target_lang)
# st.subheader("Translated Code:")
# st.code(st.session_state.translated_code, language=target_lang.lower())
# else:
# st.warning("⚠️ Please enter some code before translating.")
# V1 without LLM
# import streamlit as st
# import requests
# import os # Import os to access environment variables
# # Get API token from environment variable
# API_TOKEN = os.getenv("HF_API_TOKEN") # Fetch token securely
# # Change MODEL_ID to a better model
# # MODEL_ID = "Salesforce/codet5p-770m" # CodeT5+ (Recommended)
# MODEL_ID = "bigcode/starcoder2-15b" # StarCoder2
# # MODEL_ID = "meta-llama/CodeLlama-34b-Instruct" # Code Llama
# # API_URL = f"https://api-inference.huggingface.co/models/{MODEL_ID}"
# API_URL = f"https://api-inference.huggingface.co/models/{MODEL_ID}"
# HEADERS = {"Authorization": f"Bearer {API_TOKEN}"}
# def translate_code(code_snippet, source_lang, target_lang):
# """Translate code using Hugging Face API securely."""
# prompt = f"Translate the following {source_lang} code to {target_lang}:\n\n{code_snippet}\n\nTranslated {target_lang} Code:\n"
# response = requests.post(API_URL, headers=HEADERS, json={
# "inputs": prompt,
# "parameters": {
# "max_new_tokens": 150,
# "temperature": 0.2,
# "top_k": 50,
# "stop": ["\n\n", "#", "//", "'''"]
# }
# })
# if response.status_code == 200:
# generated_text = response.json()[0]["generated_text"]
# translated_code = generated_text.split(f"Translated {target_lang} Code:\n")[-1].strip()
# return translated_code
# else:
# return f"Error: {response.status_code}, {response.text}"
# # Streamlit UI
# st.title("πŸ”„ Code Translator using StarCoder")
# st.write("Translate code between different programming languages using AI.")
# languages = ["Python", "Java", "C++", "C"]
# source_lang = st.selectbox("Select source language", languages)
# target_lang = st.selectbox("Select target language", languages)
# code_input = st.text_area("Enter your code here:", height=200)
# if st.button("Translate"):
# if code_input.strip():
# with st.spinner("Translating..."):
# translated_code = translate_code(code_input, source_lang, target_lang)
# st.subheader("Translated Code:")
# st.code(translated_code, language=target_lang.lower())
# else:
# st.warning("⚠️ Please enter some code before translating.")