import gradio as gr import requests import json API_URL = "https://ia.nebuia.com/api/v1/integrator/extractor/from/excel" API_KEY = "2J7NFWQ-236PGAM-2S9RD3C-2DG54CY" API_SECRET = "a47abf97-866b-4154-b29c-346c9b02919e" import re import json def extract_json_from_response(response_text): """ Detecta si la respuesta contiene un bloque JSON con formato markdown ```json ``` y extrae su contenido, o devuelve el texto original si no se encuentra ese patrón. Args: response_text (str): El texto de respuesta que puede contener bloques JSON Returns: str: El contenido JSON extraído o el texto original """ # Patrón para encontrar bloques de código JSON con formato markdown json_pattern = r"```json\s+([\s\S]*?)\s+```" # Buscar coincidencias match = re.search(json_pattern, response_text) if match: # Extraer el contenido JSON del bloque json_content = match.group(1).strip() # Verificar que sea un JSON válido try: # Intentar cargar el JSON para validarlo json.loads(json_content) return json_content except json.JSONDecodeError: # Si no es un JSON válido, devolver el texto original return response_text # Si no hay coincidencias, devolver el texto original return response_text # Modificación de la función send_excel_to_api para usar la función de extracción def send_excel_to_api(file_path, json_structure): headers = { 'key': API_KEY, 'secret': API_SECRET } files = { 'file': open(file_path, 'rb') } data = { 'structure': json_structure } try: response = requests.post(API_URL, headers=headers, files=files, data=data) if response.status_code == 200: result = response.json() # Si la respuesta contiene un payload, formatearla como JSON if "payload" in result: response_json = json.dumps(result["payload"], indent=2, ensure_ascii=False) # Extraer JSON de la respuesta si está en formato markdown return extract_json_from_response(response_json) else: return json.dumps(result, indent=2, ensure_ascii=False) else: return f"Error: Received status code {response.status_code}\n{response.text}" except requests.RequestException as e: return f"Error sending request: {e}" finally: files['file'].close() def gradio_interface(file, json_structure): if file is None: return "Please upload an Excel file." return send_excel_to_api(file.name, json_structure) # Custom color for the theme custom_purple = "#7f56d9" # Create the Gradio interface using Blocks with gr.Blocks(theme=gr.themes.Default(primary_hue="purple", secondary_hue="purple")) as demo: gr.Markdown( """
## NebuIA Excel Structure Extractor Upload an Excel file and provide a JSON structure to send to the API. """ ) with gr.Row(): file_input = gr.File(label="Upload Excel File") json_input = gr.Code( label="JSON Structure", language="json", lines=15, value='''{ "total de activo a_corto_plazo": [ { "año": "", "total": "" } ], "efectivo y equivalentes de efectivo": [ { "año": "", "total": "" } ], "instrumentos financieros de negociacion": [ { "año": "", "total": "" } ], "clientes": [ { "año": "", "total": "" } ], "cuentas y documentos por cobrar": [ { "año": "", "total": "" } ], "deudores diversos": [ { "año": "", "total": "" } ], "estimaciones de cuentas incobrables": [ { "año": "", "total": "" } ], "impuestos por recuperar": [ { "año": "", "total": "" } ], "inventarios": [ { "año": "", "total": "" } ], "pagos anticipados": [ { "año": "", "total": "" } ], "activos disponibles para venta": [ { "año": "", "total": "" } ], "otros activos a corto plazo": [ { "año": "", "total": "" } ], "total de activo a largo plazo": [ { "año": "", "total": "" } ], "propiedades, plantas y equipo": [ { "año": "", "total": "" } ], "anticipo a proveedores": [ { "año": "", "total": "" } ], "crédito mercantil": [ { "año": "", "total": "" } ], "activos intangibles": [ { "año": "", "total": "" } ], "inversiones asociadas": [ { "año": "", "total": "" } ], "instrumentos financieros por cobrar a largo plazo": [ { "año": "", "total": "" } ], "otros activos a largo plazo": [ { "año": "", "total": "" } ], "total de activo": [ { "año": "", "total": "" } ], "total de pasivo a corto plazo": [ { "año": "", "total": "" } ], "prestamos bancarios": [ { "año": "", "total": "" } ], "proveedores": [ { "año": "", "total": "" } ], "cuentas y documentos por pagar": [ { "año": "", "total": "" } ], "instrumentos financieros": [ { "año": "", "total": "" } ], "acreedores diversos": [ { "año": "", "total": "" } ], "impuestos a la utilidad por pagar": [ { "año": "", "total": "" } ], "anticipo de clientes": [ { "año": "", "total": "" } ], "provisiones": [ { "año": "", "total": "" } ], "impuestos por pagar": [ { "año": "", "total": "" } ], "otros pasivos a corto plazo": [ { "año": "", "total": "" } ], "total de pasivo a largo plazo": [ { "año": "", "total": "" } ], "cuentas y documentos por pagar a largo plazo": [ { "año": "", "total": "" } ], "instrumentos financieros a largo plazo": [ { "año": "", "total": "" } ], "rentas cobradas por anticipado": [ { "año": "", "total": "" } ], "aportaciones para futuros aumentos de capital": [ { "año": "", "total": "" } ], "impuesto a la utilidad diferido por pagar": [ { "año": "", "total": "" } ], "beneficio a empleados": [ { "año": "", "total": "" } ], "provisiones a largo plazo": [ { "año": "", "total": "" } ], "otros pasivos a largo plazo": [ { "año": "", "total": "" } ], "total de pasivo": [ { "año": "", "total": "" } ], "total de capital contable": [ { "año": "", "total": "" } ], "capital social": [ { "año": "", "total": "" } ], "reserva legal": [ { "año": "", "total": "" } ], "exceso en la actualización del capital": [ { "año": "", "total": "" } ], "insuficiencia en la actualización de capital": [ { "año": "", "total": "" } ], "reservas de capital": [ { "año": "", "total": "" } ], "primas en venta de acciones": [ { "año": "", "total": "" } ], "utilidades acumuladas": [ { "año": "", "total": "" } ], "utilidad neta": [ { "año": "", "total": "" } ], "perdidas acumuladas": [ { "año": "", "total": "" } ], "participación controladora": [ { "año": "", "total": "" } ], "ingresos netos": [ { "año": "", "total": "" } ], "costo de ventas": [ { "año": "", "total": "" } ], "costo de servicios": [ { "año": "", "total": "" } ] }''' ) output = gr.Code(label="API Response", lines=10, language="json") submit_btn = gr.Button("Submit") submit_btn.click(fn=gradio_interface, inputs=[file_input, json_input], outputs=output) # Launch the interface demo.launch()