daffaaditya's picture
Update app.py
3d3e355 verified
raw
history blame
8.71 kB
# 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"],
]
# CSS sederhana
css = """
.gradio-container { max-width: 1200px; margin: 0 auto; }
.header { text-align: center; padding: 20px; }
.example-btn { margin: 5px; }
"""
with gr.Blocks(css=css, title="Jekyll Master AI") as demo:
# Header
gr.Markdown("""
# 🎯 Jekyll Master AI
**Fine-tuned AI untuk Jekyll Static Site Generator**
Generate clean, production-ready code untuk website Jekyll Anda.
""")
with gr.Row():
with gr.Column(scale=1):
# Input
instruction = gr.Textbox(
label="Instruksi",
placeholder="Contoh: Buat file _config.yml untuk blog teknologi...",
lines=4
)
# Parameters
with gr.Accordion("βš™οΈ Parameters", open=False):
max_tokens = gr.Slider(
minimum=100,
maximum=1000,
value=500,
step=50,
label="Max Tokens"
)
temperature = gr.Slider(
minimum=0.1,
maximum=1.5,
value=0.7,
step=0.1,
label="Temperature"
)
# Buttons
with gr.Row():
generate_btn = gr.Button("πŸš€ Generate Code", variant="primary")
clear_btn = gr.Button("πŸ—‘οΈ Clear", variant="secondary")
with gr.Column(scale=2):
# Output
output = gr.Code(
label="Generated Jekyll Code",
language="yaml",
lines=20
)
# Quick examples
gr.Markdown("### πŸš€ Contoh Cepat")
with gr.Row():
for text, example in [
("πŸ“ Config", "Buat _config.yml untuk blog"),
("🎨 Layout", "Buat layout post"),
("πŸ”§ Plugin", "Buat plugin Jekyll"),
]:
gr.Button(
text,
size="sm",
variant="secondary"
).click(
lambda ex=example: ex,
outputs=instruction
)
# Full examples
gr.Examples(
examples=examples,
inputs=instruction,
outputs=output,
fn=generate_jekyll_code,
cache_examples=False,
label="Klik contoh untuk mencoba:"
)
# Footer
gr.Markdown("---")
gr.Markdown(f"""
**Model:** [{MODEL_ID}](https://huggingface.co/{MODEL_ID}) |
**Dataset:** [Jekyll Master Dataset](https://huggingface.co/datasets/daffaaditya/jekyll-master-dataset) |
**Built with:** Transformers + Gradio
""")
# ============ EVENT HANDLERS ============
# Generate button
generate_btn.click(
fn=generate_jekyll_code,
inputs=[instruction, max_tokens, temperature],
outputs=output
)
# Clear button
clear_btn.click(
fn=lambda: ("", ""),
inputs=[],
outputs=[instruction, output]
)
# Enter key submit
instruction.submit(
fn=generate_jekyll_code,
inputs=[instruction, max_tokens, temperature],
outputs=output
)
return demo
# ================= LAUNCH =================
if __name__ == "__main__":
print("πŸš€ Launching Jekyll Master AI Demo...")
demo = create_interface()
demo.launch(
server_name="0.0.0.0",
server_port=7860,
share=False
)