"""
Main AnyCoder application with advanced professional UI.
"""
import os
import uuid
import base64
import tempfile
from typing import Dict, List, Optional, Tuple, Union
import gradio as gr
# Import all our modules
from config import (
AVAILABLE_MODELS, DEFAULT_MODEL, THEME_CONFIGS, DEMO_LIST,
HTML_SYSTEM_PROMPT, get_saved_theme, save_theme_preference, get_gradio_language
)
from utils import (
get_inference_client, remove_code_block, extract_text_from_file,
create_multimodal_message, apply_search_replace_changes,
cleanup_all_temp_media, reap_old_media, process_image_for_model
)
from web_utils import extract_website_content, enhance_query_with_search
from media_generation import (
generate_image_with_qwen, generate_image_to_image, generate_video_from_image,
generate_video_from_text, generate_music_from_text
)
from code_processing import (
is_streamlit_code, is_gradio_code, extract_html_document,
parse_transformers_js_output, format_transformers_js_output, build_transformers_inline_html,
parse_svelte_output, format_svelte_output,
parse_multipage_html_output, format_multipage_output,
validate_and_autofix_files, inline_multipage_into_single_preview,
apply_generated_media_to_html
)
# Initialize theme
current_theme_name = get_saved_theme()
current_theme = THEME_CONFIGS[current_theme_name]["theme"]
class AnyCoder:
"""Main AnyCoder application class"""
def __init__(self):
self.setup_cleanup()
def setup_cleanup(self):
"""Setup cleanup handlers"""
cleanup_all_temp_media()
reap_old_media()
def create_advanced_ui(self):
"""Create the advanced professional UI"""
with gr.Blocks(
title="AnyCoder - Professional AI Development Suite",
theme=current_theme,
css=self.get_custom_css(),
head=self.get_head_html()
) as app:
# State management
history = gr.State([])
setting = gr.State({"system": HTML_SYSTEM_PROMPT})
current_model = gr.State(DEFAULT_MODEL)
session_state = gr.State({})
# Header
with gr.Row(elem_classes=["header-row"]):
with gr.Column(scale=3):
gr.HTML("""
⚡
AnyCoder
Professional AI Development Suite
AI Models Ready
Web Search Available
""")
with gr.Column(scale=1, min_width=200):
with gr.Row():
login_button = gr.LoginButton(scale=1, size="sm")
theme_selector = gr.Dropdown(
choices=list(THEME_CONFIGS.keys()),
value=current_theme_name,
label="Theme",
scale=1,
container=False
)
# Main interface
with gr.Row():
# Left sidebar - Controls
with gr.Column(scale=1, elem_classes=["sidebar"]):
self.create_sidebar(current_model, session_state)
# Main content area
with gr.Column(scale=3, elem_classes=["main-content"]):
self.create_main_content(history, current_model)
# Connect all the event handlers
self.setup_event_handlers(app, history, setting, current_model, session_state)
return app
def create_sidebar(self, current_model, session_state):
"""Create the professional sidebar"""
# Model Selection
with gr.Group(elem_classes=["control-group"]):
gr.HTML('
🤖 AI Model
')
model_dropdown = gr.Dropdown(
choices=[f"{model['name']} ({model['category']})" for model in AVAILABLE_MODELS],
value=f"{DEFAULT_MODEL['name']} ({DEFAULT_MODEL['category']})",
label="Select Model",
info="Choose your AI model based on task requirements",
container=False
)
# Model info display
model_info = gr.HTML(self.get_model_info_html(DEFAULT_MODEL))
# Project Configuration
with gr.Group(elem_classes=["control-group"]):
gr.HTML('
',
elem_classes=["code-stats"]
)
# Deployment Tab
with gr.Tab("🚀 Deploy", elem_classes=["deploy-tab"]):
with gr.Row():
with gr.Column(scale=2):
with gr.Group():
gr.HTML('
",
history_state
)
def generate_code_with_model(self, prompt, model_state, language, image):
"""Generate code using the selected model"""
try:
client = get_inference_client(model_state['id'], "auto")
# Select appropriate system prompt based on language
system_prompts = {
'html': HTML_SYSTEM_PROMPT,
'streamlit': "You are an expert Streamlit developer. Create modern, interactive Streamlit applications with clean code and professional UI.",
'gradio': "You are an expert Gradio developer. Create modern, interactive Gradio applications with clean interfaces and robust functionality.",
'transformers.js': "You are an expert in Transformers.js. Create modern web applications using Transformers.js for AI/ML functionality.",
'svelte': "You are an expert Svelte developer. Create modern, reactive Svelte applications with TypeScript and clean architecture."
}
system_prompt = system_prompts.get(language, HTML_SYSTEM_PROMPT)
# Prepare messages
messages = [
{"role": "system", "content": system_prompt}
]
if image:
messages.append(create_multimodal_message(prompt, image))
else:
messages.append({"role": "user", "content": prompt})
# Generate with streaming for better UX
if hasattr(client, 'chat') and hasattr(client.chat, 'completions'):
completion = client.chat.completions.create(
model=model_state['id'],
messages=messages,
max_tokens=16384,
temperature=0.7,
stream=False # For simplicity in this demo
)
return completion.choices[0].message.content
else:
# Fallback for different client types
return "Generated code would appear here..."
except Exception as e:
raise Exception(f"Model generation failed: {str(e)}")
def generate_preview(self, code, language):
"""Generate HTML preview for the code"""
try:
if language == "html":
# Handle multi-page HTML
files = parse_multipage_html_output(code)
if files and files.get('index.html'):
files = validate_and_autofix_files(files)
preview_code = inline_multipage_into_single_preview(files)
else:
preview_code = extract_html_document(code)
return self.send_to_sandbox(preview_code)
elif language == "transformers.js":
files = parse_transformers_js_output(code)
if files['index.html'] and files['index.js'] and files['style.css']:
merged_html = build_transformers_inline_html(files)
return self.send_to_sandbox(merged_html)
else:
return "
⏳ Generating Transformers.js application...
"
elif language == "streamlit":
if is_streamlit_code(code):
return self.send_streamlit_to_stlite(code)
else:
return "
Add import streamlit as st to enable preview
"
elif language == "gradio":
if is_gradio_code(code):
return self.send_gradio_to_lite(code)
else:
return "
Add import gradio as gr to enable preview
"
else:
return f"
💻 {language.upper()} code generated successfully. Preview not available for this language.
"
except Exception as e:
return f"
Preview Error: {str(e)}
"
def send_to_sandbox(self, html_code):
"""Send HTML to sandboxed iframe"""
if not html_code.strip():
return "
"
try:
lines = len(code.split('\n'))
chars = len(code)
words = len(code.split())
# Language-specific analysis
if language == "html":
tags = len([m for m in code.split('<') if m.strip()])
stats_content = f"""
{lines}Lines
{tags}HTML Tags
{chars}Characters
{round(chars/1024, 1)}KBSize
"""
else:
stats_content = f"""
{lines}Lines
{words}Words
{chars}Characters
{language.upper()}Language
"""
return f"
{stats_content}
"
except Exception:
return "
Unable to analyze code
"
def handle_model_change(self, model_selection):
"""Handle model selection change"""
try:
# Extract model name from selection
model_name = model_selection.split(" (")[0]
# Find the model
selected_model = None
for model in AVAILABLE_MODELS:
if model['name'] == model_name:
selected_model = model
break
if selected_model:
model_info_html = self.get_model_info_html(selected_model)
return selected_model, model_info_html
return DEFAULT_MODEL, self.get_model_info_html(DEFAULT_MODEL)
except Exception:
return DEFAULT_MODEL, self.get_model_info_html(DEFAULT_MODEL)
def handle_clear(self):
"""Handle clear button"""
return (
gr.update(value=""), # input_textbox
gr.update(value="", language="html"), # code_output
"
Ready to generate your next application
", # sandbox
"
Ready to generate...
", # code_stats
[] # history
)
def handle_example_select(self, evt: gr.SelectData):
"""Handle example selection from gallery"""
try:
if evt.index is not None and evt.index < len(DEMO_LIST):
return DEMO_LIST[evt.index]['description']
return ""
except Exception:
return ""
def get_model_info_html(self, model):
"""Generate HTML for model information"""
vision_badge = '👁️ Vision' if model.get('supports_vision') else ''
category_color = {
'General': '#3b82f6',
'Code Specialist': '#10b981',
'Vision-Language': '#f59e0b',
'Premium': '#8b5cf6'
}.get(model.get('category', 'General'), '#6b7280')
return f"""