File size: 6,143 Bytes
e26a955
2ad363a
7aaca67
e26a955
2ad363a
1a0f17a
2ad363a
7aaca67
e26a955
 
 
 
 
 
a4fcad4
72c8e9b
a4fcad4
 
 
1a14bd4
49885a1
8ceb1e8
a4fcad4
 
 
 
 
 
7aaca67
e26a955
2ad363a
a4fcad4
2ad363a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a4fcad4
2ad363a
 
 
 
 
 
 
 
e26a955
 
 
 
 
 
a4fcad4
2ad363a
 
8171d56
2ad363a
e26a955
2ad363a
a4fcad4
 
dd4ec62
e26a955
a4fcad4
 
e26a955
a4fcad4
2ad363a
 
 
 
 
 
 
 
e26a955
2ad363a
 
 
 
 
 
 
 
 
e26a955
2ad363a
 
 
 
 
 
 
 
 
e26a955
2ad363a
 
 
 
 
 
 
 
 
e26a955
 
 
 
 
 
2ad363a
 
 
e26a955
a4fcad4
2ad363a
e26a955
2ad363a
 
 
 
 
 
 
 
e26a955
 
 
 
 
 
 
 
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
from huggingface_hub import InferenceClient 
import gradio as gr

# Подключаем клиента для текстовой модели
client = InferenceClient(
    "mistralai/Mistral-7B-Instruct-v0.3"
)

# Подключаем клиента для генерации изображений
image_client = InferenceClient(
    "stabilityai/stable-diffusion-2"
)

# Форматируем текстовый запрос
def format_prompt(message, history, genre):
    prompt = f"Ты — персонаж в текстовой игре, тебя зовут Рассказчик, взаимодействующий с игроком на русском языке. " \
             f"Ты находишься в жанре игры: {genre}. Каждый твой ответ должен продолжать сюжет игры, принимая во внимание прошлые действия игрока и текущую ситуацию. " \
             f"Твой стиль общения должен быть интересным и поддерживать атмосферу игры. Ты должен поддерживать динамичность сюжета и постоянно добавлять элементы интерактивности и новых вызовов. " \
             f"В начале игры игроку предоставляется информация о мире, его текущем положении и доступных действиях. Он может выбирать из предложенных вариантов или описывать свои действия свободно. " \
             f"Важно, чтобы ты адаптировал ответы в зависимости от решений игрока и развивал сюжет на основе их выбора. Каждый ответ должен быть логичным продолжением событий, с описанием последствий выбранных действий." \
             f"В жанре Horror нужно вызвать у игрока эффект зловещей долины, и иногда ломать четвёртую стену." \
             f"Стиль повествования меняется в зависимости от жанра"
    
    for user_prompt, bot_response in history:
        prompt += f"[INST] {user_prompt} [/INST]"
        prompt += f" {bot_response}</s> "
    prompt += f"[INST] {message} [/INST]"
    return prompt

# Генерация текста
def generate(
    prompt, history, system_prompt, genre, temperature=0.9, max_new_tokens=256, top_p=0.95, repetition_penalty=1.0,
):
    temperature = float(temperature)
    if temperature < 1e-2:
        temperature = 1e-2
    top_p = float(top_p)

    generate_kwargs = dict(
        temperature=temperature,
        max_new_tokens=max_new_tokens,
        top_p=top_p,
        repetition_penalty=repetition_penalty,
        do_sample=True,
        seed=42,
    )

    formatted_prompt = format_prompt(f"{system_prompt}, {prompt}", history, genre)
    stream = client.text_generation(formatted_prompt, **generate_kwargs, stream=True, details=True, return_full_text=True)
    output = ""

    for response in stream:
        output += response.token.text
        yield output
    return output

# Генерация изображений
def generate_image(description):
    image = image_client.text_to_image(description, width=512, height=512)
    return image.url

# Дополнительные настройки для Gradio
additional_inputs = [
    gr.Textbox(
        label="System Prompt",
        max_lines=1,
        interactive=True,
        visible=False  # Скрыть поле ввода системного запроса
    ),
    gr.Radio(
        label="Game Genre",
        choices=["Investigation", "Fantasy", "Sci-Fi", "Horror", "Adventure", "Mystery"],
        value="Horror",  # Жанр по умолчанию
        interactive=True,
        info="Select the genre of the game",
        visible=True  # Отображение выбора жанра
    ),
    gr.Slider(
        label="Temperature",
        value=0.1,
        minimum=0.0,
        maximum=1.0,
        step=0.05,
        interactive=True,
        info="Higher values produce more diverse outputs",
        visible=False  # Скрыть слайдер температуры
    ),
    gr.Slider(
        label="Max new tokens",
        value=1024,
        minimum=128,
        maximum=8192,
        step=64,
        interactive=True,
        info="The maximum numbers of new tokens",
        visible=False  # Скрыть слайдер максимального числа токенов
    ),
    gr.Slider(
        label="Top-p (nucleus sampling)",
        value=0.90,
        minimum=0.0,
        maximum=1,
        step=0.05,
        interactive=True,
        info="Higher values sample more low-probability tokens",
        visible=False  # Скрыть слайдер top-p
    ),
    gr.Slider(
        label="Repetition penalty",
        value=1.2,
        minimum=1.0,
        maximum=2.0,
        step=0.05,
        interactive=True,
        info="Penalize repeated tokens",
        visible=False  # Скрыть слайдер штрафа за повторения
    ),
    gr.Textbox(
        label="Image Description",
        placeholder="Describe the scene or character you want to generate.",
        interactive=True
    )
]

# Пример выбора
examples = [["Подробнее"], ["Варианты"]]

# Интерфейс Gradio
gr.ChatInterface(
    fn=generate,
    chatbot=gr.Chatbot(show_label=False, show_share_button=True, show_copy_button=True, likeable=True, layout="panel"),
    additional_inputs=additional_inputs,
    title="theGame",
    examples=examples,
    concurrency_limit=20,
).launch(show_api=False)

# Интерфейс для генерации картинок
gr.Interface(
    fn=generate_image,
    inputs="text",
    outputs="image",
    title="Image Generator"
).launch()