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()