File size: 5,009 Bytes
6a0ab84
26c60ac
ea18a0a
 
26c60ac
 
ea18a0a
26c60ac
d3afa04
 
26c60ac
 
ea18a0a
26c60ac
 
 
ea18a0a
26c60ac
 
 
ea18a0a
26c60ac
 
d3afa04
26c60ac
 
d3afa04
26c60ac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74afc8b
26c60ac
 
 
 
 
d3afa04
26c60ac
d3afa04
 
26c60ac
 
 
 
 
d3afa04
 
 
 
26c60ac
 
d3afa04
26c60ac
 
 
d3afa04
 
 
 
26c60ac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d3afa04
 
26c60ac
d3afa04
 
26c60ac
d3afa04
 
 
 
 
26c60ac
 
 
ea18a0a
26c60ac
 
d3afa04
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
145
146
147
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 code-autocomplete-gpt2-base...")
model_name = "shibing624/code-autocomplete-gpt2-base"
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/c贸digo de entrada usando code-autocomplete-gpt2-base
    
    Args:
        input_text (str): Texto/c贸digo 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 C贸digo") as demo:
        
        gr.Markdown("# 馃 Autocompletar C贸digo")
        gr.Markdown("Escribe el inicio de tu c贸digo y la IA lo completar谩 por ti.")
        
        with gr.Tab("Autocompletar"):
            with gr.Row():
                with gr.Column():
                    input_textbox = gr.Textbox(
                        label="C贸digo a completar",
                        placeholder="def fibonacci(n):",
                        lines=5,
                        max_lines=10
                    )
                    
                    generate_btn = gr.Button("Completar C贸digo", variant="primary")
                    
                with gr.Column():
                    output_textbox = gr.Textbox(
                        label="C贸digo generado",
                        placeholder="Aqu铆 aparecer谩 la continuaci贸n del c贸digo...",
                        lines=5,
                        max_lines=10,
                        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:** "def fibonacci(n):"
            **Salida:** "\\n    if n <= 1:\\n        return n\\n    return fibonacci(n-1) + fibonacci(n-2)"
            
            **Entrada:** "for i in range("
            **Salida:** "10):\\n    print(i)"
            
            **Entrada:** "import pandas as pd\\ndf = pd.read_csv("
            **Salida:** "'data.csv')\\nprint(df.head())"
            
            **Entrada:** "class Calculator:"
            **Salida:** "\\n    def __init__(self):\\n        pass"
            """)
    
    return demo

# Crear y lanzar la aplicaci贸n
if __name__ == "__main__":
    print("Iniciando aplicaci贸n de autocompletar c贸digo...")
    
    # 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
    )