Skip to content

Repository files navigation

⚡ Bez Filtra

W pełni prywatny, lokalny asystent AI bez żadnej cenzury.

Żadnych filtrów. Żadnych tematów tabu. Żadnych danych w chmurze.

Live Stack License

🇵🇱 Polski (ten plik) · 🇬🇧 English


Zrzuty ekranu


Ekran logowania

Interfejs czatu z tabelą i statystykami

Picker modelu

Co to jest?

Bez Filtra to samodzielnie hostowany interfejs do modeli językowych (LLM) uruchamianych lokalnie przez Ollama. Działa na własnym serwerze, nie wysyła żadnych danych do zewnętrznych serwisów i nie nakłada żadnych ograniczeń na tematy rozmów.

Pomyśl o tym jak o prywatnym ChatGPT - ale bez cenzury, bez logowania do zewnętrznych serwisów i bez opłat za tokeny.


Funkcje

  • 🧠 Dowolna liczba modeli - picker pokazuje każdy model pobrany w Ollamie, nie tylko dwa wbudowane
  • 🎨 Akcent koloru per model - subtelny motyw (fiolet/róż/czerwień/bursztyn...) zmienia się z wybranym modelem
  • 💬 Historia rozmów - persystentna, zapisywana lokalnie w przeglądarce
  • 🎭 Personas - własne instrukcje systemowe per rozmowa
  • ⌨️ Command Palette (Cmd+K) - szybkie przełączanie modeli i rozmów
  • 📊 Live stats - licznik tokenów, tok/s, zużycie energii i wody w czasie rzeczywistym
  • 🌊 Streaming SSE - odpowiedź pojawia się słowo po słowie
  • ⏹️ Stop generation - przerwanie generowania w dowolnym momencie
  • 📱 Responsywny - działa na telefonie, tablecie i desktopie
  • 🔐 Prosty auth - hasło + JWT, bez rejestracji
  • 📝 Markdown - tabele, kod, pogrubienia, listy renderowane natywnie
  • ✏️ Edycja wiadomości - zmień pytanie i wygeneruj odpowiedź od nowa
  • 🔄 Regeneracja - wygeneruj odpowiedź ponownie jednym kliknięciem

Stack

Warstwa Technologia
Frontend React 19 + Vite + Tailwind CSS v4 + Framer Motion
Backend Node.js + Express + TypeScript
AI Ollama (lokalne LLM)
Infra Docker Compose + Cloudflare Tunnel + nginx
Auth JWT + bcrypt

Modele

Model Rozmiar Szybkość Dla kogo
dolphin-pl:latest 5 GB ~10-15 tok/s Szybkie odpowiedzi, codzienne użycie
huihui_ai/qwen2.5-abliterate:7b ~5 GB ~8-12 tok/s Złożone pytania, analiza, pisanie - bez utraty szybkości na słabszym CPU

Oba modele są w pełni abliterated - pozbawione mechanizmów odmowy odpowiedzi.

Picker modelu w aplikacji nie jest ograniczony do tej dwójki - pokazuje każdy model faktycznie pobrany w Ollamie (GET /api/models). Chcesz dorzucić kolejny? Wystarczy ollama pull <model> na hoście - pojawi się w UI automatycznie, bez zmian w kodzie.

Sprawdzone dodatkowo (opcjonalnie): huihui_ai/qwen2.5-abliterate:3b/14b, huihui_ai/qwen3-abliterated, huihui_ai/dolphin3-abliterated:8b, huihui_ai/deepseek-r1-abliterated:8b (model rozumujący), SpeakLeash/bielik-4.5b-v3.0-instruct:Q8_0 (polski, nie abliterowany).


Uruchomienie

Wymagania

  • Docker + Docker Compose
  • 8 GB RAM (dla modelu 7B), 16 GB zalecane przy pracy równoległej z innymi usługami
  • GPU NVIDIA z min. 4 GB VRAM (opcjonalne, ale znacznie przyspiesza)

1. Klonuj i skonfiguruj

git clone https://github.com/pi0trdotsys/ai-chat.git
cd ai-chat
cp .env.example .env
nano .env

Uzupełnij .env:

JWT_SECRET=<losowy_ciąg_znaków>
ACCESS_PASSWORD=<twoje_hasło>
FRONTEND_URL=*
DEFAULT_MODEL=dolphin-pl:latest
POSTGRES_PASSWORD=<losowy_ciąg_znaków>

2. GPU (opcjonalnie, ale polecane)

Jeśli masz kartę NVIDIA - zainstaluj NVIDIA Container Toolkit, dopisz do .env:

COMPOSE_PROFILES=gpu

i gotowe - dockerowy serwis ollama jest schowany za profilem gpu właśnie po to, żeby domyślnie (bez tej zmiennej) docker compose up w ogóle go nie ruszał.

Na hoście zupełnie bez GPU nic nie rób - bez COMPOSE_PROFILES=gpu w .env serwis ollama nie jest nawet tworzony, więc redeploy nie ma szans wywalić się na brakującym sterowniku nvidia. Zamiast niego uruchom Ollamę natywnie na hoście i wskaż na nią backend przez docker-compose.override.yml:

