File size: 4,754 Bytes
6a0ab84
26c60ac
ea18a0a
 
26c60ac
 
ea18a0a
26c60ac
 
 
 
 
ea18a0a
26c60ac
 
 
ea18a0a
26c60ac
 
 
ea18a0a
26c60ac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74afc8b
26c60ac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ea18a0a
26c60ac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
import gradio as gr
from transformers import GPT2LMHeadModel, GPT2Tokenizer
import torch

# Configurar el dispositivo (CPU)
device = torch.device("cpu")

# Cargar el modelo y tokenizer
print("Cargando modelo DistilGPT-2...")
model_name = "distilgpt2"
tokenizer = GPT2Tokenizer.from_pretrained(model_name)
model = GPT2LMHeadModel.from_pretrained(model_name)

# Mover modelo a CPU y ponerlo en modo evaluación
model.to(device)
model.eval()

# Configurar pad_token si no existe
if tokenizer.pad_token is None:
    tokenizer.pad_token = tokenizer.eos_token

def autocomplete_text(input_text, max_tokens=20):
    """
    Autocompleta el texto de entrada usando DistilGPT-2
    
    Args:
        input_text (str): Texto inicial a completar
        max_tokens (int): Número máximo de tokens a generar
    
    Returns:
        str: Solo la parte nueva generada (sin el input original)
    """
    if not input_text.strip():
        return "Por favor, ingresa algún texto para completar."
    
    try:
        # Tokenizar el texto de entrada
        inputs = tokenizer.encode(input_text, return_tensors="pt", padding=True)
        inputs = inputs.to(device)
        
        # Generar texto
        with torch.no_grad():
            outputs = model.generate(
                inputs,
                max_new_tokens=max_tokens,
                num_return_sequences=1,
                temperature=0.7,
                do_sample=True,
                pad_token_id=tokenizer.eos_token_id,
                eos_token_id=tokenizer.eos_token_id,
                attention_mask=torch.ones_like(inputs)
            )
        
        # Decodificar el resultado completo
        generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
        
        # Extraer solo la parte nueva (sin el input original)
        new_text = generated_text[len(input_text):].strip()
        
        if not new_text:
            return "No se pudo generar texto adicional."
        
        return new_text
        
    except Exception as e:
        return f"Error al generar texto: {str(e)}"

def create_autocomplete_interface():
    """
    Crea la interfaz de autocompletar dentro de gr.Blocks()
    """
    
    with gr.Blocks(title="Autocompletar Texto") as demo:
        
        gr.Markdown("# 🤖 Autocompletar Texto")
        gr.Markdown("Escribe el inicio de una frase y la IA la completará por ti.")
        
        with gr.Tab("Autocompletar"):
            with gr.Row():
                with gr.Column():
                    input_textbox = gr.Textbox(
                        label="Texto a completar",
                        placeholder="Escribe el inicio de tu frase aquí...",
                        lines=3,
                        max_lines=5
                    )
                    
                    generate_btn = gr.Button("Completar Texto", variant="primary")
                    
                with gr.Column():
                    output_textbox = gr.Textbox(
                        label="Texto generado",
                        placeholder="Aquí aparecerá la continuación...",
                        lines=3,
                        max_lines=5,
                        interactive=False
                    )
            
            # Conectar el botón con la función
            generate_btn.click(
                fn=autocomplete_text,
                inputs=[input_textbox],
                outputs=[output_textbox]
            )
            
            # También permitir Enter para generar
            input_textbox.submit(
                fn=autocomplete_text,
                inputs=[input_textbox],
                outputs=[output_textbox]
            )
            
        # Pestaña adicional con ejemplos
        with gr.Tab("Ejemplos"):
            gr.Markdown("""
            ### Ejemplos de uso:
            
            **Entrada:** "El clima de hoy está"
            **Salida:** "muy agradable y soleado"
            
            **Entrada:** "Me gusta mucho"
            **Salida:** "pasar tiempo con mi familia"
            
            **Entrada:** "Para hacer una buena comida necesitas"
            **Salida:** "ingredientes frescos y mucha paciencia"
            """)
    
    return demo

# Crear y lanzar la aplicación
if __name__ == "__main__":
    print("Iniciando aplicación de autocompletar...")
    
    # Crear la interfaz
    app = create_autocomplete_interface()
    
    # Lanzar la aplicación
    app.launch(
        share=False,  # Cambiar a True si quieres compartir públicamente
        server_name="0.0.0.0",  # Permite acceso desde otras máquinas en la red local
        server_port=7860,  # Puerto por defecto de Gradio
        show_error=True,
        debug=False
    )