File size: 3,933 Bytes
0b75c79
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from .generator import generate_chain
from .utils import load_yaml, load_txt, save_json
import ast

from langchain_core.output_parsers import StrOutputParser


def create_custom_world(prompt, language='한국어', save=False):
    '''
    config: prompt.yaml
    prompt = config['create_custom_world_prompt']

    User가 직접 topic을 정하고, world_story를 입력합니다. 게임의 전반적인 세계관과 게임의 룰을 정합니다.
    
    ex) 
    topic: 해리 포터
    world_story: 해리 포터 세계는 마법사들의 세계입니다. 
    빗자루를 타고 날아다니며, 신기한 마법 생물 그리핀, 피닉스 등이 있습니다. 
    어둠의 세력과 맞서 싸우세요.
    '''
    topic = input("세계관 주제를 알려 주세요 ex)마법사 세계, 우주 전쟁: ")
    world_story = input("구체적인 세계관 설명과 룰을 소개하세요: ")
    prompt_variable = {'topic':topic,
                       'context':world_story,
                       'language':language,}
    
    world_summary =  generate_chain(prompt, prompt_variable)

    if save == True:
        save_json(topic + '_world.json', {'topic':topic, 'world_summary':world_summary})

    return topic, world_summary



def create_scenario(topic, context, output_count=5, language='한국어', save=False):
    '''
    config: prompt.yaml
    prompt = config['create_scenario_prompt']

    주어진 world_summary를 바탕으로 {output_count} 개의 scenario를 생성합니다.
    '''
    prompt_variable = {'topic':topic,
                       'output_count':output_count,
                       'context':context,
                       'language':language,}
    
    scenario = generate_chain(prompt,
                              prompt_variable)

    while(True):
        try:
            storyline = generate_chain(prompt,
                                    prompt_variable,
                                    parser=StrOutputParser())
            scenario = ast.literal_eval(storyline)

            if save == True:
                prompt_variable['scenario'] = scenario
                save_json(str(topic) + '_scenario.json', prompt_variable)

            return scenario
        except:
            continue


def create_storyline(topic, context, output_count=5, language='한국어', save=False):
    '''
    config: prompt.yaml
    prompt = config['create_storyline_prompt']
    
    주어진 scenario를 바탕으로 세부적인 게임 storyline을 {output_count} 개의 원소로 가지는 파이썬 리스트로 생성합니다.
    '''
    prompt_variable = {'topic':topic,
                       'output_count': output_count,
                       'context':context,
                       'language':language,}
 
    while(True):
        try:
            storyline = generate_chain(prompt,
                                    prompt_variable,
                                    parser=StrOutputParser())
            storyline_list = ast.literal_eval(storyline)
            if save== True:
                prompt_variable['scenario'] = context
                prompt_variable['story_line'] = storyline_list
                save_json(str(topic) + str('story_line') +'.json', prompt_variable)

            return storyline_list
        except:
            continue
            

if __name__ == '__main__':
    config = load_yaml(path='prompt.yaml')
    create_new_world = True
    save = True

    if create_new_world:
        topic, world_summary = create_custom_world(config['create_custom_world_prompt'], save=save)

    else:
        topic = 'harry potter'
        world_summary = load_txt('dummy/world_summary.txt')

    print(world_summary)
    scenario = create_scenario(topic, world_summary, config['create_scenario_prompt'], output_count=1, save=save)
    print(scenario)
    print(create_storyline(topic, scenario[0], config['create_storyline_prompt'], save=save))