File size: 4,910 Bytes
5915dbb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
import gradio as gr
import random
from helper import load_world, save_world
from together import Together
from helper import get_together_api_key
from guardrail import is_safe
from randomselection import randomly_select_from_json
# Initialize Together client
client = Together(api_key=get_together_api_key())

# Load the world data from the JSON file
world_data = load_world('./YourWorld_L1.json')


# Function to randomly select a world, kingdom, town, and character

# Function to initialize or reinitialize the game state
def initialize_game_state():
    random_state = randomly_select_from_json(world_data)
    world = random_state["world"]
    kingdom = random_state["kingdom"]
    town = random_state["town"]
    character = random_state["character"]

    system_prompt = """You are an AI Game master. Your job is to create a 
    start to an adventure based on the world, kingdom, town, and character 
    a player is playing as. 
    Instructions:
    - You must use only 2-4 sentences.
    - Please use simple and clear language that is easy for children to understand.
    - Write in second person, e.g., "You are Jack."
    - Write in present tense, e.g., "You stand at..."
    - First describe the character and their backstory.
    - Then describe where they start and what they see around them."""

    world_info = f"""
    World: {world['description']}
    Kingdom: {kingdom['description']}
    Town: {town['description']}
    Your Character: {character['description']}
    """

    model_output = client.chat.completions.create(
        model="meta-llama/Llama-3-70b-chat-hf",
        temperature=1.0,
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": world_info + '\nYour Start:'}
        ],
    )

    start = model_output.choices[0].message.content

    return {
        "world": world["description"],
        "kingdom": kingdom["description"],
        "town": town["description"],
        "character": character["description"],
        "start": start,
    }

    
# Initialize the game state
game_state = initialize_game_state()
game_running = True  # Flag to manage game status

# Function to process user input and actions
def run_action(message, history):
    global game_state, game_running  # Access the global game state and game status

    if not game_running:
        return "The game has ended. Type 'restart the game' to play again."

    if message.lower() == "start game":
        return game_state["start"]

    if message.lower() == "restart the game":
        game_state = initialize_game_state()
        return "Game restarted! " + game_state["start"]

    if message.lower() == "exit":
        game_running = False
        return "The game has ended. Type 'restart the game' to play again."

    system_prompt = """You are an AI Game master. Your job is to write what \
    happens next in a player's adventure game.\
    Instructions: \
    - Write only 1-3 sentences. \
    - Please use simple and clear language that is easy for children to understand.
    - Always write in second person, e.g., "You look north and see..." \
    - Write in present tense."""

    world_info = f"""
    World: {game_state['world']}
    Kingdom: {game_state['kingdom']}
    Town: {game_state['town']}
    Your Character: {game_state['character']}"""

    # Build the context for the conversation
    messages = [
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": world_info},
    ]

    for action in history:
        if isinstance(action, tuple) and len(action) == 2:
            messages.append({"role": "assistant", "content": action[0]})
            messages.append({"role": "user", "content": action[1]})

    # Add the user's current action
    messages.append({"role": "user", "content": message})

    # Get the model's response
    model_output = client.chat.completions.create(
        model="meta-llama/Llama-3-70b-chat-hf",
        messages=messages,
    )

    return model_output.choices[0].message.content


def main_loop(message, history):

    if not is_safe(message):
        return 'Invalid action.'
    
    result = run_action(message, history)
    safe = is_safe(result)
    if(safe):
        return result # only if safe?
    else:
        return 'Invalid output.'


# Gradio ChatInterface
demo = gr.ChatInterface(
    main_loop,
    chatbot=gr.Chatbot(
        height=300,
        placeholder="Type 'start game' to begin, 'restart the game' to restart, or 'exit' to end the game.",
        type="messages",  # Ensures proper rendering
    ),
    textbox=gr.Textbox(
        placeholder="What do you do next?",
        container=False,
        scale=7,
    ),
    title="AI RPG",
    theme="Monochrome",
    examples=["Look around", "Continue the story"],
    cache_examples=False,
)

# Launch the Gradio app
demo.launch(share=True, server_name="0.0.0.0")