File size: 6,164 Bytes
184a955
 
 
 
 
 
 
 
 
5451740
184a955
 
 
 
 
 
 
 
 
 
5451740
184a955
 
 
 
 
 
37d8827
 
 
 
 
 
 
 
184a955
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37d8827
 
184a955
 
 
 
adb9705
 
 
 
184a955
 
 
 
 
22eb59f
184a955
 
 
 
 
 
 
 
 
 
f2d1068
184a955
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5f550df
 
 
 
184a955
5f550df
 
 
184a955
37d8827
 
 
 
184a955
37d8827
 
 
184a955
 
37d8827
 
184a955
 
 
 
22eb59f
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
import gradio as gr
import openai
from reportlab.pdfgen import canvas

# FUNCTION


def storyGPT(key, name, situation, direction):
    messages = [{"role": "system", "content": "You are a inspiring storyteller and therapist who understand young people and students' struggle."},
                {"role": "user", "content": "Write the first part amongst 3 of a story about " + name + "who is "+situation+". Include a bold heading above the top starting with 'First part:'. Limit your answer to 4 sentences or less."}]

    openai.api_key = key
    first_part_story = openai.ChatCompletion.create(
        model="gpt-3.5-turbo", messages=messages)

    system_message = first_part_story["choices"][0]['message']
    messages.append(system_message)

    for i in ["Second"]:
        new_story_first_half = {
            "role": "user", "content": f"Write the {i} part of the story among 3 continuing from the previous part. Include a bold heading above the top starting with '{i} part:'. Limit your answer to 4 sentences or less."}
        messages.append(new_story_first_half)
        story = openai.ChatCompletion.create(
            model="gpt-3.5-turbo", messages=messages)
        system_message = story["choices"][0]["message"]
        messages.append(system_message)

    for i in ["Third", "Final"]:
        new_story_second_half = {
            "role": "user", "content": f"Write the {i} part of the story among 3 continuing from the previous part"+"in the "+direction+". Include a bold heading above the top starting with '{i} part:'. Limit your answer to 4 sentences or less"}
        messages.append(new_story_second_half)
        story = openai.ChatCompletion.create(
            model="gpt-3.5-turbo", messages=messages)
        system_message = story["choices"][0]["message"]
        messages.append(system_message)

    story_parts = []
    for message in messages:
        if message['role'] == 'assistant':
            story_parts.append(message['content'])

    illustration_parts = []

    for story_part in story_parts:
        illustration = openai.Image.create(
            prompt=story_part,
            n=1,
            size="256x256")
        image_url = illustration['data'][0]['url']
        illustration_parts.append(image_url)

    for i in range(len(story_parts)):
        story_parts[i] = story_parts[i].replace(". ", ".\n\n")

    return (story_parts[0], illustration_parts[0], story_parts[1], illustration_parts[1], story_parts[2], illustration_parts[2], story_parts[3], illustration_parts[3])
    # return (story_parts[0], story_parts[1], story_parts[2])


# EXAMPLE

key1 = "Please provide OpenAI API key"
name1 = "Nova"
situation1 = "Nova is a human-like android living in a world where androids are oppressed and treated as second-class citizens. She has been working as a servant for a wealthy human family for years, but she dreams of a world where androids are free and treated with respect"
direction1 = "Nova finds herself on the run from the authorities after being falsely accused of committing a crime. Along the way, she meets a group of rebels who are fighting for android freedom. As Nova joins their cause, she discovers a shocking truth about the origins of androids and sets out to help her people gain their freedom"

# INTERFACE

with gr.Blocks(title="StoryGPT", css="#button{background-color:#4CAF50} #title{text-align: center} footer{visibility: hidden}") as interface:

    

    gr.Markdown(
        """
    <h1 style="margin-bottom:0px"> StoryGPT</h1>
        """, elem_id="title")

    with gr.Row(elem_id="main"):

        with gr.Column(scale=1):
            
            key = gr.Textbox(label="Your OPENAI api key", type="password")
            name = gr.Textbox(label="Character's name")
            situation = gr.Textbox(
                label="What is the character's life situation?")
            direction = gr.Textbox(
                label="What direction do you want the story to go?")
            Generate_btn = gr.Button(value="Generate", elem_id="button")
            examples = gr.Examples(examples=[[key1, name1, situation1, direction1]], inputs=[
                key, name, situation, direction], label="Click here to test with our example")

        with gr.Column(scale=7, container=False):

            with gr.Row(variant="compact").style(equal_height=True):
                with gr.Column(scale=3):
                    story1 = gr.Textbox(show_label=False, lines=9).style(
                        container=False)

                with gr.Column(scale=1):
                    illustration1 = gr.Image(
                        show_label=False, brush_radius=0).style(height=200)

            with gr.Row(variant="compact").style(equal_height=True):
                with gr.Column(scale=3):
                    story2 = gr.Textbox(show_label=False, lines=9).style(
                        container=False)

                with gr.Column(scale=1):
                    illustration2 = gr.Image(
                        show_label=False, brush_radius=0, lines=9).style(height=200)

            with gr.Row(variant="compact").style(equal_height=True):
                with gr.Column(scale=3):
                    story3 = gr.Textbox(show_label=False, lines=9).style(
                        container=False)

                with gr.Column(scale=1):
                    illustration3 = gr.Image(
                        show_label=False, brush_radius=0).style(height=200)

            with gr.Row(variant="compact").style(equal_height=True):
                with gr.Column(scale=3):
                    story4 = gr.Textbox(show_label=False, lines=9).style(
                        container=False)

                with gr.Column(scale=1):
                    illustration4 = gr.Image(
                        show_label=False, brush_radius=0).style(height=200)

    inputs = [key, name, situation, direction]
    outputs = [story1, illustration1, story2,illustration2, story3, illustration3, story4, illustration4]
    # outputs = [story1, illustration1, story2,illustration2, story3, illustration3]

    Generate_btn.click(storyGPT, inputs=inputs, outputs=outputs)


interface.launch()