Update app.py
Browse files
app.py
CHANGED
@@ -3,28 +3,40 @@ import gradio as gr
|
|
3 |
|
4 |
client = InferenceClient("mistralai/Mistral-7B-Instruct-v0.3")
|
5 |
|
6 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
game_state = {
|
8 |
-
"players": {},
|
9 |
-
"story_progress": "Начало игры..."
|
10 |
}
|
11 |
|
12 |
def format_prompt(message, history, genre, player_id):
|
13 |
-
|
14 |
genre_prompt = GENRE_PROMPTS.get(genre, "Жанр игры неизвестен.")
|
15 |
-
prompt = f"Игрок {player_id} в жанре {genre}. {genre_prompt} История: {game_state['story_progress']}."
|
16 |
for user_prompt, bot_response in history:
|
17 |
prompt += f"[INST] {user_prompt} [/INST] {bot_response}</s> "
|
18 |
prompt += f"[INST] {message} [/INST]"
|
19 |
return prompt
|
20 |
|
21 |
def generate(player_id, message, genre, temperature=0.9, max_new_tokens=256, top_p=0.95, repetition_penalty=1.0):
|
|
|
22 |
if player_id not in game_state["players"]:
|
23 |
-
game_state["players"][player_id] = {"history": []}
|
24 |
-
|
25 |
history = game_state["players"][player_id]["history"]
|
26 |
formatted_prompt = format_prompt(message, history, genre, player_id)
|
27 |
-
|
28 |
generate_kwargs = {
|
29 |
"temperature": temperature,
|
30 |
"max_new_tokens": max_new_tokens,
|
@@ -33,26 +45,27 @@ def generate(player_id, message, genre, temperature=0.9, max_new_tokens=256, top
|
|
33 |
"do_sample": True,
|
34 |
"seed": 42,
|
35 |
}
|
36 |
-
|
37 |
response = client.text_generation(formatted_prompt, **generate_kwargs)
|
38 |
game_state["players"][player_id]["history"].append((message, response))
|
39 |
game_state["story_progress"] += f"\n{response}"
|
40 |
-
|
41 |
return response
|
42 |
|
43 |
def gradio_interface():
|
|
|
44 |
with gr.Blocks() as demo:
|
45 |
player_id = gr.Textbox(label="Player ID", placeholder="Введите ваш уникальный идентификатор")
|
46 |
genre = gr.Radio(label="Game Genre", choices=list(GENRE_PROMPTS.keys()), value="Horror")
|
47 |
message = gr.Textbox(label="Ваше сообщение")
|
48 |
output = gr.Textbox(label="Ответ игры")
|
49 |
-
|
50 |
def play_game(player_id, message, genre):
|
51 |
return generate(player_id, message, genre)
|
52 |
-
|
53 |
submit = gr.Button("Отправить")
|
54 |
submit.click(play_game, inputs=[player_id, message, genre], outputs=output)
|
55 |
-
|
56 |
demo.launch()
|
57 |
|
58 |
if __name__ == "__main__":
|
|
|
3 |
|
4 |
client = InferenceClient("mistralai/Mistral-7B-Instruct-v0.3")
|
5 |
|
6 |
+
# Шаблоны промптов для каждого жанра
|
7 |
+
GENRE_PROMPTS = {
|
8 |
+
"Investigation": "Ты находишься в жанре игры Investigation на мотив Sherlock Holmes. В игре игрок должен разгадывать сложные загадки, находить улики и разгадывать тайны.",
|
9 |
+
"Fantasy": "Ты находишься в жанре игры Fantasy на мотив Final Fantasy. Мир наполнен магией, эпическими сражениями и древними легендами.",
|
10 |
+
"Sci-Fi": "Ты находишься в жанре игры Sci-Fi на мотив Alien. Игрок исследует космос, сталкивается с высокими технологиями и инопланетными угрозами.",
|
11 |
+
"Horror": "Ты находишься в жанре игры Horror на мотив фильма Saw. Игрок должен пережить атмосферу ужаса, избегая смертельных ловушек.",
|
12 |
+
"Adventure": "Ты находишься в жанре игры Adventure на мотив Indiana Jones. Игрок участвует в захватывающих приключениях, полных загадок и опасностей.",
|
13 |
+
"Mystery": "Ты находишься в жанре игры Mystery, где игрок разгадывает мистические события и сталкивается с необъяснимым.",
|
14 |
+
"You": "Ты находишься в игре, которая выглядит как обычная игра, а на самом деле это психологический тест, но игрок не должен об этом догадываться. Должно быть 50 провокационных вопросов, по типу Проблема вагонетки. В конце игры должен быть составлен психологический портрет игрока. Игра должна морально давить, чтобы проявить все плохие качества игрока."
|
15 |
+
}
|
16 |
+
|
17 |
+
# Глобальное состояние игры
|
18 |
game_state = {
|
19 |
+
"players": {}, # Данные каждого игрока
|
20 |
+
"story_progress": "Начало игры..." # Общая история
|
21 |
}
|
22 |
|
23 |
def format_prompt(message, history, genre, player_id):
|
24 |
+
"""Форматирование промпта для генерации текста."""
|
25 |
genre_prompt = GENRE_PROMPTS.get(genre, "Жанр игры неизвестен.")
|
26 |
+
prompt = f"Игрок {player_id} в жанре {genre}. {genre_prompt} История: {game_state['story_progress']}. "
|
27 |
for user_prompt, bot_response in history:
|
28 |
prompt += f"[INST] {user_prompt} [/INST] {bot_response}</s> "
|
29 |
prompt += f"[INST] {message} [/INST]"
|
30 |
return prompt
|
31 |
|
32 |
def generate(player_id, message, genre, temperature=0.9, max_new_tokens=256, top_p=0.95, repetition_penalty=1.0):
|
33 |
+
"""Генерация ответа для игрока."""
|
34 |
if player_id not in game_state["players"]:
|
35 |
+
game_state["players"][player_id] = {"history": []} # Создать историю для нового игрока
|
36 |
+
|
37 |
history = game_state["players"][player_id]["history"]
|
38 |
formatted_prompt = format_prompt(message, history, genre, player_id)
|
39 |
+
|
40 |
generate_kwargs = {
|
41 |
"temperature": temperature,
|
42 |
"max_new_tokens": max_new_tokens,
|
|
|
45 |
"do_sample": True,
|
46 |
"seed": 42,
|
47 |
}
|
48 |
+
|
49 |
response = client.text_generation(formatted_prompt, **generate_kwargs)
|
50 |
game_state["players"][player_id]["history"].append((message, response))
|
51 |
game_state["story_progress"] += f"\n{response}"
|
52 |
+
|
53 |
return response
|
54 |
|
55 |
def gradio_interface():
|
56 |
+
"""Создание интерфейса Gradio для кооперативной игры."""
|
57 |
with gr.Blocks() as demo:
|
58 |
player_id = gr.Textbox(label="Player ID", placeholder="Введите ваш уникальный идентификатор")
|
59 |
genre = gr.Radio(label="Game Genre", choices=list(GENRE_PROMPTS.keys()), value="Horror")
|
60 |
message = gr.Textbox(label="Ваше сообщение")
|
61 |
output = gr.Textbox(label="Ответ игры")
|
62 |
+
|
63 |
def play_game(player_id, message, genre):
|
64 |
return generate(player_id, message, genre)
|
65 |
+
|
66 |
submit = gr.Button("Отправить")
|
67 |
submit.click(play_game, inputs=[player_id, message, genre], outputs=output)
|
68 |
+
|
69 |
demo.launch()
|
70 |
|
71 |
if __name__ == "__main__":
|