Spaces:
Running
Running
Manejo centralizado de disponibilidad de espacios y modelos
Browse files- app.py +1 -3
- autenticacion.py +1 -1
- buscaLog.py +1 -1
- cloudfunction.py +2 -4
- conexion_firebase.py +50 -6
- funciones.py +16 -23
- herramientas.py +3 -5
- 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,
|
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(
|
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 |
-
|
20 |
|
21 |
-
|
22 |
-
|
23 |
-
|
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=
|
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,
|
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 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
|
82 |
-
|
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=
|
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,
|
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í
|
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)
|