File size: 4,820 Bytes
e974634
2ad363a
7aaca67
e974634
7aaca67
fb141e5
 
 
 
 
 
 
 
 
 
 
 
cd198d1
fb141e5
 
e974634
e26a955
cd198d1
fb141e5
e974634
fb141e5
a4fcad4
cd198d1
a4fcad4
 
7aaca67
cd198d1
fb141e5
cd198d1
fb141e5
 
cd198d1
 
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
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, player_id):
    """Форматирование промпта для генерации текста."""
    genre_prompt = GENRE_PROMPTS.get(genre, "Жанр игры неизвестен.")
    prompt = f"Игрок {player_id} в жанре {genre}. {genre_prompt} История: {game_state['story_progress']}. "
    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, player_id)

    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()