Dokumentacja techniczna

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.

Python 3.11–3.12 FastAPI 0.115 Rust 2021 Tauri 2.0 Next.js 14

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

┌────────────────────────────────────────────────────────────┐ HexAi System ├──────────────┬──────────────┬──────────────────────────────────┤ │ Desktop GUI │ TUI Rust │ Builder Rust │ │ Tauri+Next │ (Bubble Tea) │ (PyOxidizer wrapper) │ ├──────────────┴──────────────┴──────────────────────────────────┤ REST API http://localhost:8000 ├────────────────────────────────────────────────────────────────┤ HexAI Core (Python) ModelManagerAdvancedRAGPersistentMemoryTools TTL cacheHybrid BM25Redis sessionsDocker GPU/CPUReranking30-day factsSearch ├──────────────┬──────────────┬──────────────────────────────────┤ Transformers Ollama API ChromaDB Redis Docker Mistral-7B llama2/code Vector DB └──────────────┴──────────────┴────────────┴────────┴─────────────┘

Przepływ danych – czat (streaming)

1
Klient → POST /chat

Frontend lub TUI wysyła { message, session_id, stream: true } do API.

2
Sanityzacja & kontekst

Prompt jest sanityzowany, pobierana jest historia sesji z Redis oraz fakty o użytkowniku.

3
Generowanie odpowiedzi

Model (Transformers lub Ollama) generuje odpowiedź – tokeny są strumieniowane do klienta przez StreamingResponse.

4
Wywołania narzędzi

Jeśli odpowiedź zawiera wzorzec {tool:name arg="val"}, narzędzie jest wykonywane i wyniki dołączane do kontekstu (maks. 3 iteracje).

5
Zapis do pamięci

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ą:

bashHackerOS Terminal
hacker unpack hexai

Aby usunąć HexAi z systemu:

bash
hacker pack hexai
Automatyczne zarządzanie zależnościami

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:

bash
# 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

TrybRAMVRAMProcesor
GPU (Transformers)8 GB≥ 6 GBDowolny x86-64
CPU (Ollama)16 GBBrakx86-64 z AVX2

Instalacja manualna (poza HackerOS)

Możliwa na innych dystrybucjach Linuksa ze źródeł:

bash
# 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ędzieWersjaUwagi
Python3.11 lub 3.123.13 nie obsługuje whisper/melo
Redis≥ 7Pamięć sesji i faktów
CUDA≥ 12 (opt.)Tryb GPU (Transformers)
Docker≥ 24 (opt.)Sandbox do wykonywania kodu
Go≥ 1.22Kompilacja TUI
Node.js≥ 20Kompilacja 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

TrybOpis
generalAsystent ogólnego przeznaczenia, zwięzły i pomocny
programistaEkspert 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"}
⚠️
Python 3.13 – niekompatybilność

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

KlawiszAkcja
EnterWyślij wiadomość
Shift+EnterNowa linia w wiadomości
Ctrl+NNowa rozmowa (czyści historię)
Ctrl+SOtwórz / zamknij ustawienia
↑ / ↓ / PgUp / PgDnPrzewijanie historii czatu
?Pomoc
Ctrl+C / Ctrl+QWyjś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 pollingtea.Tick co 5 s odpytuje /stats

Uruchomienie / kompilacja

bash
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

bash
cd builder
cargo run --release -- --source ./source-code --out ./dist

Opcje

FlagaOpisDomyślnie
--source <dir>Katalog z kodem Python./source-code
--out <dir>Katalog docelowy.
--no-cleanupZachowaj pliki tymczasowefalse

Kroki budowania

1
Walidacja

Sprawdza czy katalog źródłowy i main.py istnieją.

2
requirements.txt

Generuje automatycznie jeśli brakuje (wykrywa importy przez regex).

3
PyOxidizer

Instaluje jeśli nie dostępny (pip install pyoxidizer).

4
Konfiguracja

Zapisuje pyoxidizer.bzl do katalogu źródłowego.

5
Budowanie

Uruchamia pyoxidizer build – może trwać kilka minut.

6
Kopiowanie

Szuka pliku hexai w katalogu build/ i kopiuje do --out.

7
Sprzątanie

Usuwa pliki tymczasowe (chyba że --no-cleanup).

⚠️
Ograniczenia PyOxidizer

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

POST /chat

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"
}
GET /sessions
Lista aktywnych sesji z Redis.
DELETE /session/{session_id}
Usuwa historię sesji z Redis.

API – Silnik & Tryb

POST /engine
{ "engine": "transformers" }   // GPU
{ "engine": "ollama" }         // CPU
POST /mode
{ "mode": "general" }
{ "mode": "programista" }

API – RAG

POST /rag

Zapytanie do bazy wiedzy (hybrydowe wyszukiwanie + reranking).

{ "query": "string" }
POST /ingest

Indeksuje dokument (URL, PDF, plik tekstowy) w ChromaDB.

{
  "source": "https://example.com/doc.pdf",
  "chunk_size": 500,
  "chunk_overlap": 100
}

API – Media

POST /transcribe
Transkrypcja audio (Whisper small). multipart/form-data – pole file.
POST /analyze_image
Analiza obrazu (LLaVA 1.5-7B). Pola: file (obraz), prompt (tekst).
POST /generate_image
Generowanie obrazu (Stable Diffusion v1.4). Zwraca image_base64.
GET /tts?text=...
Synteza mowy (MeloTTS, język PL). Zwraca audio/wav.

API – Statystyki

GET /stats
{
  "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
}
GET /health
Prosty health check. Zwraca { "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:

bash
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.

bash
# 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.

Bezpieczeństwo sandboxu

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

ini/etc/systemd/system/hexai.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
bash
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;
    }
}
🔒
Bezpieczeństwo

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