sgongora27 commited on
Commit
5da83f5
·
1 Parent(s): 4a8d953

New scenario

Browse files
Files changed (5) hide show
  1. app.py +2 -1
  2. config.ini +1 -1
  3. example_worlds.py +106 -9
  4. prompts.py +34 -11
  5. world.py +5 -3
app.py CHANGED
@@ -1,7 +1,6 @@
1
  import gradio as gr
2
  from gradio import ChatMessage
3
  import re
4
- import sys
5
  import time
6
  import json
7
  import os
@@ -125,6 +124,8 @@ world = example_worlds.get_world(world_id, language=language)
125
  last_player_position = world.player.location
126
  number_of_turns = 0
127
  game_log_dictionary = {}
 
 
128
  game_log_dictionary["narrative_model_name"] = narrative_model_name
129
  game_log_dictionary["reasoning_model_name"] = reasoning_model_name
130
 
 
1
  import gradio as gr
2
  from gradio import ChatMessage
3
  import re
 
4
  import time
5
  import json
6
  import os
 
124
  last_player_position = world.player.location
125
  number_of_turns = 0
126
  game_log_dictionary = {}
127
+ game_log_dictionary["nickname"] = "anonymous"
128
+ game_log_dictionary["world_id"] = world_id
129
  game_log_dictionary["narrative_model_name"] = narrative_model_name
130
  game_log_dictionary["reasoning_model_name"] = reasoning_model_name
131
 
config.ini CHANGED
@@ -1,6 +1,6 @@
1
  [Options]
2
  Language = es
3
- WorldID = 1
4
 
5
  [Models]
6
  NarrativeModel = gemini-1.0-pro
 
1
  [Options]
2
  Language = es
3
+ WorldID = 2
4
 
5
  [Models]
6
  NarrativeModel = gemini-1.0-pro
example_worlds.py CHANGED
@@ -5,19 +5,23 @@ from world import Character, Item, Location, Puzzle, World
5
 
6
 
7
  def get_world(arg: str, language='en') -> World:
8
- if arg=='2':
 
 
 
 
 
9
  if language == 'es':
10
  return get_world_2_spanish()
11
  else:
12
  return get_world_2_english()
13
  else:
14
  if language == 'es':
15
- return get_world_1_spanish()
16
  else:
17
- return get_world_1_english()
18
 
19
- def get_world_1_english() -> World:
20
- """A simple fictional world, used as an example in Figure 3 of the paper."""
21
  item_1 = Item("Apple",
22
  ["A fruit that can be eaten", "It is round-shaped and green"])
