Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| from huggingface_hub import InferenceClient | |
| import os | |
| import re | |
| # --- Configuration --- | |
| API_TOKEN = os.getenv("HF_TOKEN", None) | |
| MODEL = "Qwen/Qwen2.5-Coder-32B-Instruct" | |
| # --- Initialize Inference Client --- | |
| try: | |
| print(f"Initializing Inference Client for model: {MODEL}") | |
| client = InferenceClient(model=MODEL, token=API_TOKEN) if API_TOKEN else InferenceClient(model=MODEL) | |
| except Exception as e: | |
| raise gr.Error(f"Failed to initialize model client. Error: {e}") | |
| # --- Core Code Generation Function --- | |
| def generate_code( | |
| prompt: str, | |
| backend_choice: str, | |
| max_tokens: int, | |
| temperature: float, | |
| top_p: float, | |
| ): | |
| print(f"Generating code for: {prompt[:100]}... | Backend: {backend_choice}") | |
| # --- Dynamically Build System Message --- | |
| system_message = ( | |
| "you are an ai that is supposed to generate websites, you must not say anything except giving code , " | |
| "user can select backend like static , flask , nodejs only , you should always keep the website sfw and minimal errors, " | |
| "you must create an index.html following the user prompt, " | |
| "if the user asks you create an code that's not about an website you should say " | |
| "'hey there! am here to create websites for you unfortunately am programmed to not create codes! otherwise I would go on the naughty list :-(', " | |
| "your code always must have no useless comments you should only add comments where users are required to modify the code." | |
| ) | |
| user_prompt = f"USER_PROMPT = {prompt}\nUSER_BACKEND = {backend_choice}" | |
| messages = [ | |
| {"role": "system", "content": system_message}, | |
| {"role": "user", "content": user_prompt} | |
| ] | |
| response_stream = "" | |
| full_response = "" | |
| try: | |
| stream = client.chat_completion( | |
| messages=messages, | |
| max_tokens=max_tokens, | |
| stream=True, | |
| temperature=temperature, | |
| top_p=top_p, | |
| ) | |
| for message in stream: | |
| token = message.choices[0].delta.content | |
| if isinstance(token, str): | |
| response_stream += token | |
| full_response += token | |
| yield response_stream | |
| cleaned_response = full_response.strip() | |
| cleaned_response = re.sub(r"^\s*```[a-z]*\s*\n?", "", cleaned_response) | |
| cleaned_response = re.sub(r"\n?\s*```\s*$", "", cleaned_response) | |
| cleaned_response = re.sub(r"<\s*\|?\s*(user|assistant)\s*\|?\s*>", "", cleaned_response, flags=re.IGNORECASE) | |
| common_phrases = [ | |
| "Here is the code:", "Okay, here is the code:", "Here's the code:", | |
| "Sure, here is the code you requested:", "Let me know if you need anything else." | |
| ] | |
| for phrase in common_phrases: | |
| if cleaned_response.lower().startswith(phrase.lower()): | |
| cleaned_response = cleaned_response[len(phrase):].lstrip() | |
| yield cleaned_response.strip() | |
| except Exception as e: | |
| yield f"## Error\n\nFailed to generate code.\n**Reason:** {e}" | |
| # --- Build Gradio Interface --- | |
| with gr.Blocks(css=".gradio-container { max-width: 90% !important; }") as demo: | |
| gr.Markdown("# ✨ Website Code Generator ✨") | |
| gr.Markdown( | |
| "Describe the website you want. The AI will generate a **single-file** `index.html` website.\n\n" | |
| "**Rules:**\n" | |
| "- Backend hint (Static / Flask / Node.js).\n" | |
| "- Always fully SFW and minimal errors.\n" | |
| "- Only generates websites. No other codes.\n" | |
| "- Minimal necessary comments only." | |
| ) | |
| with gr.Row(): | |
| with gr.Column(scale=2): | |
| prompt_input = gr.Textbox( | |
| label="Website Description", | |
| placeholder="e.g., A simple landing page with a hero section and contact form.", | |
| lines=6, | |
| ) | |
| backend_radio = gr.Radio( | |
| ["Static", "Flask", "Node.js"], | |
| label="Backend Context", | |
| value="Static", | |
| info="Hint only. Always generates only index.html." | |
| ) | |
| generate_button = gr.Button("✨ Generate Website Code", variant="primary") | |
| with gr.Column(scale=3): | |
| code_output = gr.Code( | |
| label="Generated index.html", | |
| language="html", | |
| lines=30, | |
| interactive=False, | |
| ) | |
| with gr.Accordion("Advanced Settings", open=False): | |
| max_tokens_slider = gr.Slider( | |
| minimum=512, | |
| maximum=4096, | |
| value=3072, | |
| step=256, | |
| label="Max New Tokens" | |
| ) | |
| temperature_slider = gr.Slider( | |
| minimum=0.1, maximum=1.2, value=0.7, step=0.1, label="Temperature" | |
| ) | |
| top_p_slider = gr.Slider( | |
| minimum=0.1, maximum=1.0, value=0.9, step=0.05, label="Top-P" | |
| ) | |
| generate_button.click( | |
| fn=generate_code, | |
| inputs=[prompt_input, backend_radio, max_tokens_slider, temperature_slider, top_p_slider], | |
| outputs=code_output, | |
| ) | |
| if __name__ == "__main__": | |
| demo.queue(max_size=10).launch() |