Moibe commited on
Commit
db44719
·
1 Parent(s): 94c0ba8

Manejo centralizado de disponibilidad de espacios y modelos

Browse files
Files changed (8) hide show
  1. app.py +1 -3
  2. autenticacion.py +1 -1
  3. buscaLog.py +1 -1
  4. cloudfunction.py +2 -4
  5. conexion_firebase.py +50 -6
  6. funciones.py +16 -23
  7. herramientas.py +3 -5
  8. test.py +4 -0
app.py CHANGED
@@ -45,11 +45,9 @@ async def genera_imagen(request: Request, platillo: str = Form(...)):
45
  return resultado
46
  else:
47
  return FileResponse(resultado, media_type="image/png", filename="imagen.png")
48
- else:
49
-
50
  print("Usando Inference ✨.")
51
  resultado = funciones.genera_platillo_inference(platillo)
52
- #print("El resultado de inference es: ", resultado)
53
  if type(resultado) is str:
54
  return resultado
55
  else:
 
45
  return resultado
46
  else:
47
  return FileResponse(resultado, media_type="image/png", filename="imagen.png")
48
+ else:
 
49
  print("Usando Inference ✨.")
50
  resultado = funciones.genera_platillo_inference(platillo)
 
51
  if type(resultado) is str:
52
  return resultado
53
  else:
autenticacion.py CHANGED
@@ -22,7 +22,7 @@ def defineAmbiente():
22
  hora_renovacion = 17
23
  servicio = "desarrollo"
24
  else:
25
- print("Entorno remoto listo...")
26
  llave = os.getenv("llave") #Acceso a HF
27
  servidor = os.getenv("servidor")
28
  print("El servidor remoto es: ", servidor)
 
22
  hora_renovacion = 17
23
  servicio = "desarrollo"
24
  else:
25
+ #print("Entorno remoto listo...")
26
  llave = os.getenv("llave") #Acceso a HF
27
  servidor = os.getenv("servidor")
28
  print("El servidor remoto es: ", servidor)
buscaLog.py CHANGED
@@ -15,5 +15,5 @@ if __name__ == "__main__":
15
  else:
16
  print("❌ Búsqueda finalizada sin resultados.")
17
 
18
- print("\n--- Probando una búsqueda que no debería encontrar nada ---")
19
  conexion_firebase.buscar_log_por_prompt("Prompt que no existe")
 
15
  else:
16
  print("❌ Búsqueda finalizada sin resultados.")
17
 
18
+ #print("\n--- Probando una búsqueda que no debería encontrar nada ---")
19
  conexion_firebase.buscar_log_por_prompt("Prompt que no existe")
cloudfunction.py CHANGED
@@ -45,7 +45,7 @@ def incrementar_segundos_python(event: pubsub_fn.CloudEvent) -> None:
45
  doc_ref.update({
46
  "segundos": firestore.FieldValue.increment(1500)
47
  })
48
- print("Campo 'segundos' actualizado con éxito (+1500) en el documento 'nowme/sosa'.")
49
 
50
  except exceptions.NotFound:
51
  print("Error: Documento nowme/sosa no encontrado. No se pudo actualizar.")
@@ -55,10 +55,8 @@ def incrementar_segundos_python(event: pubsub_fn.CloudEvent) -> None:
55
  # doc_ref.set({"segundos": 1500}, merge=True) # Ejemplo de cómo crear/actualizar
56
 
57
  except Exception as e:
58
- print(f"Error al actualizar el documento nowme/sosa: {e}")
59
  # Puedes lanzar la excepción si quieres que Cloud Functions lo reporte como un fallo.
60
  # raise e
61
  pass # O simplemente pasar para que la Function no se marque como fallo en este caso
62
 
63
- print("Fin de la ejecución de la Function.")
64
-
 
45
  doc_ref.update({
46
  "segundos": firestore.FieldValue.increment(1500)
47
  })
48
+ # print("Campo 'segundos' actualizado con éxito (+1500) en el documento 'nowme/sosa'.")
49
 
