File size: 6,090 Bytes
52e9ca9
 
0a9c605
a73275a
52e9ca9
227495f
 
8246252
227495f
 
52e9ca9
 
 
227495f
52e9ca9
 
8246252
227495f
 
52e9ca9
 
227495f
 
52e9ca9
227495f
 
9b8ec81
227495f
 
52e9ca9
8246252
 
52e9ca9
 
227495f
 
52e9ca9
 
227495f
52e9ca9
227495f
 
46c562f
52e9ca9
 
 
227495f
46c562f
52e9ca9
 
 
 
 
46c562f
227495f
 
 
52e9ca9
 
 
 
227495f
8246252
 
52e9ca9
 
8246252
 
 
52e9ca9
227495f
52e9ca9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
227495f
52e9ca9
 
 
 
 
 
 
227495f
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
# /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):
    # This is the section with the error
    if not any([query, image, file, website_url]):
        yield {
            # <--- FIX: Change language="text" to language="markdown" ---
            code_output: gr.update(value="## Please provide a prompt, image, file, or URL.", language="markdown"),
            history_output: history_to_chatbot_messages(history)
        }
        return
    
    # The rest of the function is correct and needs no changes
    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

# ... (The rest of the file is correct and does not need to be changed) ...
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)

# --- 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(lambda code: [gr.HTML(f'<iframe srcdoc="{code.replace("\"", """)}" width="100%" height="920px" style="border:0;"></iframe>', visible=True), gr.Markdown(visible=False)] if code else [gr.HTML(visible=False), gr.Markdown(visible=True)], 
        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
        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()