CodeConverter / app.py
CultriX's picture
Create app.py
20718fa verified
raw
history blame
6.66 kB
import gradio as gr
import openai
# --- UI Configuration ---
# Extracted from the provided React code
LANGUAGES = [
'Python', 'JavaScript', 'TypeScript', 'Java', 'C++', 'C#', 'C', 'Go',
'Rust', 'Swift', 'Kotlin', 'PHP', 'Ruby', 'Scala', 'R', 'MATLAB',
'Perl', 'Haskell', 'Lua', 'Dart', 'Elixir', 'F#', 'Clojure',
'Objective-C', 'Visual Basic', 'Bash', 'PowerShell', 'SQL', 'HTML',
'CSS', 'JSON', 'XML', 'YAML', 'Assembly', 'Fortran', 'COBOL',
'Pascal', 'Delphi', 'Groovy', 'Julia', 'Nim', 'Crystal', 'Zig',
'V', 'OCaml', 'Erlang', 'Prolog', 'Lisp', 'Scheme', 'Racket'
]
# A selection of popular and capable models available via OpenRouter
# You can expand this list with other models from openrouter.ai
MODELS = [
"anthropic/claude-3.5-sonnet",
"google/gemini-flash-1.5",
"meta-llama/llama-3-8b-instruct",
"mistralai/mistral-large",
"openai/gpt-4o",
"microsoft/wizardlm-2-8x22b",
]
# Default example code from the original application
DEFAULT_SOURCE_CODE = """# Example Python code
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(10))"""
# --- Core Conversion Logic ---
def convert_code(
source_code: str,
source_lang: str,
target_lang: str,
model: str,
api_key: str,
):
"""
Uses an LLM via OpenRouter to convert code from one language to another.
"""
if not source_code.strip():
raise gr.Error("Please enter some code to convert.")
if not api_key.strip():
raise gr.Error("OpenRouter API key is required.")
if not model:
raise gr.Error("Please select a model for the conversion.")
# Initialize the OpenAI client to point to OpenRouter's API
client = openai.OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=api_key,
)
# Construct the prompt for the LLM
prompt = (
f"You are an expert programmer. Convert the following {source_lang} code "
f"to {target_lang}. Your response should only contain the raw, converted code. "
"Do not include any explanations, markdown formatting (like ```), or extra text."
f"\n\n--- Start of {source_lang} Code ---\n"
f"{source_code}\n"
f"--- End of {source_lang} Code ---"
)
try:
# Make the API call to the selected model
completion = client.chat.completions.create(
model=model,
messages=[
{"role": "user", "content": prompt},
],
temperature=0.1, # Lower temperature for more deterministic output
max_tokens=2048,
)
converted_code = completion.choices[0].message.content.strip()
return converted_code
except openai.AuthenticationError:
raise gr.Error("Authentication failed. Please check your OpenRouter API key.")
except Exception as e:
# A catch-all for other potential API or network errors
raise gr.Error(f"An error occurred during conversion: {e}")
# --- Gradio User Interface ---
with gr.Blocks(
theme=gr.themes.Monochrome(),
css=".gradio-container {background-color: #0f172a}" # Dark theme like the original
) as app:
# Header
with gr.Row():
gr.HTML(
"""
<div style="display: flex; align-items: center; gap: 12px; padding: 10px;">
<svg xmlns="[http://www.w3.org/2000/svg](http://www.w3.org/2000/svg)" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="#3b82f6" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-code-xml"><path d="m18 16 4-4-4-4"/><path d="m6 8-4 4 4 4"/><path d="m14.5 4-5 16"/></svg>
<div>
<h1 style="font-size: 1.5rem; font-weight: 700; color: #ffffff; margin: 0;">CodeVerter</h1>
<p style="font-size: 0.875rem; color: #9ca3af; margin: 0;">Programming Language Converter via OpenRouter</p>
</div>
</div>
"""
)
# API Key and Model Selection
with gr.Accordion("⚙️ Configuration", open=True):
openrouter_key = gr.Textbox(
label="OpenRouter API Key",
placeholder="Enter your OpenRouter API key here...",
type="password",
elem_id="api-key-textbox",
)
model_selection = gr.Dropdown(
label="Select LLM Model",
choices=MODELS,
value=MODELS[0], # Default to the first model in the list
)
# Main conversion interface
with gr.Row(equal_height=False):
# Input column
with gr.Column(scale=1):
source_lang_selection = gr.Dropdown(
label="Source Language",
choices=LANGUAGES,
value="Python",
)
source_code_input = gr.Code(
label="Source Code",
language="python", # Start with python syntax highlighting
value=DEFAULT_SOURCE_CODE,
lines=15,
)
# Output column
with gr.Column(scale=1):
target_lang_selection = gr.Dropdown(
label="Target Language",
choices=LANGUAGES,
value="JavaScript",
)
target_code_output = gr.Code(
label="Converted Code",
language="javascript", # Start with javascript syntax highlighting
lines=15,
interactive=False, # Make it read-only
)
# Keep language highlighting in sync with dropdowns
source_lang_selection.change(
lambda x: gr.update(language=x.lower()),
inputs=source_lang_selection,
outputs=source_code_input
)
target_lang_selection.change(
lambda x: gr.update(language=x.lower()),
inputs=target_lang_selection,
outputs=target_code_output
)
# Convert button and action
convert_button = gr.Button("Convert Code", variant="primary")
convert_button.click(
fn=convert_code,
inputs=[
source_code_input,
source_lang_selection,
target_lang_selection,
model_selection,
openrouter_key,
],
outputs=target_code_output,
api_name="convert"
)
# Footer
gr.HTML(
"""
<div style="text-align: center; margin-top: 24px; color: #9ca3af; font-size: 0.875rem;">
<p>CodeVerter uses LLMs via OpenRouter to convert code. Results may require manual review.</p>
</div>
"""
)
if __name__ == "__main__":
app.launch()