50
  except exceptions.NotFound:
51
  print("Error: Documento nowme/sosa no encontrado. No se pudo actualizar.")
 
55
  # doc_ref.set({"segundos": 1500}, merge=True) # Ejemplo de cómo crear/actualizar
56
 
57
  except Exception as e:
58
+ #print(f"Error al actualizar el documento nowme/sosa: {e}")
59
  # Puedes lanzar la excepción si quieres que Cloud Functions lo reporte como un fallo.
60
  # raise e
61
  pass # O simplemente pasar para que la Function no se marque como fallo en este caso
62
 
 
 
conexion_firebase.py CHANGED
@@ -10,12 +10,11 @@ firebase_admin.initialize_app(firebase_cred)
10
  db = firestore.client(database_id='nowme')
11
  #dato es el dato que traes como el nombre del user.
12
  #info es la info de ese dato que estás buscando, como token.
13
- def obtenDato(coleccion, dato, info):
14
  #Future: Tentativamente ésta parte podría solo hacerse una vez y vivir en la app para ser reutilizado.
15
 
16
  #Primero debemos definir la referencia al documento, o sea a la hoja de usuario.
17
- doc_ref = db.collection(coleccion).document(dato)
18
- #Éste es el documento que tiene los datos de ella.
19
  documento = doc_ref.get()
20
 
21
  #Recuerda la conversión a diccionario.
@@ -23,13 +22,23 @@ def obtenDato(coleccion, dato, info):
23
  diccionario = documento.to_dict()
24
  return diccionario.get(info)
25
 
 
 
 
 
 
 
 
 
 
 
 
26
  def editaDato(coleccion, dato, info, contenido):
27
 
28
  #Primero debemos definir la referencia al documento, o sea a la hoja de usuario.
29
  doc_ref = db.collection(coleccion).document(dato)
30
 
31
  doc_ref.update({
32
- # 'quote': quote,
33
  info: contenido,
34
  })
35
 
@@ -89,7 +98,7 @@ def registraLog(servidor_val, prompt_val, modelo_val, seed_val):
89
  # milisegundos al ID o usar un ID automático y un campo de timestamp.
90
  doc_ref.set(datos_log)
91
 
92
- print(f"✔️ Log agregado exitosamente en 'logs/{document_id_fecha_hora}'.")
93
  print(f" Datos: Servidor='{servidor_val}', Prompt='{prompt_val}'...")
94
 
95
  except Exception as e:
@@ -153,4 +162,39 @@ def incrementar_campo_numerico(collection_name, document_id, field_name, amount=
153
  )
154
  print(f"✔️ Campo '{field_name}' en el documento '{document_id}' actualizado/creado e incrementado en {amount}.")
155
  except Exception as e:
156
- print(f"❌ Error al operar en el campo '{field_name}' del documento '{document_id}': {e}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  db = firestore.client(database_id='nowme')
11
  #dato es el dato que traes como el nombre del user.
12
  #info es la info de ese dato que estás buscando, como token.
13
+ def obtenDato(coleccion, documento, info):
14
  #Future: Tentativamente ésta parte podría solo hacerse una vez y vivir en la app para ser reutilizado.
15
 
16
  #Primero debemos definir la referencia al documento, o sea a la hoja de usuario.
17
+ doc_ref = db.collection(coleccion).document(documento)
 
18
  documento = doc_ref.get()
19
 
20
  #Recuerda la conversión a diccionario.
 
22
  diccionario = documento.to_dict()
23
  return diccionario.get(info)
24
 
25
+ def obtenAllDatos(coleccion, documento):
26
+
27
+ doc_ref = db.collection(coleccion).document(documento)
28
+ documento = doc_ref.get()
29
+
30
+ #Recuerda la conversión a diccionario.
31
+ documento = doc_ref.get()
32
+ diccionario = documento.to_dict()
33
+
34
+ return diccionario
35
+
36
  def editaDato(coleccion, dato, info, contenido):
37
 
38
  #Primero debemos definir la referencia al documento, o sea a la hoja de usuario.
39
  doc_ref = db.collection(coleccion).document(dato)
40
 
41
  doc_ref.update({
 
42
  info: contenido,
43
  })
44
 
 
98
  # milisegundos al ID o usar un ID automático y un campo de timestamp.
99
  doc_ref.set(datos_log)
100
 
101
+ #print(f"✔️ Log agregado exitosamente en 'logs/{document_id_fecha_hora}'.")
102
  print(f" Datos: Servidor='{servidor_val}', Prompt='{prompt_val}'...")
103
 
104
  except Exception as e:
 
162
  )
163
  print(f"✔️ Campo '{field_name}' en el documento '{document_id}' actualizado/creado e incrementado en {amount}.")
164
  except Exception as e:
165
+ print(f"❌ Error al operar en el campo '{field_name}' del documento '{document_id}': {e}")
166
+
167
+ def obtener_documentos_habilitados(coleccion):
168
+ """
169
+ Obtiene una lista de los IDs de todos los documentos en la colección
170
+ cuyo campo 'habilitado' es true.
171
+
172
+ Args:
173
+ coleccion (str): El nombre de la colección a consultar.
174
+
175
+ Returns:
176
+ list: Una lista de strings, donde cada string es el ID de un documento
177
+ habilitado.
178
+ """
179
+ print(f"--- Buscando documentos habilitados en la colección '{coleccion}' ---")
180
+
181
+ try:
182
+ # 1. Referencia a la colección con el nombre del parámetro
183
+ query_results = db.collection(coleccion).where(
184
+ filter=firestore.FieldFilter('habilitado', '==', True)
185
+ ).get()
186
+
187
+ # 2. Itera sobre los resultados y almacena solo el ID en una lista
188
+ # Usamos una lista por comprensión para una mayor eficiencia y simplicidad
189
+ documentos_habilitados_ids = [doc.id for doc in query_results]
190
+
191
+ if not documentos_habilitados_ids:
192
+ print("❌ No se encontraron documentos habilitados.")
193
+ return []
194
+
195
+ print(f"✔️ Se encontraron {len(documentos_habilitados_ids)} IDs de documentos.")
196
+ return documentos_habilitados_ids
197
+
198
+ except Exception as e:
199
+ print(f"❌ Error al obtener documentos habilitados: {e}")
200
+ return []
funciones.py CHANGED
@@ -16,19 +16,14 @@ def genera_platillo_gpu(platillo):
16
  prompt = globales.previo + platillo
17
 
18
  try:
19
- dict_espacios = conexion_firebase.obtenDato('nowme', servidor, 'espacios')
20
 
21
- espacios_habilitados = [
22
- nombre for nombre, config in dict_espacios.items()
23
- if config.get("habilitado", False) # Usamos .get() para evitar KeyError si 'habilitado' no existe
24
- ]
25
-
26
- print(f"Espacios habilitados: {espacios_habilitados}")
27
-
28
- espacio_aleatorio_elegido = random.choice(espacios_habilitados)
29
- configuracion_espacio = dict_espacios[espacio_aleatorio_elegido]
30
- client = gradio_client.Client(configuracion_espacio['ruta'], hf_token=globales.llave)
31
 
 
 
32
  result = client.predict(
33
  #**kwargs,
34
  prompt=prompt,
@@ -39,14 +34,14 @@ def genera_platillo_gpu(platillo):
39
  height=568,
40
  # guidance_scale=3.5,
41
  # num_inference_steps=28,
42
- api_name=configuracion_espacio['api_name']
43
  )
44
 
45
  #Cuando es GPU, debe de restar segundos disponibles de HF
46
  herramientas.restaSegundosGPU(globales.work_cost)
47
 
48
  print("Platillo generado:", platillo)
49
- conexion_firebase.registraLog(servidor, platillo, espacio_aleatorio_elegido, 42)
50
 
51
  #Generales
52
  conexion_firebase.incrementar_campo_numerico('estadisticas', 'imagenes', 'imagenes_totales', amount=1)
@@ -73,15 +68,13 @@ def genera_platillo_gpu(platillo):
73
 
74
  def genera_platillo_inference(platillo):
75
 
76
- dict_modelos = conexion_firebase.obtenDato('nowme', servidor, 'modelos')
77
- modelos_habilitados = [
78
- nombre for nombre, config in dict_modelos.items()
79
- if config.get("habilitado", False) # Usamos .get() para evitar KeyError si 'habilitado' no existe
80
- ]
81
 
82
- print(f"Modelos habilitados: {modelos_habilitados}")
83
- modelo_aleatorio_elegido = random.choice(modelos_habilitados)
84
- configuracion_modelo = dict_modelos[modelo_aleatorio_elegido]
85
 
86
  creditos_restantes_inference = conexion_firebase.obtenDato('nowme', servidor, 'inferencias')
87
 
@@ -95,7 +88,7 @@ def genera_platillo_inference(platillo):
95
 
96
  client = InferenceClient(
97
  provider= provedor_seleccionado,
98
- model=configuracion_modelo['ruta'],
99
  api_key=globales.llave
100
  )
101
 
@@ -126,7 +119,7 @@ def genera_platillo_inference(platillo):
126
  image.save(img_io, "PNG")
127
  img_io.seek(0)
128
  print("Platillo generado:", platillo)
129
- conexion_firebase.registraLog(servidor, platillo, modelo_aleatorio_elegido, 42)
130
  #Generales
131
  conexion_firebase.incrementar_campo_numerico('estadisticas', 'imagenes', 'imagenes_totales', amount=1)
132
  conexion_firebase.incrementar_campo_numerico('estadisticas', 'imagenes', 'endpoint-' + servicio, amount=1)
 
16
  prompt = globales.previo + platillo
17
 
18
  try:
19
+ espacios = conexion_firebase.obtener_documentos_habilitados('espacios')
20
 
21
+ print(f"Espacios habilitados: {espacios}")
22
+ espacio_elegido = random.choice(espacios)
23
+ datos_espacio = conexion_firebase.obtenAllDatos('espacios', espacio_elegido)
 
 
 
 
 
 
 
24
 
25
+ client = gradio_client.Client(datos_espacio['ruta'], hf_token=globales.llave)
26
+
27
  result = client.predict(
28
  #**kwargs,
29
  prompt=prompt,
 
34
  height=568,
35
  # guidance_scale=3.5,
36
  # num_inference_steps=28,
37
+ api_name=datos_espacio['api_name']
38
  )
39
 
40
  #Cuando es GPU, debe de restar segundos disponibles de HF
41
  herramientas.restaSegundosGPU(globales.work_cost)
42
 
43
  print("Platillo generado:", platillo)
44
+ conexion_firebase.registraLog(servidor, platillo, espacio_elegido, 42)
45
 
46
  #Generales
47
  conexion_firebase.incrementar_campo_numerico('estadisticas', 'imagenes', 'imagenes_totales', amount=1)
 
68
 
69
  def genera_platillo_inference(platillo):
70
 
71
+ modelos = conexion_firebase.obtener_documentos_habilitados('modelos')
72
+
73
+ print(f"Espacios habilitados: {modelos}")
74
+ modelo_elegido = random.choice(modelos)
75
+ datos_modelo = conexion_firebase.obtenAllDatos('espacios', modelo_elegido)
76
 
77
+ client = gradio_client.Client(datos_modelo['ruta'], hf_token=globales.llave)
 
 
78
 
79
  creditos_restantes_inference = conexion_firebase.obtenDato('nowme', servidor, 'inferencias')
80
 
 
88
 
89
  client = InferenceClient(
90
  provider= provedor_seleccionado,
91
+ model=datos_modelo['ruta'],
92
  api_key=globales.llave
93
  )
94
 
 
119
  image.save(img_io, "PNG")
120
  img_io.seek(0)
