12 KiB
🤖 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:
-
Frontend (
templates/chat.html):- Interfejs użytkownika
- JavaScript do komunikacji z API
- Real-time chat UI
-
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
-
Chat Engine (
nordabiz_chat.py):- Klasa
NordaBizChatEngine - Zarządzanie konwersacjami
- Integracja z bazą danych
- Cost tracking (tokeny, USD, latencja)
- Klasa
-
Gemini Service (
gemini_service.py):- Centralized API access
- Automatic cost tracking do tabeli
ai_api_costs - Model: gemini-2.5-flash
-
Database Tables:
ai_chat_conversations- Konwersacjeai_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:
- ✅ Zostaw tak (bezpieczne, kontrolowane)
- ⚠️ Usuń
@login_required(dostęp publiczny, ryzyko spam/abuse) - 🎯 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
- Uzyskaj Gemini API key: https://makersuite.google.com/app/apikey
- Edytuj
.env:GOOGLE_GEMINI_API_KEY=AIza...twój_klucz - Restart Flask app:
# Znajdź PID ps aux | grep "python.*app.py" kill <PID> # Uruchom ponownie python3 app.py - 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
-
✅ Napraw API key (jak wyżej)
-
🔒 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" ) -
📊 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 -
🧪 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 -
📝 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
-
✅ Wszystko z Opcji B
-
🌐 Usuń
@login_requiredz/chat -
🛡️ Dodaj Flask-Limiter:
pip install Flask-Limiterfrom 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): ... -
🤖 Dodaj CAPTCHA (opcjonalnie):
pip install Flask-ReCaptcha -
💰 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 trackingai_chat_conversations- Konwersacjeai_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: ✅
- ✅ Login required - Tylko zalogowani mają dostęp
- ✅ Session management - Flask sessions
- ✅ Input validation - SQLAlchemy ORM (SQL injection protected)
- ✅ Cost tracking - Monitoring wydatków API
Brakuje: ⚠️
- ❌ Rate limiting - Brak ograniczeń liczby requestów
- ❌ Input sanitization - Nie ma sprawdzania długości/zawartości messages
- ❌ Cost limits - Brak hard limit na dzienny koszt API
- ❌ 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ę):
- Implementuj Opcję B (pełna)
- Dodaj monitoring (Sentry, LogRocket)
- Set up alerts (email gdy koszt > threshold)
- Dodaj analytics (ile konwersacji, satisfaction rating)
- A/B testing (różne system prompts)
Analiza wykonana: 2025-11-24 13:15 Wersja dokumentu: 1.0 Status: ✅ Kompletna