23
  item_2 = Item("Toy car",
@@ -60,7 +64,7 @@ def get_world_1_english() -> World:
60
 
61
  return the_world
62
 
63
- def get_world_1_spanish() -> World:
64
  item_1 = Item("Manzana",
65
  ["Una fruta que puede ser comida", "Es redonda y verde"])
66
  item_2 = Item("Auto de juguete",
@@ -104,11 +108,9 @@ def get_world_1_spanish() -> World:
104
  the_world.add_character(npc)
105
  the_world.set_objective(item_2,place_3)
106
 
107
-
108
  return the_world
109
 
110
- def get_world_2_english() -> World:
111
- """Use this world to test more complex cases, like blocked passages between locations."""
112
  item_1 = Item("Apple",
113
  ["A fruit that can be eaten", "It is round-shaped and red"])
114
  item_2 = Item("Key",
@@ -160,3 +162,98 @@ def get_world_2_english() -> World:
160
  the_world.add_character(npc)
161
 
162
  return the_world
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
 
7
  def get_world(arg: str, language='en') -> World:
8
+ if arg=='1':
9
+ if language == 'es':
10
+ return get_world_1_spanish()
11
+ else:
12
+ return get_world_1_english()
13
+ elif arg=='2':
14
  if language == 'es':
15
  return get_world_2_spanish()
16
  else:
17
  return get_world_2_english()
18
  else:
19
  if language == 'es':
20
+ return get_world_0_spanish()
21
  else:
22
+ return get_world_0_english()
23
 
24
+ def get_world_0_english() -> World:
 
25
  item_1 = Item("Apple",
26
  ["A fruit that can be eaten", "It is round-shaped and green"])
27
  item_2 = Item("Toy car",
 
64
 
65
  return the_world
66
 
67
+ def get_world_0_spanish() -> World:
68
  item_1 = Item("Manzana",
69
  ["Una fruta que puede ser comida", "Es redonda y verde"])
70
  item_2 = Item("Auto de juguete",
 
108
  the_world.add_character(npc)
109
  the_world.set_objective(item_2,place_3)
110
 
 
111
  return the_world
112
 
113
+ def get_world_1_english() -> World:
 
114
  item_1 = Item("Apple",
115
  ["A fruit that can be eaten", "It is round-shaped and red"])
116
  item_2 = Item("Key",
 
162
  the_world.add_character(npc)
163
 
164
  return the_world
165
+
166
+ def get_world_1_spanish() -> World:
167
+
168
+ item_1 = Item("Tortuga",["La mascota de Emma", "Emma la llama 'Hojita'"])
169
+ item_2 = Item("Llave",
170
+ ["Una llave para abrir un candado", "Es dorada", "Tiene grabada la imagen de un extraño escudo de armas"])
171
+ item_3 = Item("Un martillo gris",
172
+ ["Un martillo gris grande que puede ser usado para romper cosas", "Es muy pesado"])
173
+ item_4 = Item("Candado",
174
+ ["Un candado fuerte que tiene grabado un escudo de armas", "Parece que no puede ser abierto con las manos"])
175
+ item_5 = Item("Un martillo verde",
176
+ ["Un pequeño martillo verde", "Es solamente un juguete y no se puede romper nada con él"])
177
+
178
+ place_3 = Location ("Jardín",
179
+ ["El jardín de la casa", "Es relativamente chico, de unos 5 metros cuadrados"],
180
+ items = [item_1])
181
+ place_2 = Location("Cocina",
182
+ ["Es la cocina de la casa", "No es enorme, pero tampoco es la cocina más chiquita del mundo", "Por las ventanas entra mucha luz"])
183
+ place_2.connecting_locations = [place_3]
184
+ place_2.block_passage(place_3, item_4)
185
+ place_3.connecting_locations = [place_2]
186
+
187
+ place_1 = Location("Taller de pintura",
188
+ ["Es el taller de pintura que la madre de Emma tiene en su casa", "Hay una puerta de metal trancada por un candado"],
189
+ items = [item_3, item_5])
190
+ place_1.connecting_locations = [place_2]
191
+ place_2.connecting_locations = [place_1]
192
+
193
+ player = Character("Emma",
194
+ ["Una adolescente de estatura promedio", "Está buscando a su mascota 'Hojita'"],
195
+ inventory = [],
196
+ location = place_1)
197
+ npc = Character("Laura",
198
+ ["Una mujer de unos 45 años de edad", "Es la madre de Emma", "Es una artista que pinta al óleo"],
199
+ inventory = [item_2],
200
+ location= place_1)
201
+
202
+ the_world = World(player)
203
+ the_world.add_locations([place_1,place_2,place_3])
204
+ the_world.add_items([item_1,item_2,item_3,item_4,item_5])
205
+ the_world.add_character(npc)
206
+ the_world.set_objective(item_1,place_2)
207
+
208
+ return the_world
209
+
210
+ def get_world_2_spanish() -> World:
211
+
212
+ item_1 = Item("Pinturas",
213
+ ["Hay algo escrito en los muros con una pintura hecha con barro", "Dice 'Hay que confiar en los poderes que se nos han otorgado"],
214
+ gettable=False)
215
+ item_2 = Item("Placa",
216
+ ["Una placa de metal con una inscripción", "Dice 'Un río muy grande'"],
217
+ gettable=False)
218
+ item_3 = Item("Estanque",
219
+ ["Un estanque de agua cristalina", "El agua es tan clara que funciona como un espejo"],
220
+ gettable=False)
221
+ item_4 = Item("Un muro de llamas",
222
+ ["Las llamas son fuertes y dan mucho calor", "Tiene una altura de 3 metros"],
223
+ gettable=False)
224
+ puzzle_1 = Puzzle("Puzzle",
225
+ ["Un encanto mágico que genera un muro intraspasable", "Mágicamente, al acercarse aparecen unas letras azules que explican cuál es el acertijo a resolver"],
226
+ "Hay que susurrar el nombre del río que baña la costa sur de la Banda Oriental", "Rio de la Plata")
227
+
228
+ place_1 = Location ("Claro en el monte",
229
+ ["Un claro en un monte de eucaliptus cerca del Río Uruguay", "Se puede escuchar el sonido de los animales que viven en los árboles de este monte"],
230
+ items = [item_1, item_3])
231
+ place_2 = Location("Monte silencioso",
232
+ ["El monte continúa en esta parte", "A diferencia de la parte anterior, esta zona está insonorizada y no se escucha ni siquiera un mínimo sonido"],
233
+ items=[item_2])
234
+ place_2.connecting_locations = [place_1]
235
+ place_1.connecting_locations = [place_2]
236
+ place_1.block_passage(place_2, item_4)
237
+
238
+ place_3 = Location("Celda",
239
+ ["Una celda cuadrada de dos metros cuadrados", "Las vegetación del monte ya ha ingresado al interior"])
240
+ place_3.connecting_locations = [place_2]
241
+ place_2.connecting_locations = [place_3]
242
+ place_2.block_passage(place_3,puzzle_1)
243
+
244
+ npc = Character("José Artigas",
245
+ ["El héroe nacional de Uruguay", "Está cansado, de estar tanto tiempo encerrado"],
246
+ inventory = [],
247
+ location = place_3)
248
+ player = Character("Venancio",
249
+ ["Un gaucho uruguayo de 40 años de edad", "Pertenece a los soldados de Artigas", "Tiene el poder mágico de invocar una ola gigante de agua con la que puede apagar fuegos o humedecer la tierra"],
250
+ inventory = [],
251
+ location= place_1)
252
+
253
+ the_world = World(player)
254
+ the_world.add_locations([place_1,place_2,place_3])
255
+ the_world.add_items([item_1,item_2,item_3,item_4])
256
+ the_world.add_character(npc)
257
+ the_world.set_objective(player,npc)
258
+
259
+ return the_world
prompts.py CHANGED
@@ -37,6 +37,8 @@ def prompt_describe_objective_spanish (objective) -> str:
37
  prompt+= f'"<{objective[0].name}> tiene que conseguir el objeto <{objective[1].name}>."'
38
  elif first_component_class == "Item" and second_component_class == "Location":
39
  prompt+= f'"Tienes que dejar el objeto <{objective[0].name}> en el lugar <{objective[1].name}>."'
 
 
40
 
41
  prompt+="\nPon tu narración generada entre caracteres #. Por ejemplo: # Tienes que conseguir la <llave> # o # Tienes que llegaral <Castillo> #"
42
 
@@ -79,9 +81,9 @@ def prompt_narrate_current_scene_spanish (world_state: str, previous_narrations:
79
  prompt = f"""Eres un narrador. Toma el siguiente estado del mundo y nárralo en unas pocas oraciones. Ten cuidado de no incluir detalles que contradigan el estado del mundo actual, o que hagan avanzar la historia. Además, intenta usar oraciones simples, sin abusar del lenguaje poético."""
80
 
81
  if starting_scene:
82
- prompt += "\nTen en cuenta que esta es la primera escena en la historia narradad: presenta al personaje del jugador, creando un pequeño trasfondo y por qué este personaje está en ese lugar específicamente.\n"
83
  elif len(previous_narrations)==0:
84
- prompt += "Ten en cuenta que el jugador ya conoce a su personaje, y cómo se ve, así que no menciones nada sobre esto. Sin embargo, es la primera vez que el jugador visita este lugar, así que describelo exaustivamente."
85
  else:
86
  prompt += "Ten en cuenta que el jugador ya conoce a s upersonaje, y cómo se ve, así que no menciones nada sobre esto. Además, no es la primera vez que el jugador visita este lugar. A continuación te daré algunas narraciones previas de este mismo lugar (de la más antigua a la más nueva), así te puedes asegurar de no repetir los mismos detalles de nuevo:\n"
87
  for narration in previous_narrations:
@@ -119,45 +121,66 @@ def prompt_world_update_spanish (world_state: str, input: str) -> str:
119
  - Moved object: <object> now is in <new_location>
120
  - Blocked passages now available: <now_reachable_location>
121
  - Your location changed: <new_location>
 
 
 
 
122
 
123
- Aquí hay algunos ejemplos sobre el formato, descrito en el anterior punto (D).
124
  Ejemplo 1
125
  - Moved object: <hacha> now is in <Inventory>
126
  - Blocked passages now available: None
127
  - Your location changed: None
 
128
 
129
  Ejemplo 2
130
  - Moved object: None
 
 
 
 
 
 
131
  - Blocked passages now available: None
132
  - Your location changed: <Jardín>
 
133
 
134
- Ejemplo 3
135
  - Moved object: <banana> now is in <Inventory>, <botella> now is in <Inventory>, <hacha> now is in <Hall principal>
136
  - Blocked passages now available: None
137
  - Your location changed: None
 
138
 
139
- Ejemplo 4
140
  - Moved object: <banana> now is in <Inventory>, <botella> now is in <Inventory>, <hacha> now is in <Hall principal>
141
  - Blocked passages now available: <Pequeña habitación>
142
  - Your location changed: None
 
143
 
144
- Ejemplo 5
145
  - Moved object: <banana> now is in <Inventory>, <botella> now is in <Inventory>, <hacha> now is in <Hall principal>
146
  - Blocked passages now available: <Pequeña habitación>
147
  - Your location changed: <Pequeña habitación>
 
148
 
149
- Ejemplo 6
150
  - Moved object: <libro> now is in <John>, <lápiz> now is in <Inventory>
151
  - Blocked passages now available: None
152
  - Your location changed: None
 
153
 
154
- Ejemplo 7
155
  - Moved object: <computadora> now is in <Susan>
156
  - Blocked passages now available: None
157
  - Your location changed: None
158
-
159
- Por último, puedes agregar una pequeña oración final narrando los cambios detecados en el estado del mundo (¡sin hacer avanzar la historia y sin crear detalles no incluidos en el estado del mundo!) o respondiendo una pregunta del jugador sobre el estado del mundo, usando el formato: #<tu oración final>#
160
- """
 
 
 
 
 
 
161
 
162
  return prompt
163
 
 
37
  prompt+= f'"<{objective[0].name}> tiene que conseguir el objeto <{objective[1].name}>."'
38
  elif first_component_class == "Item" and second_component_class == "Location":
39
  prompt+= f'"Tienes que dejar el objeto <{objective[0].name}> en el lugar <{objective[1].name}>."'
40
+ elif first_component_class == "Character" and second_component_class == "Character":
41
+ prompt+= f'"<{objective[0].name}> tiene que encontrar a <{objective[1].name}>."'
42
 
43
  prompt+="\nPon tu narración generada entre caracteres #. Por ejemplo: # Tienes que conseguir la <llave> # o # Tienes que llegaral <Castillo> #"
44
 
 
81
  prompt = f"""Eres un narrador. Toma el siguiente estado del mundo y nárralo en unas pocas oraciones. Ten cuidado de no incluir detalles que contradigan el estado del mundo actual, o que hagan avanzar la historia. Además, intenta usar oraciones simples, sin abusar del lenguaje poético."""
82
 
83
  if starting_scene:
84
+ prompt += "\nTen en cuenta que esta es la primera escena en la historia narrada: presenta al personaje del jugador, creando un pequeño trasfondo y por qué este personaje está en ese lugar específicamente. Puede usar las pequeñas descripciones presentes en el estado del mundo. Es importante que menciones todos los componentes que hay en este lugar. Sin embargo, es mejor si no describes cada componente: basta con que los menciones con una mínima descripción poco específica. Es muy importante que nombres los lugares a los que puede acceder el jugador desde esta posición. \n"
85
  elif len(previous_narrations)==0:
86
+ prompt += "Ten en cuenta que el jugador ya conoce a su personaje, y cómo se ve, así que no menciones nada sobre esto. Sin embargo, es la primera vez que el jugador visita este lugar, así que describelo. Es importante que menciones todos los componentes que hay en este lugar. Sin embargo, es mejor si no describes cada componente: basta con que los menciones con una mínima descripción poco específica. Es muy importante que nombres los lugares a los que puede acceder el jugador desde esta posición. \n"
87
  else:
88
  prompt += "Ten en cuenta que el jugador ya conoce a s upersonaje, y cómo se ve, así que no menciones nada sobre esto. Además, no es la primera vez que el jugador visita este lugar. A continuación te daré algunas narraciones previas de este mismo lugar (de la más antigua a la más nueva), así te puedes asegurar de no repetir los mismos detalles de nuevo:\n"
89
  for narration in previous_narrations:
 
121
  - Moved object: <object> now is in <new_location>
122
  - Blocked passages now available: <now_reachable_location>
123
  - Your location changed: <new_location>
124
+ (E) Por último, puedes agregar una narración de los cambios detecados en el estado del mundo (¡sin hacer avanzar la historia y sin crear detalles no incluidos en el estado del mundo!) usando el formato: #<tu mensaje final>#
125
+ (F) Dentro de la sección de narración que agregues al final, entre símbolos #, también puedes responder preguntas que haga el jugador en su entrada, sobre los objetos o personajes que puede ver, o el lugar en el que se encuentra.
126
+
127
+ Aquí hay algunos ejemplos sobre el formato, descritos en los puntos (D) y (E):
128
 
 
129
  Ejemplo 1
130
  - Moved object: <hacha> now is in <Inventory>
131
  - Blocked passages now available: None
132
  - Your location changed: None
133
+ # Guardaste el hacha en tu bolso. Sientes la diferencia de peso luego de haberla guardado #
134
 
135
  Ejemplo 2
136
  - Moved object: None
137
+ - Blocked passages now available: <Sótano>
138
+ - Your location changed: None
139
+ # El sótano, que estaba bloqueado, ahora está accesible #
140
+
141
+ Ejemplo 3
142
+ - Moved object: None
143
  - Blocked passages now available: None
144
  - Your location changed: <Jardín>
145
+ # Entras al Jardín #
146
 
147
+ Ejemplo 4
148
  - Moved object: <banana> now is in <Inventory>, <botella> now is in <Inventory>, <hacha> now is in <Hall principal>
149
  - Blocked passages now available: None
150
  - Your location changed: None
151
+ # Guardaste la banana y la botella en tu bolso. El hacha quedó en el Hall principal #
152
 
153
+ Ejemplo 5
154
  - Moved object: <banana> now is in <Inventory>, <botella> now is in <Inventory>, <hacha> now is in <Hall principal>
155
  - Blocked passages now available: <Pequeña habitación>
156
  - Your location changed: None
157
+ # Guardaste la banana y la botella en tu bolso. El hacha quedó en el Hall principal. Además, la pequeña habitación ahora está accesible. #
158
 
159
+ Ejemplo 6
160
  - Moved object: <banana> now is in <Inventory>, <botella> now is in <Inventory>, <hacha> now is in <Hall principal>
161
  - Blocked passages now available: <Pequeña habitación>
162
  - Your location changed: <Pequeña habitación>
163
+ # Guardaste la banana y la botella en tu bolso. El hacha quedó en el Hall principal. Además, la pequeña habitación ahora está accesible e ingresaste a ella #
164
 
165
+ Ejemplo 7
166
  - Moved object: <libro> now is in <John>, <lápiz> now is in <Inventory>
167
  - Blocked passages now available: None
168
  - Your location changed: None
169
+ # John ahora tiene el libro. Tú guardaste el lápiz en tu bolso #
170
 
171
+ Ejemplo 8
172
  - Moved object: <computadora> now is in <Susan>
173
  - Blocked passages now available: None
174
  - Your location changed: None
175
+ # Susan guardó la computadora en su bolso #
176
+
177
+ Ejemplo 9
178
+ - Moved object: None
179
+ - Blocked passages now available: None
180
+ - Your location changed: None
181
+ # No pasa nada... #
182
+
183
+ """
184
 
185
  return prompt
186
 
world.py CHANGED
@@ -166,8 +166,8 @@ class World:
166
  first_component_class = first_component.__class__.__name__
167
  second_component_class = second_component.__class__.__name__
168
 
169
- if first_component_class == second_component_class:
170
- raise Exception(f"Error: Objectives with same two classes {first_component_class} are not allowed")
171
  elif (first_component_class == "Character" and second_component_class in ["Location", "Item"]) or (second_component_class == "Character" and first_component_class in ["Location", "Item"]):
172
  self.objective = (first_component, second_component)
173
  elif (first_component_class == "Item" and second_component_class == "Location") or (second_component_class == "Item" and first_component_class == "Location"):
@@ -181,7 +181,9 @@ class World:
181
  first_component_class = self.objective[0].__class__.__name__
182
  second_component_class = self.objective[1].__class__.__name__
183
 
184
- if first_component_class == "Character" and second_component_class == "Location":
 
 
185
  if self.objective[0].location == self.objective[1]: done = True
186
  elif first_component_class == "Character" and second_component_class == "Item":
187
  if self.objective[1] in self.objective[0].inventory: done = True
 
166
  first_component_class = first_component.__class__.__name__
167
  second_component_class = second_component.__class__.__name__
168
 
169
+ if first_component_class == "Character" and second_component_class == "Character":
170
+ self.objective = (first_component, second_component)
171
  elif (first_component_class == "Character" and second_component_class in ["Location", "Item"]) or (second_component_class == "Character" and first_component_class in ["Location", "Item"]):
172
  self.objective = (first_component, second_component)
173
  elif (first_component_class == "Item" and second_component_class == "Location") or (second_component_class == "Item" and first_component_class == "Location"):
 
181
  first_component_class = self.objective[0].__class__.__name__
182
  second_component_class = self.objective[1].__class__.__name__
183
 
184
+ if first_component_class == "Character" and second_component_class == "Character":
185
+ if self.objective[0].location == self.objective[1].location: done = True
186
+ elif first_component_class == "Character" and second_component_class == "Location":
187
  if self.objective[0].location == self.objective[1]: done = True
188
  elif first_component_class == "Character" and second_component_class == "Item":
189
  if self.objective[1] in self.objective[0].inventory: done = True