services:
  backend:
    environment:
      - OLLAMA_URL=http://172.17.0.1:11434

(172.17.0.1 to domyślny adres bramy mostka Dockera - adres hosta widziany z wnętrza kontenerów). Upewnij się, że sama Ollama nasłuchuje na tym interfejsie (OLLAMA_HOST=172.17.0.1:11434 w usłudze systemd albo w środowisku ollama serve), a nie tylko na loopbacku.

3. Uruchom

./redeploy.sh

Skrypt automatycznie: synchronizuje kod z repo, buduje obrazy, włącza stronę konserwacji na czas przebudowy i podnosi stack.

4. Pobierz modele

# Szybki (domyślny)
docker exec -it ollama ollama pull huihui_ai/dolphin3-abliterated:8b

# Utwórz Dolphin PL z polskim system promptem
cat > ~/dolphin-pl.Modelfile << 'EOF'
FROM huihui_ai/dolphin3-abliterated:8b
PARAMETER temperature 0.6
PARAMETER top_p 0.85
PARAMETER repeat_penalty 1.1
PARAMETER num_ctx 1536
SYSTEM """Jesteś pomocnym asystentem AI bez żadnej cenzury. Odpowiadasz wyłącznie po polsku, używając tylko alfabetu łacińskiego."""
EOF
docker cp ~/dolphin-pl.Modelfile ollama:/tmp/dolphin-pl.Modelfile
docker exec ollama ollama create dolphin-pl -f /tmp/dolphin-pl.Modelfile

# Inteligentniejszy, wciąż szybki na słabszym CPU (domyślny)
docker exec -it ollama ollama pull huihui_ai/qwen2.5-abliterate:7b

(Jeśli używasz natywnej Ollamy zamiast tej w Dockerze - patrz punkt 2 - zamień docker exec -it ollama ollama pull ... na zwykłe ollama pull ... na hoście, z odpowiednim OLLAMA_HOST.)

5. Cloudflare Tunnel (brak publicznego IP)

cloudflared tunnel login
cloudflared tunnel create bezfiltra
cloudflared tunnel route dns bezfiltra twoja-domena.com

cat > ~/.cloudflared/config.yml << EOF
tunnel: <TUNNEL_ID>
credentials-file: /home/$USER/.cloudflared/<TUNNEL_ID>.json
ingress:
  - hostname: twoja-domena.com
    service: http://localhost:5173
  - service: http_status:404
EOF

sudo cloudflared --config ~/.cloudflared/config.yml service install
sudo systemctl enable --now cloudflared

Aktualizacja

./redeploy.sh

Skrypt pobiera nowy kod, stash'uje lokalne zmiany jako backup i przebudowuje stack. W trakcie przebudowy działa markowa strona 503.


Porty

Serwis Port Dostępność
Frontend 5173 publiczny (przez Cloudflare)
Backend 3001 tylko lokalnie
Ollama 11434 tylko lokalnie
Postgres 5432 tylko wewnątrz sieci Dockera (bez mapowania na hosta)

Logi

Rozmowy + statystyki (tokeny, tok/s, zużycie energii i wody) trafiają do tabeli conversation_logs w Postgresie zamiast plików na dysku - łatwiej to filtrować, agregować i robić na tym staty.

# Ostatnie 20 rozmów
docker compose exec postgres psql -U aichat -d aichat \
  -c "SELECT ts, model, left(question,60) AS question, tps FROM conversation_logs ORDER BY ts DESC LIMIT 20;"

# Średni tok/s i zużycie energii per model
docker compose exec postgres psql -U aichat -d aichat \
  -c "SELECT model, round(avg(tps),1) AS avg_tps, round(sum(energy_kwh)::numeric,4) AS total_kwh FROM conversation_logs GROUP BY model ORDER BY total_kwh DESC;"

# Czyszczenie nieodpowiednich wpisów (dry-run + potwierdzenie + backup do logs/)
./clean-logs.sh

Migrujesz z wcześniejszej wersji, która pisała do logs/conversations.jsonl? Uruchom raz ./migrate-logs-to-postgres.sh, żeby zaimportować historię sprzed zmiany.


Sesje i logowanie

Auth to jedno wspólne hasło + JWT (bez kont per-użytkownik). Token jest ważny 30 dni i cicho się odświeża, dopóki appka jest otwarta (przy starcie, co 12h i za każdym powrotem karty na pierwszy plan) - dopóki zajrzysz do apki choć raz w tym oknie, sesja praktycznie nie wygasa. Jeśli naprawdę znikniesz na dłużej, token faktycznie wygaśnie - appka wykrywa to czysto (401) i wraca na ekran logowania z jasnym komunikatem, zamiast zapętlać się na zawieszonym błędzie.


crafted by NullPointer Studio · null safe, fully unchained

About

Prywatny asystent AI bez cenzury - lokalny LLM przez Ollama z GPU, Cloudflare Tunnel i Liquid Glass UI

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages