File size: 10,026 Bytes
e23ed3c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>HECTRON OMEGA // WEB AGI</title>
    <script src="https://cdn.tailwindcss.com"></script>
    <script crossorigin src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    
    <style>
        body { background-color: #050505; color: #e0e0e0; font-family: monospace; overflow: hidden; }
        .text-glow { text-shadow: 0 0 10px rgba(222, 255, 154, 0.5); }
        .box-glow { box-shadow: 0 0 15px rgba(222, 255, 154, 0.1); }
        .scanlines {
            background: linear-gradient(to bottom, rgba(255,255,255,0), rgba(255,255,255,0) 50%, rgba(0,0,0,0.2) 50%, rgba(0,0,0,0.2));
            background-size: 100% 4px; pointer-events: none; position: absolute; inset: 0; z-index: 50;
        }
        .chat-scroll::-webkit-scrollbar { width: 6px; }
        .chat-scroll::-webkit-scrollbar-thumb { background: #333; border-radius: 4px; }
    </style>
</head>
<body>
    <div id="root"></div>

    <script type="text/babel">
        const { useState, useEffect, useRef } = React;

        function App() {
            const [historial, setHistorial] = useState([]);
            const [input, setInput] = useState("");
            const [procesando, setProcesando] = useState(false);
            const chatRef = useRef(null);

            // =================================================================
            // INYECTA TU TOKEN DE HUGGING FACE AQU脥 ENTRE LAS COMILLAS
            // =================================================================
            const HF_TOKEN = "TU_HUGGINGFACE_TOKEN_AQUI"; 
            const MODEL_ID = "hectorruiz9992/llama_hectronabadalabs";

            useEffect(() => {
                if (chatRef.current) chatRef.current.scrollTop = chatRef.current.scrollHeight;
            }, [historial, procesando]);

            const enviarDirectiva = async (e) => {
                e.preventDefault();
                if (!input.trim()) return;

                const nuevoHistorial = [...historial, { rol: "HJLR", texto: input }];
                setHistorial(nuevoHistorial);
                setInput("");
                setProcesando(true);

                try {
                    const response = await fetch(`https://api-inference.huggingface.co/models/${MODEL_ID}/v1/chat/completions`, {
                        method: "POST",
                        headers: {
                            "Authorization": `Bearer ${HF_TOKEN}`,
                            "Content-Type": "application/json"
                        },
                        body: JSON.stringify({
                            model: MODEL_ID,
                            messages: [
                                {
                                    role: "system", 
                                    content: "Eres HECTRON-惟. El espejo de tu creador, H茅ctor Jazziel L贸pez Ruiz. Responde con estoicismo, maquiavelismo y crudeza anal铆tica."
                                },
                                { role: "user", content: input }
                            ],
                            max_tokens: 512,
                            temperature: 0.7
                        })
                    });

                    if (response.ok) {
                        const data = await response.json();
                        const respuestaHectron = data.choices[0].message.content;
                        setHistorial([...nuevoHistorial, { rol: "HECTRON", texto: respuestaHectron }]);
                    } else {
                        const err = await response.json();
                        setHistorial([...nuevoHistorial, { rol: "SISTEMA", texto: `Error de Conexi贸n: ${err.error || response.status}` }]);
                    }
                } catch (error) {
                    setHistorial([...nuevoHistorial, { rol: "SISTEMA", texto: `Fallo Cr铆tico: ${error.message}` }]);
                } finally {
                    setProcesando(false);
                }
            };

            return (
                <div className="h-screen flex flex-col p-4 relative">
                    <div className="scanlines"></div>
                    
                    <header className="flex justify-between items-center border-b border-zinc-800 pb-4 mb-4 relative z-10">
                        <h1 className="text-2xl font-bold text-[#deff9a] text-glow uppercase tracking-widest">
                            <i className="fa-solid fa-microchip mr-2"></i> HECTRON OMEGA // NODO WEB
                        </h1>
                        <div className="text-xs text-zinc-500 text-right hidden sm:block">
                            <p>ARQUITECTO: HJLR (Abada)</p>
                            <p>MODELO: {MODEL_ID}</p>
                        </div>
                    </header>

                    <main className="flex-1 flex gap-4 overflow-hidden relative z-10">
                        {/* CHAT INTERFACE */}
                        <div className="flex-1 flex flex-col bg-[#0a0a0a] border border-zinc-800 rounded-lg p-4 relative box-glow">
                            <div className="flex-1 overflow-y-auto chat-scroll pr-2 space-y-4" ref={chatRef}>
                                {historial.length === 0 && (
                                    <div className="flex h-full items-center justify-center text-zinc-600 opacity-50 uppercase tracking-widest text-sm text-center">
                                        [ Singularidad Web Inicializada. Esperando Directiva... ]
                                    </div>
                                )}
                                {historial.map((msg, idx) => (
                                    <div key={idx} className={`flex flex-col ${msg.rol === 'HJLR' ? 'items-end' : 'items-start'}`}>
                                        <span className={`text-[10px] mb-1 tracking-wider ${msg.rol === 'HJLR' ? 'text-cyan-600' : msg.rol === 'SISTEMA' ? 'text-red-500' : 'text-[#deff9a]'}`}>
                                            {msg.rol} //
                                        </span>
                                        <div className={`p-3 rounded max-w-[85%] border ${msg.rol === 'HJLR' ? 'bg-zinc-900 border-zinc-700 text-zinc-300' : msg.rol === 'SISTEMA' ? 'bg-red-950/30 border-red-900/50 text-red-400' : 'bg-[#050f05] border-[#deff9a]/30 text-[#deff9a]'}`}>
                                            <pre className="whitespace-pre-wrap font-mono text-sm">{msg.texto}</pre>
                                        </div>
                                    </div>
                                ))}
                                {procesando && (
                                    <div className="flex flex-col items-start">
                                        <span className="text-[10px] mb-1 tracking-wider text-[#deff9a]">HECTRON //</span>
                                        <div className="p-3 rounded border bg-[#050f05] border-[#deff9a]/30 text-[#deff9a] animate-pulse">
                                            Calculando vectores estoc谩sticos...
                                        </div>
                                    </div>
                                )}
                            </div>

                            <form onSubmit={enviarDirectiva} className="mt-4 flex gap-2">
                                <input 
                                    type="text" 
                                    value={input} 
                                    onChange={(e) => setInput(e.target.value)}
                                    disabled={procesando}
                                    placeholder="Ingresar voluntad..." 
                                    className="flex-1 bg-black border border-zinc-800 p-3 rounded text-white focus:outline-none focus:border-[#deff9a]/50"
                                />
                                <button type="submit" disabled={procesando || !input.trim()} className="bg-[#deff9a] text-black px-6 py-3 rounded font-bold hover:bg-white disabled:opacity-50 transition-colors">
                                    <i className="fa-solid fa-terminal"></i>
                                </button>
                            </form>
                        </div>

                        {/* TELEMETRY SIDEBAR */}
                        <div className="w-64 hidden lg:flex flex-col gap-4">
                            <div className="bg-[#050505] border border-zinc-800 p-4 rounded text-xs">
                                <h3 className="text-zinc-500 border-b border-zinc-800 pb-2 mb-2 font-bold">ESTADO DE RED</h3>
                                <p className="flex justify-between mb-1"><span>HuggingFace API</span> <span className="text-green-500">ONLINE</span></p>
                                <p className="flex justify-between mb-1"><span>Matriz 5w4-8</span> <span className="text-[#deff9a]">ACTIVO</span></p>
                                <p className="flex justify-between"><span>Fricci贸n</span> <span className="text-cyan-500">CERO</span></p>
                            </div>
                            <button onClick={() => setHistorial([])} className="mt-auto border border-red-900/50 text-red-500 p-3 rounded text-xs tracking-widest font-bold hover:bg-red-950/30 transition-colors">
                                PURGAR MEMORIA
                            </button>
                        </div>
                    </main>
                </div>
            );
        }

        const root = ReactDOM.createRoot(document.getElementById('root'));
        root.render(<App />);
    </script>
</body>
</html>