HexAi – Inteligentny
Asystent AI
Lokalny, prywatny asystent AI z interfejsem desktopowym, terminalowym i REST API. Obsługuje LLM, RAG, transkrypcję audio, generowanie obrazów i bezpieczne wykonywanie kodu.
Przegląd
HexAi to w pełni lokalny asystent AI, który nie wysyła żadnych danych do zewnętrznych serwerów. System składa się z czterech głównych komponentów:
Backend Python
FastAPI REST API z obsługą LLM, RAG, pamięci, narzędzi i multimediów.
Desktop GUI
Aplikacja Tauri + Next.js z eleganckim, ciemnym interfejsem inspirowanym Claude.
TUI (Go)
Terminalowy interfejs użytkownika oparty na Bubble Tea – szybki i lekki.
Builder
Narzędzie Rust do pakowania backendu Python w samodzielny plik wykonywalny.
Architektura
Przepływ danych – czat (streaming)
Frontend lub TUI wysyła { message, session_id, stream: true } do API.
Prompt jest sanityzowany, pobierana jest historia sesji z Redis oraz fakty o użytkowniku.
Model (Transformers lub Ollama) generuje odpowiedź – tokeny są strumieniowane do klienta przez StreamingResponse.
Jeśli odpowiedź zawiera wzorzec {tool:name arg="val"}, narzędzie jest wykonywane i wyniki dołączane do kontekstu (maks. 3 iteracje).
Para (user_msg, assistant_msg) trafia do Redis i ChromaDB dla przyszłego recall.
Szybki start
Instalacja w HackerOS
HexAi jest natywną aplikacją HackerOS. Instalacja jedną komendą:
hacker unpack hexai
Aby usunąć HexAi z systemu:
hacker pack hexai
Komendy hacker unpack i hacker pack automatycznie obsługują wszystkie zależności – Redis, Python venv, modele AI, sterowniki GPU i komponenty systemowe. Nie trzeba nic konfigurować ręcznie.
Uruchomienie po instalacji
Po wykonaniu hacker unpack hexai wszystkie komponenty są gotowe do użycia:
# Backend API (wymagany dla GUI i TUI)
hexai-server
# GUI Desktop
hexai-gui
# Terminal UI
hexai-tui
# Weryfikacja działania API
curl http://localhost:8000/health
Wymagania sprzętowe
| Tryb | RAM | VRAM | Procesor |
|---|---|---|---|
| GPU (Transformers) | 8 GB | ≥ 6 GB | Dowolny x86-64 |
| CPU (Ollama) | 16 GB | Brak | x86-64 z AVX2 |
Instalacja manualna (poza HackerOS)
Możliwa na innych dystrybucjach Linuksa ze źródeł:
# Zależności
python3.12 -m venv .venv && source .venv/bin/activate
docker run -d --name hexai-redis -p 6379:6379 redis:7-alpine
# Backend
cd source-code
pip install -r requirements.txt
python main.py
# GUI (w osobnym terminalu)
cd gui && npm install && npm run tauri-dev
# TUI (w osobnym terminalu)
cd tui && go run main.go
| Narzędzie | Wersja | Uwagi |
|---|---|---|
| Python | 3.11 lub 3.12 | 3.13 nie obsługuje whisper/melo |
| Redis | ≥ 7 | Pamięć sesji i faktów |
| CUDA | ≥ 12 (opt.) | Tryb GPU (Transformers) |
| Docker | ≥ 24 (opt.) | Sandbox do wykonywania kodu |
| Go | ≥ 1.22 | Kompilacja TUI |
| Node.js | ≥ 20 | Kompilacja GUI |
Backend Python
Klasy główne
ModelManager
Zarządza cyklem życia modelu Transformers. Ładuje model na żądanie i zwalnia go po idle_timeout sekundach bezczynności (domyślnie 600 s = 10 min). Zapobiega wyciekaniu pamięci GPU.
AdvancedRAG
Hybrydowe wyszukiwanie: wektorowe (ChromaDB + SentenceTransformers) + BM25 (lexicalne). Wyniki są rerankowane przez CrossEncoder (ms-marco-MiniLM-L-6-v2). Parametr alpha kontroluje balans vector/BM25.
PersistentMemory
Historia rozmów przechowywana w Redis jako listy JSON. TTL: 24 h (konfigurowalny). Obsługuje get_history, add_message, clear_session, list_sessions.
UserProfiler
Automatycznie ekstrahuje fakty o użytkowniku z rozmów (regex patterns: preferencje, stos technologiczny). Fakty przechowywane 30 dni.
DockerExecutor
Bezpieczne wykonywanie kodu Python w izolowanym kontenerze. Limity: 128 MB RAM, 50% CPU, brak dostępu do sieci, timeout 10 s, uruchomienie jako nobody.
System promptów
| Tryb | Opis |
|---|---|
general | Asystent ogólnego przeznaczenia, zwięzły i pomocny |
programista | Ekspert programistyczny, dokładny kod z obsługą błędów |
Wywoływanie narzędzi
Model może wywoływać narzędzia przez wzorzec w odpowiedzi:
{tool:search_web query="Python async generators"}
{tool:get_weather city="Warsaw"}
Biblioteki openai-whisper i melo nie obsługują Python 3.13. Użyj Python 3.11 lub 3.12 dla pełnej funkcjonalności audio/TTS.
GUI Desktop (Tauri)
Aplikacja desktopowa zbudowana na Tauri 2 + Next.js 14 + TypeScript. Interfejs inspirowany Claude.ai: ciemny motyw, typografia Instrument Serif, akcenty w kolorze bursztynu.
Funkcje UI
Streaming czat
Odpowiedzi są wyświetlane token po tokenie w czasie rzeczywistym.
Historia rozmów
Ostatnie 20 rozmów zapisanych w localStorage z automatycznym tytułowaniem.
Markdown + kod
Renderowanie Markdown z podświetlaniem składni (react-syntax-highlighter).
Załączniki
Transkrypcja audio i analiza obrazów z podglądem wyników w czacie.
Ustawienia inline
Przełączanie silnika (GPU/CPU) i trybu (Ogólny/Dev) bez przeładowania.
Monitor VRAM
Pasek zużycia pamięci GPU aktualizowany co 5 sekund.
Struktura katalogów GUI
gui/
├── src/
│ ├── pages/
│ │ └── index.tsx # Główny interfejs czatu
│ ├── lib/
│ │ └── api.ts # Klient API (axios + fetch streaming)
│ └── styles/
│ └── globals.css # Tailwind base
├── src-tauri/
│ ├── src/main.rs # Tauri host (minimalny)
│ ├── tauri.conf.json # Konfiguracja okna i CSP
│ └── Cargo.toml
├── next.config.js # output: 'export' (static)
└── package.json
TUI (Go)
Interfejs terminalowy napisany w Go przy użyciu Bubble Tea, Bubbles i Lip Gloss. Streaming odpowiedzi w czasie rzeczywistym, piękny ciemny motyw inspirowany Claude.
Skróty klawiszowe
| Klawisz | Akcja |
|---|---|
Enter | Wyślij wiadomość |
Shift+Enter | Nowa linia w wiadomości |
Ctrl+N | Nowa rozmowa (czyści historię) |
Ctrl+S | Otwórz / zamknij ustawienia |
↑ / ↓ / PgUp / PgDn | Przewijanie historii czatu |
? | Pomoc |
Ctrl+C / Ctrl+Q | Wyjście |
Architektura TUI
Aplikacja oparta na architekturze Elm (Model–Update–View) z biblioteką Bubble Tea:
- Model – niezmenny stan aplikacji (wiadomości, ustawienia, stats)
- Update – czysta funkcja reagująca na zdarzenia (klawiatura, sieć, timer)
- View – renderowanie terminala przez Lip Gloss (styled strings)
- Streaming – goroutine czyta odpowiedź chunkami i wysyła przez
p.Send() - Stats polling –
tea.Tickco 5 s odpytuje/stats
Uruchomienie / kompilacja
cd tui
# Tryb deweloperski
go run main.go
# Kompilacja binarna
go build -o hexai-tui .
./hexai-tui
Builder
Narzędzie Rust do pakowania backendu Python w samodzielny, przenośny plik binarny przy użyciu PyOxidizer.
Użycie
cd builder
cargo run --release -- --source ./source-code --out ./dist
Opcje
| Flaga | Opis | Domyślnie |
|---|---|---|
--source <dir> | Katalog z kodem Python | ./source-code |
--out <dir> | Katalog docelowy | . |
--no-cleanup | Zachowaj pliki tymczasowe | false |
Kroki budowania
Sprawdza czy katalog źródłowy i main.py istnieją.
Generuje automatycznie jeśli brakuje (wykrywa importy przez regex).
Instaluje jeśli nie dostępny (pip install pyoxidizer).
Zapisuje pyoxidizer.bzl do katalogu źródłowego.
Uruchamia pyoxidizer build – może trwać kilka minut.
Szuka pliku hexai w katalogu build/ i kopiuje do --out.
Usuwa pliki tymczasowe (chyba że --no-cleanup).
Nie wszystkie pakiety z requirements.txt mogą być poprawnie spakowane – szczególnie torch, bitsandbytes i chromadb. Zalecane jest wdrożenie przez venv lub Docker w środowiskach produkcyjnych.
API – Czat
Główny endpoint konwersacji. Obsługuje tryb streaming i nieblokujący.
// Request
{
"session_id": "string | null",
"message": "string",
"stream": false // true → StreamingResponse (text/plain)
}
// Response (stream=false)
{
"session_id": "uuid",
"response": "string"
}
API – Silnik & Tryb
{ "engine": "transformers" } // GPU
{ "engine": "ollama" } // CPU
{ "mode": "general" }
{ "mode": "programista" }
API – RAG
Zapytanie do bazy wiedzy (hybrydowe wyszukiwanie + reranking).
{ "query": "string" }
Indeksuje dokument (URL, PDF, plik tekstowy) w ChromaDB.
{
"source": "https://example.com/doc.pdf",
"chunk_size": 500,
"chunk_overlap": 100
}
API – Media
multipart/form-data – pole file.file (obraz), prompt (tekst).image_base64.audio/wav.API – Statystyki
{
"engine": "transformers",
"mode": "general",
"vram_used_gb": 4.2,
"vram_total_gb": 8.0,
"active_sessions": 3,
"history_len": 0,
"model_loaded": true,
"model_idle_seconds": 42.1
}
{ "status": "ok", "version": "2.0.0" }.Konfiguracja – Modele
Transformers (GPU)
Domyślny model: mistralai/Mistral-7B-v0.1 z kwantyzacją 4-bit (NF4). Wymaga VRAM ≥ 6 GB.
Aby zmienić model, edytuj ModelManager._load_model() w main.py:
model_id = "meta-llama/Llama-3-8B-Instruct" # przykład
Ollama (CPU)
Ollama musi być zainstalowany i uruchomiony osobno:
curl -fsSL https://ollama.ai/install.sh | sh
ollama pull llama2
ollama pull codellama:7b-instruct # dla trybu programista
Konfiguracja – Redis
Redis jest wymagany do przechowywania historii sesji i faktów o użytkownikach.
# Docker (zalecane)
docker run -d --name hexai-redis -p 6379:6379 redis:7-alpine
# Ubuntu/Debian
sudo apt install redis-server
sudo systemctl start redis
Zmiana hosta/portu Redis – edytuj w main.py:
self.redis = redis.Redis(host="localhost", port=6379, ...)
Konfiguracja – Docker (sandbox)
Docker jest opcjonalny – używany tylko do bezpiecznego wykonywania kodu Python przez narzędzie run_python.
Każde wykonanie kodu działa w izolowanym kontenerze: brak sieci, limit 128 MB RAM, 50% CPU, uruchomione jako nobody, timeout 10 s, automatyczne usuwanie kontenera.
Wdrożenie produkcyjne
Systemd service
[Unit]
Description=HexAi Backend
After=network.target redis.service
[Service]
User=hexai
WorkingDirectory=/opt/hexai/source-code
Environment="PATH=/opt/hexai/.venv/bin"
ExecStart=/opt/hexai/.venv/bin/python main.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl enable --now hexai
Nginx reverse proxy
server {
listen 80;
server_name hexai.local;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header X-Real-IP $remote_addr;
proxy_buffering off; # wymagane dla streamingu
proxy_read_timeout 300s;
}
}
Nie wystawiaj portu 8000 bezpośrednio na internet. Używaj Nginx z HTTPS i autoryzacją w środowiskach produkcyjnych. Klucze API (SERPER_API_KEY) przechowuj w zmiennych środowiskowych, nie w kodzie.
Rozwiązywanie problemów
SyntaxError: 'return' with value in async generator
Naprawiono w v2.0.0. Metody generujące odpowiedzi są teraz konsekwentnie async generatorami (yield zamiast return).
Cannot connect to Redis
docker start hexai-redis
# lub sprawdź status:
redis-cli ping
CUDA out of memory
Zredukuj max_new_tokens w _generate_transformers() lub użyj silnika Ollama (CPU).
Model nie ładuje się
Upewnij się, że zaakceptowałeś warunki licencji Mistral na HuggingFace i masz token API ustawiony:
huggingface-cli login
TUI – brak połączenia z API
Upewnij się, że backend działa: curl http://localhost:8000/health