121
  print("Platillo generado:", platillo)
122
+ conexion_firebase.registraLog(servidor, platillo, modelo_elegido, 42)
123
  #Generales
124
  conexion_firebase.incrementar_campo_numerico('estadisticas', 'imagenes', 'imagenes_totales', amount=1)
125
  conexion_firebase.incrementar_campo_numerico('estadisticas', 'imagenes', 'endpoint-' + servicio, amount=1)
herramientas.py CHANGED
@@ -60,7 +60,7 @@ def restaSegundosInference(cuantos_segundos):
60
 
61
  # Restar los segundos
62
  nuevos_segundos_disponibles = segundos_disponibles - cuantos_segundos
63
- print("Procesado, segundos disponibles ahora: ", nuevos_segundos_disponibles)
64
  conexion_firebase.editaDato('nowme', servidor, 'inferencias', nuevos_segundos_disponibles)
65
 
66
  def modificaModeloActual(nuevo_modelo):
@@ -114,14 +114,12 @@ def siEsDiaSiguienteRenueva():
114
 
115
  if resultado == True:
116
  if diferencia.days > 1:
117
- print("Renovando segundos.")
118
  renuevaSegundosDisponibles()
119
  renuevaTimestampActual()
120
  else: #Si la diferencia es de un solo día entonces si debe checar si ya rebaso la hora de renovación del servidor.
121
  hora_actual = datetime_obj_2.time()
122
 
123
  if int(hora_actual.hour) > int(globales.hora_renovacion):
124
- print("Renovando segundos.")
125
  renuevaSegundosDisponibles()
126
  renuevaTimestampActual()
127
  else:
@@ -150,7 +148,7 @@ def despliegaInfoCliente(request):
150
  user_id = "unauthenticated"
151
  if auth_header and auth_header.startswith("Bearer "):
152
  token = auth_header.split(" ")[1]
153
- # Aquí normalmente decodificarías el token JWT para obtener el user_id
154
  # Ejemplo simulado:
155
  if token == "mysecrettoken123":
156
  user_id = "user123_authenticated"
@@ -160,4 +158,4 @@ def despliegaInfoCliente(request):
160
 
161
  print(f"Petición desde: {client_ip}")
162
  print(f"User-Agent: {user_agent}")
163
- print(f"Usuario (Auth): {user_id}")
 
60
 
61
  # Restar los segundos
62
  nuevos_segundos_disponibles = segundos_disponibles - cuantos_segundos
63
+ #print("Procesado, segundos disponibles ahora: ", nuevos_segundos_disponibles)
64
  conexion_firebase.editaDato('nowme', servidor, 'inferencias', nuevos_segundos_disponibles)
65
 
66
  def modificaModeloActual(nuevo_modelo):
 
114
 
115
  if resultado == True:
116
  if diferencia.days > 1:
 
117
  renuevaSegundosDisponibles()
118
  renuevaTimestampActual()
119
  else: #Si la diferencia es de un solo día entonces si debe checar si ya rebaso la hora de renovación del servidor.
120
  hora_actual = datetime_obj_2.time()
121
 
122
  if int(hora_actual.hour) > int(globales.hora_renovacion):
 
123
  renuevaSegundosDisponibles()
124
  renuevaTimestampActual()
125
  else:
 
148
  user_id = "unauthenticated"
149
  if auth_header and auth_header.startswith("Bearer "):
150
  token = auth_header.split(" ")[1]
151
+ # Aquí se haría decodificación del token JWT para obtener el user_id
152
  # Ejemplo simulado:
153
  if token == "mysecrettoken123":
154
  user_id = "user123_authenticated"
 
158
 
159
  print(f"Petición desde: {client_ip}")
160
  print(f"User-Agent: {user_agent}")
161
+ #print(f"Usuario (Auth): {user_id}")
test.py ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ import conexion_firebase
2
+
3
+ datos = conexion_firebase.obtenAllDatos('modelos', 'flux-dev')
4
+ print(datos)