File size: 6,550 Bytes
0143a36
 
cb0688f
 
8d6dc6e
 
 
 
 
 
 
 
 
21ec620
 
 
 
 
 
 
0143a36
8d6dc6e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0143a36
cb0688f
21ec620
 
 
cb0688f
 
 
 
 
 
 
 
21ec620
 
 
 
 
 
 
 
 
 
 
 
 
 
8d6dc6e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
import gradio as gr
import random
import os

# Attempt to import required libraries
try:
    from diffusers import StableDiffusionPipeline
    import torch
    STABLE_DIFFUSION_AVAILABLE = True
except ImportError as e:
    print(f"Error importing Stable Diffusion dependencies: {e}")
    STABLE_DIFFUSION_AVAILABLE = False

try:
    import openai
    openai.api_key = os.environ.get("OPENAI_API_KEY")
    USE_GPT = True
except ImportError:
    print("OpenAI library not found. Falling back to basic responses.")
    USE_GPT = False

# Quiz questions and answers
christmas_quiz = [
    {
        "question": "What is the traditional Christmas flower?",
        "options": ["Rose", "Poinsettia", "Tulip", "Daisy"],
        "answer": "Poinsettia"
    },
    {
        "question": "In which country did the tradition of putting up a Christmas tree originate?",
        "options": ["USA", "England", "Germany", "France"],
        "answer": "Germany"
    },
    {
        "question": "What is the name of the ballet often performed at Christmas?",
        "options": ["Swan Lake", "The Nutcracker", "Sleeping Beauty", "Giselle"],
        "answer": "The Nutcracker"
    },
    {
        "question": "Which company was the first to use Santa Claus in advertising?",
        "options": ["Pepsi", "Coca-Cola", "McDonald's", "Walmart"],
        "answer": "Coca-Cola"
    },
    {
        "question": "What is the most popular Christmas dinner in Japan?",
        "options": ["Turkey", "Ham", "KFC Chicken", "Roast Beef"],
        "answer": "KFC Chicken"
    }
]

# Initialize the Stable Diffusion pipeline if available
if STABLE_DIFFUSION_AVAILABLE:
    model_id = "runwayml/stable-diffusion-v1-5"
    pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float32)

def generate_image(prompt):
    if not STABLE_DIFFUSION_AVAILABLE:
        return None
    with torch.no_grad():
        image = pipe(prompt, num_inference_steps=50).images[0]
    return image

def get_gpt_response(prompt, history):
    if not USE_GPT:
        return "I'm sorry, but I'm currently operating with limited capabilities. I can still help with the Christmas quiz and card generation!"
    
    messages = [
        {"role": "system", "content": "You are a helpful Christmas-themed chatbot named Holly. You can answer questions about Christmas, offer holiday tips, and engage in festive conversation. You also know about the Christmas quiz and card generation features of this application."},
    ]
    for h in history:
        messages.append({"role": "user", "content": h[0]})
        messages.append({"role": "assistant", "content": h[1]})
    messages.append({"role": "user", "content": prompt})
    
    try:
        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=messages,
            max_tokens=150,
            n=1,
            stop=None,
            temperature=0.7,
        )
        return response.choices[0].message['content'].strip()
    except Exception as e:
        print(f"Error in GPT response: {e}")
        return "I'm having trouble connecting to my knowledge base right now. Can I help you with the Christmas quiz or card generation instead?"

def chatbot(message, history):
    if not history:
        return "Ho ho ho! Merry Christmas! I'm Holly, your Christmas helper. Would you like to take a Christmas quiz, create a Christmas card, or chat about the holidays?"

    last_response = history[-1][1].lower()

    if "quiz" in message.lower():
        question = random.choice(christmas_quiz)
        options_text = "\n".join([f"{i+1}. {opt}" for i, opt in enumerate(question['options'])])
        return f"Great! Here's your Christmas quiz question:\n\n{question['question']}\n\n{options_text}\n\nPlease enter the number of your answer."

    elif "card" in message.lower():
        if STABLE_DIFFUSION_AVAILABLE:
            return "Wonderful! Let's create a Christmas card. Please describe the scene you'd like on your card, and I'll generate it for you using AI."
        else:
            return "I'm sorry, but the card generation feature is currently unavailable. Would you like to take a Christmas quiz instead?"

    elif any(str(i) in message for i in range(1, 5)):  # Check if the message is a quiz answer
        for q in christmas_quiz:
            if q['question'] in history[-2][1]:  # Find the question in the history
                user_answer = q['options'][int(message) - 1]
                if user_answer == q['answer']:
                    return f"Correct! {q['answer']} is the right answer. Would you like another question, to create a Christmas card, or to chat about something else?"
                else:
                    return f"Sorry, that's not correct. The right answer is {q['answer']}. Would you like another question, to create a Christmas card, or to chat about something else?"

    elif "card" in last_response and STABLE_DIFFUSION_AVAILABLE:
        image = generate_image(f"Christmas card scene: {message}")
        if image:
            return (f"I've created a Christmas card based on your description: '{message}'. You can see it in the image box below. "
                    f"Would you like to create another card, take a quiz, or chat about something else?", image)
        else:
            return "I'm sorry, I couldn't generate the image. Would you like to try again, take a quiz, or chat about something else?"

    else:
        # Use GPT-3.5 for general conversation
        return get_gpt_response(message, history)

# Gradio interface
with gr.Blocks() as demo:
    gr.Markdown("# Christmas Quiz and Card Generator Chatbot")
    gr.Markdown("""
    Welcome to the Christmas Quiz and Card Generator Chatbot!
    - Type 'quiz' to start a Christmas quiz.
    - Type 'card' to create a custom Christmas card.
    - Or just chat about anything Christmas-related!
    """)
    chatbot = gr.Chatbot()
    msg = gr.Textbox(label="Type your message here")
    clear = gr.Button("Clear")

    def user(user_message, history):
        return "", history + [[user_message, None]]

    def bot(history):
        bot_message = chatbot(history[-1][0], history[:-1])
        history[-1][1] = bot_message
        if isinstance(bot_message, tuple):
            return history, bot_message[1]
        return history, None

    image_output = gr.Image()
    msg.submit(user, [msg, chatbot], [msg, chatbot], queue=False).then(
        bot, chatbot, [chatbot, image_output]
    )
    clear.click(lambda: None, None, chatbot, queue=False)

demo.launch()