File size: 6,086 Bytes
8b6fc82 52e9ca9 0a9c605 a73275a 52e9ca9 227495f 8246252 227495f 52e9ca9 227495f 52e9ca9 8246252 227495f 52e9ca9 227495f 9b8ec81 227495f 8246252 52e9ca9 227495f bfd7197 52e9ca9 227495f 52e9ca9 227495f 46c562f 52e9ca9 227495f 46c562f 52e9ca9 46c562f 227495f 52e9ca9 8b6fc82 52e9ca9 227495f 8246252 52e9ca9 8246252 52e9ca9 227495f 52e9ca9 227495f 52e9ca9 bfd7197 52e9ca9 227495f 52e9ca9 bfd7197 52e9ca9 0a9c605 a73275a 52e9ca9 a73275a 0a9c605 227495f |
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 |
#### 2. Corrected `app.py`
# /app.py
""" Main Gradio application for AnyCoder. """
import gradio as gr
import os
from config import AVAILABLE_MODELS, MULTIMODAL_MODELS, DEMO_LIST
from core import generate_code
from deployment import deploy_to_hf_space
from utils import get_gradio_language, history_to_chatbot_messages
# --- Event Handlers ---
def on_generate_click(query: str, image: gr.Image, file: gr.File, website_url: str, history: list, model_name: str, enable_search: bool, language: str):
if not any([query, image, file, website_url]):
yield {
code_output: gr.update(value="## Please provide a prompt, image, file, or URL.", language="markdown"),
history_output: history_to_chatbot_messages(history)
}
return
model_config = next((m for m in AVAILABLE_MODELS if m['name'] == model_name), AVAILABLE_MODELS[0])
for response in generate_code(query, image, file.name if file else None, website_url, history, model_config, enable_search, language):
ui_update = {code_output: gr.update(value=response.get("code_output"), language=get_gradio_language(language))}
if "history" in response:
ui_update[history_state] = response["history"]
ui_update[history_output] = history_to_chatbot_messages(response["history"])
yield ui_update
def on_deploy_click(code: str, space_name: str, sdk_name: str, request: gr.Request):
hf_token = request.token
if not hf_token: return gr.update(value="⚠️ Please log in with your Hugging Face account to deploy.", visible=True)
sdk = {"Static (HTML)": "static", "Gradio (Python)": "gradio"}.get(sdk_name, "static")
return gr.update(value=deploy_to_hf_space(code, space_name, sdk, hf_token), visible=True)
def update_preview(code: str):
"""Updates the preview pane based on the generated code."""
if code and code.strip():
safe_code = code.replace('"', '"')
iframe_html = f'<iframe srcdoc="{safe_code}" width="100%" height="920px" style="border:0;"></iframe>'
return gr.HTML(iframe_html, visible=True), gr.Markdown(visible=False)
else:
return gr.HTML(visible=False), gr.Markdown(visible=True)
# --- UI Layout ---
with gr.Blocks(theme=gr.themes.Default(primary_hue="blue"), title="AnyCoder AI") as demo:
history_state = gr.State([])
gr.Markdown("# 🚀 AnyCoder AI - Multi-Provider Code Generator")
with gr.Row():
with gr.Column(scale=1):
input_prompt = gr.Textbox(label="Prompt", placeholder="e.g., a login form with a blue button", lines=4)
model_dropdown = gr.Dropdown(choices=[m['name'] for m in AVAILABLE_MODELS], value=AVAILABLE_MODELS[0]['name'], label="Select Model")
language_dropdown = gr.Dropdown(choices=["html", "python", "javascript", "css", "react"], value="html", label="Language")
website_url_input = gr.Textbox(label="URL to Redesign", placeholder="https://example.com")
with gr.Row():
file_input = gr.File(label="Reference File", scale=2)
image_input = gr.Image(label="UI Image", type="numpy", visible=False, scale=1)
search_toggle = gr.Checkbox(label="Enable Web Search", value=False)
with gr.Row():
clear_btn = gr.Button("Clear")
generate_btn = gr.Button("Generate", variant="primary", scale=2)
gr.Markdown("--- \n**Quick Examples**")
for item in DEMO_LIST:
gr.Button(item['title']).click(lambda d=item['description']: d, outputs=input_prompt)
if os.getenv("SPACE_ID"):
with gr.Accordion("🚀 Deploy to Hugging Face", open=False):
login_button = gr.LoginButton()
space_name_input = gr.Textbox(label="New App Name", placeholder="my-anycoder-app")
sdk_dropdown = gr.Dropdown(choices=["Static (HTML)", "Gradio (Python)"], value="Static (HTML)", label="App Type")
deploy_btn = gr.Button("Deploy")
deploy_status = gr.Markdown(visible=False)
with gr.Column(scale=2):
with gr.Tabs() as tabs:
preview_tab = gr.Tab("Preview")
code_tab = gr.Tab("Code")
history_tab = gr.Tab("History")
with preview_tab:
sandbox = gr.HTML(label="Live Preview", elem_id="sandbox-preview", visible=False)
placeholder = gr.Markdown("### Your live preview will appear here after generation.")
with code_tab:
code_output = gr.Code(label="Generated Code", language="html", interactive=True)
with history_tab:
history_output = gr.Chatbot(label="Conversation History", type="messages", height=600)
# --- Event Wiring ---
model_id = gr.State()
generate_btn.click(on_generate_click,
inputs=[input_prompt, image_input, file_input, website_url_input, history_state, model_dropdown, search_toggle, language_dropdown],
outputs=[code_output, history_state, history_output])
code_output.change(fn=update_preview, inputs=code_output, outputs=[sandbox, placeholder])
clear_btn.click(lambda: ([], [], None, None, None, "", "", None, gr.HTML(visible=False), gr.Markdown(visible=True)),
outputs=[history_state, history_output, input_prompt, image_input, file_input, website_url_input, code_output, model_id, sandbox, placeholder])
def on_model_change(model_name):
mid = next((m['id'] for m in AVAILABLE_MODELS if m['name'] == model_name), None)
is_multimodal = mid in MULTIMODAL_MODELS if mid else False
return mid, gr.update(visible=is_multimodal)
model_dropdown.change(on_model_change, inputs=model_dropdown, outputs=[model_id, image_input])
if os.getenv("SPACE_ID"):
deploy_btn.click(on_deploy_click, inputs=[code_output, space_name_input, sdk_dropdown], outputs=deploy_status)
if __name__ == "__main__":
demo.queue().launch() |