File size: 4,790 Bytes
2ad363a
 
7aaca67
2ad363a
06f59f8
2ad363a
7aaca67
a4fcad4
 
 
 
 
1a14bd4
8ceb1e8
a4fcad4
 
 
 
 
 
7aaca67
2ad363a
a4fcad4
2ad363a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a4fcad4
2ad363a
 
 
 
 
 
 
 
a4fcad4
2ad363a
 
8171d56
2ad363a
1a14bd4
2ad363a
a4fcad4
 
 
 
 
 
1a14bd4
a4fcad4
2ad363a
 
 
 
 
 
 
 
1a14bd4
2ad363a
 
 
 
 
 
 
 
 
1a14bd4
2ad363a
 
 
 
 
 
 
 
 
1a14bd4
2ad363a
 
 
 
 
 
 
 
 
1a14bd4
2ad363a
 
 
a4fcad4
2ad363a
 
 
 
 
 
 
 
 
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
from huggingface_hub import InferenceClient
import gradio as gr

client = InferenceClient(
    "mistralai/Mistral-Large-Instruct-2411"
)

def format_prompt(message, history, genre):
    prompt = f"Ты — персонаж в текстовой игре, тебя зовут Рассказчик, взаимодействующий с игроком на русском языке. " \
             f"Ты находишься в жанре игры: {genre}. Каждый твой ответ должен продолжать сюжет игры, принимая во внимание прошлые действия игрока и текущую ситуацию. " \
             f"Твой стиль общения должен быть интересным и поддерживать атмосферу игры. Ты должен поддерживать динамичность сюжета и постоянно добавлять элементы интерактивности и новых вызовов. " \
             f"В начале игры игроку предоставляется информация о мире, его текущем положении и доступных действиях. Он может выбирать из предложенных вариантов или описывать свои действия свободно. " \
             f"Важно, чтобы ты адаптировал ответы в зависимости от решений игрока и развивал сюжет на основе их выбора. Каждый ответ должен быть логичным продолжением событий, с описанием последствий выбранных действий." \
             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

additional_inputs = [
    gr.Textbox(
        label="System Prompt",
        max_lines=1,
        interactive=True,
        visible=False  # Hides the system prompt input
    ),
    gr.Radio(
        label="Game Genre",
        choices=["Fantasy", "Sci-Fi", "Horror", "Adventure", "Mystery"],
        value="Fantasy",  # Default genre
        interactive=True,
        info="Select the genre of the game",
        visible=True  # Hides the genre selection
    ),
    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  # Hides the temperature slider
    ),
    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  # Hides the max new tokens slider
    ),
    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  # Hides the top-p slider
    ),
    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  # Hides the repetition penalty slider
    )
]

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

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)