File size: 3,033 Bytes
17a864c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
from transformers import pipeline
import os

# Set Hugging Face endpoint to a mirror to avoid connection issues (WinError 10054/ISP blocks)
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"

# 1. Initialize the Generator
# We use distilgpt2 because it is small (~350MB) and runs fast on a standard CPU.
print("Loading model... this may take a minute on the first run.")
generator = pipeline("text-generation", model="MBZUAI/LaMini-GPT-124M")
def generate_story(prompt, length, temp, top_p):
    if not prompt.strip():
        return "Please enter a prompt to start the story!"

    # 1. The Magic Trick: We format the prompt behind the scenes
    # We tell it it's an instruction, and we forcefully start the response for it.
    formatted_prompt = f"### Instruction:\n{prompt}\n\n### Response:\nOnce upon a time,"

    # 2. Generate the text
    output = generator(
        formatted_prompt,
        max_new_tokens=length,
        temperature=temp,
        top_p=top_p,
        do_sample=True,
        truncation=True,
        # Use the tokenizer's end-of-sentence token for safe padding
        pad_token_id=generator.tokenizer.eos_token_id
    )

    generated_text = output[0]['generated_text']

    # 3. Clean up the output so the user doesn't see the ugly "### Instruction:" part
    # We split the text at "### Response:\n" and only keep the story part.
    if "### Response:\n" in generated_text:
        story_only = generated_text.split("### Response:\n")[1].strip()
    else:
        story_only = generated_text # Fallback just in case

    return story_only

# 2. Build the Gradio Interface
# This defines the layout, sliders, and text boxes.
with gr.Blocks(theme=gr.themes.Soft()) as demo:
    gr.Markdown("# ✍️ Lightweight AI Story Generator")
    gr.Markdown("Enter a starting sentence and let DistilGPT2 finish the story.")

    with gr.Row():
        with gr.Column():
            # Inputs
            input_text = gr.Textbox(
                label="Story Prompt",
                placeholder="Once upon a time, a small robot found a glowing seed...",
                lines=4
            )

            with gr.Accordion("Advanced Settings (Parameters)", open=False):
                slider_len = gr.Slider(10, 200, value=80, step=10, label="Max New Tokens")
                slider_temp = gr.Slider(0.1, 1.5, value=0.8, step=0.1, label="Temperature (Creativity)")
                slider_top_p = gr.Slider(0.1, 1.0, value=0.9, step=0.05, label="Top-P (Nucleus Sampling)")

            btn = gr.Button("Generate Story", variant="primary")

        with gr.Column():
            # Output
            output_text = gr.Textbox(label="Generated Story", lines=12)

    # Link the button to the function
    btn.click(
        fn=generate_story,
        inputs=[input_text, slider_len, slider_temp, slider_top_p],
        outputs=output_text
    )

# 3. Launch the Application
if __name__ == "__main__":
    demo.launch()