nordabiz/CHAT-ANALYSIS.md
2026-01-01 14:01:49 +01:00

12 KiB
Raw Blame History

🤖 Analiza Systemu Chatu nordabiznes.pl

Data analizy: 2025-11-24 13:15 Status aplikacji: Działa (http://localhost:5001)


📊 PODSUMOWANIE WYKONAWCZE

Komponent Status Uwagi
Aplikacja Flask Działa Port 5001, odpowiada 200 OK
Chat Route ⚠️ Wymaga logowania @login_required decorator
Chat Template Istnieje templates/chat.html (13.9 KB)
Chat Engine Zaimplementowany nordabiz_chat.py (17 KB)
Gemini Service Zaimplementowany gemini_service.py (15 KB)
API Key NIE SKONFIGUROWANY Placeholder w .env
Database Istnieje nordabiz_local.db (127 KB)

Główny problem: Brak prawidłowego klucza API Gemini


🔍 SZCZEGÓŁOWA ANALIZA

1. Architektura Chatu

User → Flask Route → NordaBizChatEngine → Gemini Service → Google Gemini API
         ↓                  ↓                     ↓
      Login Check      Database Save        Cost Tracking

Komponenty:

  1. Frontend (templates/chat.html):

    • Interfejs użytkownika
    • JavaScript do komunikacji z API
    • Real-time chat UI
  2. Flask Routes (app.py):

    • /chat - Strona chatu (wymaga logowania )
    • /api/chat/start - Rozpocznij konwersację
    • /api/chat/<id>/message - Wyślij wiadomość
    • /api/chat/<id>/history - Historia konwersacji
  3. Chat Engine (nordabiz_chat.py):

    • Klasa NordaBizChatEngine
    • Zarządzanie konwersacjami
    • Integracja z bazą danych
    • Cost tracking (tokeny, USD, latencja)
  4. Gemini Service (gemini_service.py):

    • Centralized API access
    • Automatic cost tracking do tabeli ai_api_costs
    • Model: gemini-2.5-flash
  5. Database Tables:

    • ai_chat_conversations - Konwersacje
    • ai_chat_messages - Wiadomości (user + assistant)
    • ai_api_costs - Śledzenie kosztów API

PROBLEMY ZIDENTYFIKOWANE

1. KRYTYCZNY: Brak klucza API Gemini

Plik: .env linia 18

GOOGLE_GEMINI_API_KEY=your_gemini_api_key_here  # ❌ Placeholder!

Efekt:

  • Chat NIE BĘDZIE działać
  • API calls będą failować
  • Użytkownik dostanie błąd

Rozwiązanie:

# Uzyskaj klucz z: https://makersuite.google.com/app/apikey
GOOGLE_GEMINI_API_KEY=AIzaSy...twój_prawdziwy_klucz

2. MEDIUM: Wymagane logowanie

Plik: app.py linia 467

@app.route('/chat')
@login_required  # ⚠️ Wymaga konta użytkownika
def chat():

Efekt:

  • Dostęp do chatu tylko dla zalogowanych
  • Niezalogowani: redirect 302 → /login

Opcje:

  1. Zostaw tak (bezpieczne, kontrolowane)
  2. ⚠️ Usuń @login_required (dostęp publiczny, ryzyko spam/abuse)
  3. 🎯 Rate limiting + CAPTCHA (public access z ochroną)

Rekomendacja: Zostaw @login_required - lepiej bezpieczny dostęp niż spam.


3. LOW: Tokenizer fallback w chat engine

Plik: nordabiz_chat.py linie 184-188

else:
    # Fallback if tokenizer not available
    input_tokens = len(user_message.split()) * 2  # Rough estimate
    output_tokens = len(response.split()) * 2
    cost_usd = 0.0

Efekt:

  • Jeśli API key invalid → tokenizer = None
  • Cost tracking będzie niedokładny (estimaty zamiast faktycznych tokenów)
  • cost_usd = 0.0 - mylące dla analytics

Rozwiązanie: Dodaj lepszy error handling:

if not self.tokenizer:
    raise ValueError("Gemini API not configured - check GOOGLE_GEMINI_API_KEY")

CO DZIAŁA DOBRZE

1. Struktura kodu - Profesjonalna!

class NordaBizChatEngine:
    def start_conversation(...)  # ✅ Czyste API
    def send_message(...)         # ✅ Intuicyjne
    def _build_context(...)       # ✅ Private helpers
    def _query_ai(...)            # ✅ Modularny design

2. Database integration - Kompletna!

  • Pełna historia konwersacji
  • Per-message cost tracking
  • User/Assistant roles
  • Timestamps, latency, tokens

3. Cost tracking - Dwupoziomowy! 💰

Poziom 1: ai_chat_messages table

  • Per-message metrics
  • Input/output tokens
  • Cost USD
  • Latency

Poziom 2: ai_api_costs table (via gemini_service)

  • Centralized tracking
  • All API calls (nie tylko chat)
  • Aggregation możliwa

4. Context building - Inteligentny! 🧠

def _build_conversation_context(self, db, conversation, user_message):
    """
    Builds context from:
    1. Conversation history (last N messages)
    2. Relevant companies (matching user query)
    3. System instructions
    """

Features:

  • Relevant companies z bazy
  • Full conversation history
  • Concise responses (system prompt: "Odpowiedzi krótkie i konkretne")

🧪 TESTY DO WYKONANIA

Test 1: Sprawdź czy API key działa (jeśli dodasz)

cd ~/claude/projects/active/nordabiz
python3 -c "
import os
from dotenv import load_dotenv
import google.generativeai as genai

load_dotenv()
api_key = os.getenv('GOOGLE_GEMINI_API_KEY')
print(f'API Key: {api_key[:10]}...' if api_key and len(api_key) > 10 else 'NOT SET')

if api_key and api_key != 'your_gemini_api_key_here':
    genai.configure(api_key=api_key)
    model = genai.GenerativeModel('gemini-2.5-flash')
    response = model.generate_content('Hello')
    print('✅ API Key works!')
    print(f'Response: {response.text[:50]}...')
else:
    print('❌ API Key not configured')
"

Test 2: Sprawdź database schema

sqlite3 nordabiz_local.db "SELECT name FROM sqlite_master WHERE type='table' AND name LIKE 'ai_%';"

Oczekiwany output:

ai_chat_conversations
ai_chat_messages
ai_api_costs

Test 3: Endpoint test (wymaga logowania)

# 1. Zaloguj się przez browser: http://localhost:5001/login
# 2. Skopiuj session cookie
# 3. Test:

curl -X POST http://localhost:5001/api/chat/start \
  -H "Content-Type: application/json" \
  -H "Cookie: session=YOUR_SESSION_COOKIE" \
  -d '{"title": "Test", "conversation_type": "general"}'

Oczekiwany output:

{
  "conversation_id": 1,
  "title": "Test",
  "created_at": "2025-11-24T13:15:00"
}

🎯 PLAN NAPRAWY

Opcja A: Minimalna (Tylko napraw API key)

Czas: 5 minut

  1. Uzyskaj Gemini API key: https://makersuite.google.com/app/apikey
  2. Edytuj .env:
    GOOGLE_GEMINI_API_KEY=AIza...twój_klucz
    
  3. Restart Flask app:
    # Znajdź PID
    ps aux | grep "python.*app.py"
    kill <PID>
    
    # Uruchom ponownie
    python3 app.py
    
  4. Test w browser: http://localhost:5001/chat

Rezultat: Chat zadziała dla zalogowanych użytkowników.


Opcja B: Pełna (Napraw + Ulepsz)

Czas: 30 minut

  1. Napraw API key (jak wyżej)

  2. 🔒 Dodaj lepszy error handling:

    # nordabiz_chat.py
    if not self.tokenizer:
        raise ValueError(
            "Gemini API not configured. "
            "Set GOOGLE_GEMINI_API_KEY in .env file"
        )
    
  3. 📊 Dodaj health check endpoint:

    # app.py
    @app.route('/api/chat/health')
    def chat_health():
        """Check if chat is operational"""
        try:
            engine = NordaBizChatEngine()
            # Test API key
            test_response = engine.gemini_service.generate_content("test")
            return jsonify({
                "status": "ok",
                "gemini_api": "configured",
                "model": "gemini-2.5-flash"
            })
        except Exception as e:
            return jsonify({
                "status": "error",
                "gemini_api": "not configured",
                "error": str(e)
            }), 500
    
  4. 🧪 Dodaj unit tests:

    # tests/test_chat.py
    def test_chat_engine_initialization():
        engine = NordaBizChatEngine()
        assert engine.model_name == "gemini-2.5-flash"
    
    def test_start_conversation():
        engine = NordaBizChatEngine()
        conv = engine.start_conversation(user_id=1)
        assert conv.id is not None
        assert conv.is_active == True
    
  5. 📝 Dodaj dokumentację użytkownika:

    • Jak używać chatu
    • Przykładowe pytania
    • Limitacje

Rezultat: Production-ready chat z monitoringiem i testami.


Opcja C: Eksperymentalna (Public access + Rate limiting)

Czas: 1-2 godziny

  1. Wszystko z Opcji B

  2. 🌐 Usuń @login_required z /chat

  3. 🛡️ Dodaj Flask-Limiter:

    pip install Flask-Limiter
    
    from flask_limiter import Limiter
    from flask_limiter.util import get_remote_address
    
    limiter = Limiter(
        app=app,
        key_func=get_remote_address,
        default_limits=["200 per day", "50 per hour"]
    )
    
    @app.route('/api/chat/start', methods=['POST'])
    @limiter.limit("10 per hour")  # Max 10 new conversations/hour
    def chat_start():
        ...
    
    @app.route('/api/chat/<int:conversation_id>/message', methods=['POST'])
    @limiter.limit("30 per minute")  # Max 30 messages/minute
    def chat_send_message(conversation_id):
        ...
    
  4. 🤖 Dodaj CAPTCHA (opcjonalnie):

    pip install Flask-ReCaptcha
    
  5. 💰 Dodaj cost monitoring & alerts:

    # Alert gdy dzienny koszt > $5
    if daily_cost > 5.0:
        send_alert_email(f"Chat cost exceeded: ${daily_cost}")
    

Rezultat: Public chat z ochroną przed abuse.


📊 AKTUALNE DANE

Database Status

sqlite3 nordabiz_local.db ".tables" | grep ai

Tabele:

  • ai_api_costs - Cost tracking
  • ai_chat_conversations - Konwersacje
  • ai_chat_messages - Wiadomości

Rozmiar plików

nordabiz_chat.py:    16,975 bytes (17 KB)
gemini_service.py:   14,635 bytes (15 KB)
templates/chat.html: 13,912 bytes (14 KB)
nordabiz_local.db:  126,976 bytes (127 KB)

🎯 REKOMENDACJA

Dla DEVELOPMENT (testowanie lokalne): → Opcja A: Minimalna

  • Szybka naprawa
  • Zadziała dla testów
  • Możesz eksperymentować

Dla STAGING (pre-production): → Opcja B: Pełna

  • Production-ready
  • Monitoring
  • Error handling
  • Tests

Dla PRODUCTION (publiczny dostęp): → Opcja C: Eksperymentalna

  • Rate limiting obowiązkowe!
  • Cost alerts obowiązkowe!
  • CAPTCHA rekomendowane

🚨 BEZPIECZEŃSTWO

Obecne zabezpieczenia:

  1. Login required - Tylko zalogowani mają dostęp
  2. Session management - Flask sessions
  3. Input validation - SQLAlchemy ORM (SQL injection protected)
  4. Cost tracking - Monitoring wydatków API

Brakuje: ⚠️

  1. Rate limiting - Brak ograniczeń liczby requestów
  2. Input sanitization - Nie ma sprawdzania długości/zawartości messages
  3. Cost limits - Brak hard limit na dzienny koszt API
  4. CAPTCHA - Brak ochrony przed botami (jeśli public)

Rekomendacja: Dla produkcji dodaj przynajmniej rate limiting!


💰 OSZACOWANIE KOSZTÓW

Model: gemini-2.5-flash

Pricing (Google, 2025):

  • Input: ~$0.10 per 1M tokens
  • Output: ~$0.40 per 1M tokens

Przykładowy koszt konwersacji:

User:      "Znajdź firmy IT w Wejherowie"     (~10 tokens)
Assistant: "Znalazłem 5 firm: ..." (detailed) (~200 tokens)

Cost: (10 * $0.10 + 200 * $0.40) / 1,000,000 = $0.000081 (~0.008 centa)

Szacunek miesięczny (dla 100 aktywnych użytkowników):

  • 100 użytkowników × 10 konwersacji/miesiąc = 1000 konwersacji
  • 1000 × 5 messages/konwersacja = 5000 messages
  • 5000 × $0.000081 = ~$0.41/miesiąc

Wniosek: Gemini jest TANI! Koszt marginalny. 🎉


NEXT STEPS

1. Natychmiast (Jeśli chcesz używać chatu):

# 1. Uzyskaj API key
open https://makersuite.google.com/app/apikey

# 2. Edytuj .env
nano .env
# Zmień: GOOGLE_GEMINI_API_KEY=twój_prawdziwy_klucz

# 3. Restart app
pkill -f "python.*app.py"
python3 app.py &

# 4. Test
open http://localhost:5001/chat

2. Długoterminowo (Jeśli planujesz produkcję):

  1. Implementuj Opcję B (pełna)
  2. Dodaj monitoring (Sentry, LogRocket)
  3. Set up alerts (email gdy koszt > threshold)
  4. Dodaj analytics (ile konwersacji, satisfaction rating)
  5. A/B testing (różne system prompts)

Analiza wykonana: 2025-11-24 13:15 Wersja dokumentu: 1.0 Status: Kompletna