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