# app.py - Jekyll Master AI Demo (FIXED) import gradio as gr import torch from transformers import AutoTokenizer, AutoModelForCausalLM import warnings warnings.filterwarnings("ignore") # ================= CONFIGURATION ================= MODEL_ID = "daffaaditya/jekyll-master-ai" # Model Anda yang sudah diupload print("=" * 60) print("š Jekyll Master AI - Live Demo") print(f"š¦ Using model: {MODEL_ID}") print("=" * 60) # ================= LOAD MODEL ================= def load_model(): """Load model""" print("š„ Loading model...") try: # Load tokenizer dan model langsung dari repo Anda tokenizer = AutoTokenizer.from_pretrained( MODEL_ID, trust_remote_code=True ) # Load model dengan quantization untuk hemat memory model = AutoModelForCausalLM.from_pretrained( MODEL_ID, torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32, device_map="auto" if torch.cuda.is_available() else None, trust_remote_code=True, low_cpu_mem_usage=True ) print("ā Model loaded successfully!") if torch.cuda.is_available(): print(f"š± Device: GPU ({torch.cuda.get_device_name(0)})") else: print(f"š± Device: CPU") except Exception as e: print(f"ā Error loading model: {e}") print("š Using fallback mode...") # Fallback untuk testing tokenizer = None model = None return tokenizer, model # Load model - only once at startup tokenizer, model = load_model() # ================= GENERATION FUNCTION ================= def generate_jekyll_code(instruction, max_tokens=500, temperature=0.7): """Generate Jekyll code""" try: print(f"\nš„ Instruction: {instruction[:50]}...") # Jika model tidak loaded, beri contoh if model is None or tokenizer is None: example_output = """# Jekyll Master AI - Example Output # Model is loading or in fallback mode # Here's an example _config.yml for a tech blog: title: "Tech Blog" description: "A blog about technology and programming" baseurl: "" url: "https://yourblog.com" theme: minima markdown: kramdown permalink: pretty author: name: "Your Name" email: "you@example.com" plugins: - jekyll-feed - jekyll-seo-tag # Try the live demo when model is fully loaded!""" return example_output # Format prompt sederhana prompt = f"Generate Jekyll code for: {instruction}\n\nCode:" # Tokenize inputs = tokenizer( prompt, return_tensors="pt", truncation=True, max_length=512 ) if torch.cuda.is_available(): inputs = inputs.to("cuda") # Generate with torch.no_grad(): outputs = model.generate( **inputs, max_new_tokens=max_tokens, temperature=temperature, do_sample=True, top_p=0.9, repetition_penalty=1.1, pad_token_id=tokenizer.pad_token_id if tokenizer.pad_token_id else tokenizer.eos_token_id, eos_token_id=tokenizer.eos_token_id ) # Decode generated = tokenizer.decode(outputs[0], skip_special_tokens=True) # Extract code after prompt if prompt in generated: generated = generated.split(prompt)[-1].strip() # Clean up generated = generated.replace(prompt, "").strip() # Jika output kosong if not generated or len(generated) < 20: generated = """# Generated Jekyll Code # Example _config.yml structure: title: "Your Site Title" description: "Your site description" baseurl: "" url: "https://yoursite.com" theme: minima # For better results, be more specific in your request!""" print(f"š¤ Generated {len(generated)} characters") return generated except Exception as e: error_msg = f"Error: {str(e)}" print(f"ā {error_msg}") return f"# Error\n{error_msg}\n\nPlease try again or simplify your request." # ================= GRADIO INTERFACE ================= def create_interface(): """Create simple Gradio interface""" # Contoh instruksi examples = [ ["Buat file _config.yml untuk blog teknologi"], ["Buat layout post dengan featured image"], ["Buat include untuk navigation bar"], ["Buat plugin untuk reading time"], ["Buat file Sass untuk buttons"], ] with gr.Blocks(title="Jekyll Master AI") as demo: # Custom CSS via HTML element gr.HTML(""" """) # Header gr.HTML("""
Fine-tuned AI untuk Jekyll Static Site Generator
Generate clean, production-ready code untuk website Jekyll Anda.