File size: 4,753 Bytes
2bcb2e2 10686a9 5fecd0b 9b171dd 10686a9 9b171dd 10686a9 2bcb2e2 10686a9 2bcb2e2 10686a9 5fecd0b 10686a9 2bcb2e2 10686a9 9b171dd 10686a9 9b171dd 10686a9 5fecd0b 2bcb2e2 10686a9 2bcb2e2 10686a9 5fecd0b 10686a9 2bcb2e2 10686a9 2bcb2e2 10686a9 2bcb2e2 10686a9 2bcb2e2 10686a9 2bcb2e2 10686a9 2bcb2e2 9b171dd 10686a9 2bcb2e2 10686a9 2bcb2e2 9b171dd 10686a9 9b171dd 2bcb2e2 10686a9 |
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 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
# app.py
from typing import Optional, Dict, List, Tuple
import gradio as gr
from constants import HTML_SYSTEM_PROMPT, AVAILABLE_MODELS, DEMO_LIST
from hf_client import get_inference_client
from tavily_search import enhance_query_with_search
from utils import (
extract_text_from_file,
extract_website_content,
apply_search_replace_changes,
history_to_messages,
history_to_chatbot_messages,
remove_code_block,
parse_transformers_js_output,
format_transformers_js_output
)
from deploy import send_to_sandbox, handle_load_project
# Type aliases
History = List[Tuple[str, str]]
# Core generation function
def generation_code(
query: Optional[str],
image: Optional[gr.Image],
file: Optional[str],
website_url: Optional[str],
_setting: Dict[str, str],
_history: Optional[History],
_current_model: Dict,
enable_search: bool,
language: str,
provider: str
) -> Tuple[str, History, str, List[Dict[str, str]]]:
if query is None:
query = ''
if _history is None:
_history = []
system_prompt = _setting.get('system', HTML_SYSTEM_PROMPT)
messages = history_to_messages(_history, system_prompt)
if file:
file_text = extract_text_from_file(file)
if file_text:
query += f"\n\n[Reference file content below]\n{file_text[:5000]}"
if website_url:
website_text = extract_website_content(website_url)
if not website_text.startswith("Error"):
query += f"\n\n[Website content below]\n{website_text[:8000]}"
final_query = enhance_query_with_search(query, enable_search)
messages.append({'role': 'user', 'content': final_query})
client = get_inference_client(_current_model['id'], provider)
completion = client.chat.completions.create(
model=_current_model['id'],
messages=messages,
max_tokens=10000
)
content = completion.choices[0].message.content
has_existing = bool(_history and _history[-1][1])
if language == 'transformers.js':
files = parse_transformers_js_output(content)
code_str = format_transformers_js_output(files)
sandbox_html = send_to_sandbox(files['index.html'])
else:
clean = remove_code_block(content)
if has_existing and not clean.strip().startswith('<!DOCTYPE'):
clean = apply_search_replace_changes(_history[-1][1], clean)
code_str = clean
sandbox_html = send_to_sandbox(clean) if language == 'html' else ''
new_history = _history + [(query, code_str)]
chat_msgs = history_to_chatbot_messages(new_history)
return code_str, new_history, sandbox_html, chat_msgs
with gr.Blocks(
theme=gr.themes.Base(),
title="AnyCoder - AI Code Generator"
) as demo:
history_state = gr.State([])
setting_state = gr.State({'system': HTML_SYSTEM_PROMPT})
current_model = gr.State(AVAILABLE_MODELS[9])
with gr.Sidebar():
gr.LoginButton()
load_project_url = gr.Textbox(label="Hugging Face Space URL")
load_project_btn = gr.Button("Import Project")
load_project_status = gr.Markdown(visible=False)
input_box = gr.Textbox(label="What to build?", lines=3)
language_dropdown = gr.Dropdown(choices=["html", "python", "transformers.js"], value="html")
website_input = gr.Textbox(label="Website URL")
file_input = gr.File(label="Reference file")
image_input = gr.Image(label="Design image")
search_toggle = gr.Checkbox(label="Web search")
model_dropdown = gr.Dropdown(choices=[m['name'] for m in AVAILABLE_MODELS], value=AVAILABLE_MODELS[9]['name'])
generate_btn = gr.Button("Generate")
clear_btn = gr.Button("Clear")
with gr.Column():
with gr.Tabs():
with gr.Tab("Code"):
code_output = gr.Code(label="Generated code")
with gr.Tab("Preview"):
preview = gr.HTML(label="Live preview")
with gr.Tab("History"):
history_output = gr.Chatbot()
load_project_btn.click(
fn=handle_load_project,
inputs=[load_project_url],
outputs=[load_project_status, code_output, preview, load_project_url, history_state, history_output]
)
generate_btn.click(
fn=generation_code,
inputs=[input_box, image_input, file_input, website_input,
setting_state, history_state, current_model,
search_toggle, language_dropdown, gr.State('auto')],
outputs=[code_output, history_state, preview, history_output]
)
clear_btn.click(lambda: ([], [], "", []), outputs=[history_state, history_output, preview, code_output])
if __name__ == "__main__":
demo.queue().launch()
|