NanoProgramerGamer's picture
Update app.py
d2421b1 verified
import gradio as gr
from transformers import pipeline
MODEL_ID = "Salesforce/codet5-base" # o describeai/gemini-small si ya lo tienes disponible
explain_pipe = pipeline("text2text-generation", model=MODEL_ID)
def explicar_codigo(code: str):
# Forzar respuesta en español
prompt = f"Por favor, EXPLICA EN ESPAÑOL de forma clara y profesional qué hace este fragmento de código. " \
f"Si hay términos en inglés dé un equivalente en español. " \
f"Explica propósito, parámetros y salida si aplica.\n\nCódigo:\n{code}"
out = explain_pipe(prompt, max_length=256, do_sample=False)
return out[0]["generated_text"]
# Interfaz normal para la página del Space
with gr.Blocks() as demo:
gr.Markdown("# Asistente IA — Explicador de código")
txt = gr.Textbox(lines=12, placeholder="Pega tu código aquí...")
out = gr.Textbox(label="Explicación (en español)")
btn = gr.Button("Explicar")
btn.click(explicar_codigo, txt, out)
# Inyectamos JS que escucha postMessage desde el padre (tu doc) y responde con llamada local al endpoint /run/predict
# Esto permite que el iframe reciba {type:'explain', code: '...'} y devuelva {type:'explain_result', text:'...'}
gr.HTML("""
<script>
window.addEventListener('message', async (event) => {
try {
if (!event.data || event.data.type !== 'explain') return;
const code = event.data.code || '';
// Llamar al propio endpoint del Space
const resp = await fetch('/run/predict', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({data: [code]})
});
const json = await resp.json();
const text = json?.data?.[0] || '❌ El asistente no devolvió texto.';
// Enviar la respuesta al padre
window.parent.postMessage({type: 'explain_result', text: text}, '*');
} catch (e) {
window.parent.postMessage({type: 'explain_result', text: '❌ Error interno en el asistente.'}, '*');
console.error('Error interno en Space:', e);
}
});
</script>
""")
demo.launch()