File size: 5,797 Bytes
e974634
2ad363a
7aaca67
e974634
7aaca67
fb141e5
 
 
 
 
 
 
 
 
 
 
 
cd198d1
fb141e5
 
e974634
e26a955
e38699e
 
e974634
e38699e
 
 
 
 
a4fcad4
cd198d1
a4fcad4
 
7aaca67
cd198d1
fb141e5
cd198d1
fb141e5
 
cd198d1
e38699e
fb141e5
cd198d1
 
 
 
 
 
 
 
fb141e5
cd198d1
 
 
fb141e5
cd198d1
 
 
fb141e5
cd198d1
 
 
 
 
fb141e5
cd198d1
 
fb141e5
cd198d1
 
fb141e5
cd198d1
 
 
 
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
from huggingface_hub import InferenceClient
import gradio as gr

client = InferenceClient("mistralai/Mistral-7B-Instruct-v0.3")

# Шаблоны промптов для каждого жанра
GENRE_PROMPTS = {
    "Investigation": "Ты находишься в жанре игры Investigation на мотив Sherlock Holmes. В игре игрок должен разгадывать сложные загадки, находить улики и разгадывать тайны.",
    "Fantasy": "Ты находишься в жанре игры Fantasy на мотив Final Fantasy. Мир наполнен магией, эпическими сражениями и древними легендами.",
    "Sci-Fi": "Ты находишься в жанре игры Sci-Fi на мотив Alien. Игрок исследует космос, сталкивается с высокими технологиями и инопланетными угрозами.",
    "Horror": "Ты находишься в жанре игры Horror на мотив фильма Saw. Игрок должен пережить атмосферу ужаса, избегая смертельных ловушек.",
    "Adventure": "Ты находишься в жанре игры Adventure на мотив Indiana Jones. Игрок участвует в захватывающих приключениях, полных загадок и опасностей.",
    "Mystery": "Ты находишься в жанре игры Mystery, где игрок разгадывает мистические события и сталкивается с необъяснимым.",
    "You": "Ты находишься в игре, которая выглядит как обычная игра, а на самом деле это психологический тест, но игрок не должен об этом догадываться. Должно быть 50 провокационных вопросов, по типу Проблема вагонетки. В конце игры должен быть составлен психологический портрет игрока. Игра должна морально давить, чтобы проявить все плохие качества игрока."
}

# Глобальное состояние игры
game_state = {
    "players": {},  # Данные каждого игрока
    "story_progress": "Начало игры..."  # Общая история
}

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

def generate(player_id, message, genre, temperature=0.9, max_new_tokens=256, top_p=0.95, repetition_penalty=1.0):
    """Генерация ответа для игрока."""
    if player_id not in game_state["players"]:
        game_state["players"][player_id] = {"history": []}  # Создать историю для нового игрока

    history = game_state["players"][player_id]["history"]
    formatted_prompt = format_prompt(message, history, genre)

    generate_kwargs = {
        "temperature": temperature,
        "max_new_tokens": max_new_tokens,
        "top_p": top_p,
        "repetition_penalty": repetition_penalty,
        "do_sample": True,
        "seed": 42,
    }

    response = client.text_generation(formatted_prompt, **generate_kwargs)
    game_state["players"][player_id]["history"].append((message, response))
    game_state["story_progress"] += f"\n{response}"

    return response

def gradio_interface():
    """Создание интерфейса Gradio для кооперативной игры."""
    with gr.Blocks() as demo:
        player_id = gr.Textbox(label="Player ID", placeholder="Введите ваш уникальный идентификатор")
        genre = gr.Radio(label="Game Genre", choices=list(GENRE_PROMPTS.keys()), value="Horror")
        message = gr.Textbox(label="Ваше сообщение")
        output = gr.Textbox(label="Ответ игры")

        def play_game(player_id, message, genre):
            return generate(player_id, message, genre)

        submit = gr.Button("Отправить")
        submit.click(play_game, inputs=[player_id, message, genre], outputs=output)

    demo.launch()

if __name__ == "__main__":
    gradio_interface()