File size: 4,157 Bytes
d0bd3b3
163978a
 
d0bd3b3
163978a
 
 
 
 
d0bd3b3
163978a
 
 
 
 
 
d0bd3b3
163978a
 
d0bd3b3
163978a
 
 
d0bd3b3
163978a
 
 
 
 
d0bd3b3
163978a
 
 
 
 
d0bd3b3
163978a
 
d0bd3b3
163978a
 
 
 
 
 
 
d0bd3b3
163978a
 
d0bd3b3
163978a
 
 
d0bd3b3
163978a
 
d0bd3b3
163978a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d0bd3b3
163978a
 
 
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import gradio as gr
from unsloth import FastLanguageModel
import torch

# Load the pre-trained language model and tokenizer
model_name = "suhaif/unsloth-llama-3-8b-4bit"
max_seq_length = 2048
dtype = None
load_in_4bit = True

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name=model_name,
    max_seq_length=max_seq_length,
    dtype=dtype,
    load_in_4bit=load_in_4bit
)

# Default instruction for generating the story
default_instruction = "You are a creative writer. Based on the given input, generate a well-structured story with an engaging plot, well-developed characters, and immersive details. Ensure the story has a clear beginning, middle, and end. Include dialogue and descriptions to bring the story to life. You can add twist to the story also"

# Function to format the prompt
def format_prompt(input_text, instruction=default_instruction):
    return f"{instruction}\n\nInput:\n{input_text}\n\nResponse:\n"

# Function to generate story from the model
def generate_story(user_input):
    # Format the input
    prompt = format_prompt(user_input)
    inputs = tokenizer([prompt], return_tensors="pt").to("cuda")

    # Generate output from the model
    outputs = model.generate(**inputs, max_new_tokens=500, use_cache=True)
    
    # Decode and return the result
    return tokenizer.decode(outputs[0], skip_special_tokens=True)

# Feedback mechanism (collects and stores feedback)
feedback_data = []

def submit_feedback(rating, feedback_text, story):
    feedback_data.append({
        "rating": rating,
        "feedback_text": feedback_text,
        "story": story
    })
    return "Thank you for your feedback!"

# Community engagement feature - to upload and share stories
shared_stories = []

def share_story(title, story_text):
    shared_stories.append({"title": title, "story_text": story_text})
    return f"Story '{title}' has been shared successfully!"

def display_stories():
    return [(story['title'], story['story_text']) for story in shared_stories]

# Gradio interface
def storytelling_interface():
    # User inputs
    with gr.Blocks() as demo:
        gr.Markdown("# Interactive Storytelling Assistant")
        
        with gr.Row():
            with gr.Column():
                user_input = gr.Textbox(label="Enter your story prompt", placeholder="A young adventurer embarks on a journey to find a lost treasure...", lines=4)
                generate_button = gr.Button("Generate Story")
                
                story_output = gr.Textbox(label="Generated Story", placeholder="Generated story will appear here...", lines=10, interactive=False)
                
                generate_button.click(fn=generate_story, inputs=user_input, outputs=story_output)
            
            with gr.Column():
                gr.Markdown("## Provide Feedback")
                rating = gr.Slider(1, 5, step=1, label="Rate the story")
                feedback_text = gr.Textbox(label="Feedback", placeholder="Provide any suggestions or comments...", lines=3)
                submit_feedback_button = gr.Button("Submit Feedback")
                submit_feedback_button.click(fn=submit_feedback, inputs=[rating, feedback_text, story_output], outputs=None)
        
        with gr.Row():
            gr.Markdown("## Share your Story")
            title = gr.Textbox(label="Story Title", placeholder="Enter the title of your story")
            story_text = gr.Textbox(label="Your Story", placeholder="Enter your full story here...", lines=8)
            share_button = gr.Button("Share Story")
            share_button.click(fn=share_story, inputs=[title, story_text], outputs=None)

        with gr.Row():
            gr.Markdown("## Browse Shared Stories")
            stories_list = gr.Dropdown(display_stories, label="Select a story to read")
            story_display = gr.Textbox(label="Story Content", lines=10, interactive=False)
            stories_list.change(fn=lambda title: next(story['story_text'] for story in shared_stories if story['title'] == title), inputs=stories_list, outputs=story_display)
    
    demo.launch()

# Start the storytelling interface
storytelling_interface()