Spaces:
Sleeping
Sleeping
File size: 3,244 Bytes
d3a578b c00adea d3a578b 881d8d0 d3a578b c00adea d3a578b 56bc197 881d8d0 d3a578b |
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 |
import os
import gradio as gr
import subprocess
import sys
import json
import threading
import time
# Ruta al server MCP
SERVER_PATH = os.path.abspath(os.path.join("mcp_servers", "stdio_report_gen_server.py"))
# Mantener el proceso del servidor MCP abierto durante toda la sesi贸n
def start_mcp_server():
proc = subprocess.Popen(
[sys.executable, SERVER_PATH],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
bufsize=1
)
print(f"[DEBUG] MCP STDIN: {proc.stdin}, STDOUT: {proc.stdout}, STDERR: {proc.stderr}")
return proc
mcp_proc = start_mcp_server()
lock = threading.Lock() # Para evitar condiciones de carrera en stdio
# Lee stderr de MCP en un hilo y guarda los logs
stderr_logs = []
def read_stderr(proc):
while True:
line = proc.stderr.readline()
if not line:
break
stderr_logs.append(line)
print("[MCP STDERR]", line.strip())
stderr_thread = threading.Thread(target=read_stderr, args=(mcp_proc,), daemon=True)
stderr_thread.start()
# Comunicaci贸n usando JSON-RPC m铆nimo con timeout y logs
def call_mcp_server(prompt):
request = {
"jsonrpc": "2.0",
"id": 1,
"method": "get_current_stock_price", # Cambiado para probar el m茅todo
"params": [prompt]
}
try:
with lock:
print(f"[APP] Enviando petici贸n al MCP: {json.dumps(request)}")
mcp_proc.stdin.write(json.dumps(request) + "\n")
mcp_proc.stdin.flush()
# Esperar respuesta con timeout
start_time = time.time()
response_line = ''
while True:
if mcp_proc.stdout.closed:
return "El servidor MCP se cerr贸 inesperadamente."
if mcp_proc.stdout.readable():
response_line = mcp_proc.stdout.readline()
print(f"[APP] Recibido de MCP: {response_line}")
if response_line.strip():
break
if time.time() - start_time > 30:
return f"Timeout esperando respuesta del servidor MCP. Logs recientes: {''.join(stderr_logs[-10:])}"
time.sleep(0.1)
if not response_line:
return "No se recibi贸 respuesta del servidor MCP."
response = json.loads(response_line)
if "result" in response:
return response["result"]
elif "error" in response:
return f"Error del servidor MCP: {response['error']}\nLogs recientes: {''.join(stderr_logs[-10:])}"
else:
return f"Respuesta inesperada del servidor MCP. Logs recientes: {''.join(stderr_logs[-10:])}"
except Exception as e:
return f"Error comunicando con el servidor MCP: {str(e)}\nLogs recientes: {''.join(stderr_logs[-10:])}"
with gr.Blocks() as demo:
gr.Markdown("# Generador de Reportes Financieros (Claude + MCP)")
prompt = gr.Textbox(label="Informaci贸n financiera de la empresa")
output = gr.Textbox(label="Reporte generado")
btn = gr.Button("Generar reporte")
btn.click(fn=call_mcp_server, inputs=prompt, outputs=output)
if __name__ == "__main__":
demo.launch() |