Backend complet pentru aplicația Travel AI, dezvoltat cu FastAPI și PostgreSQL, cu integrare Gemini AI pentru chat.
- Autentificare JWT - Sistem securizat de login/register
- Chat AI - Integrare cu Google Gemini AI pentru asistență turistică
- Validări robuste - Format email, telefon românesc, username alfanumeric
- Securitate - Hash parole cu bcrypt, token-uri cu expirare
- Base de date - PostgreSQL cu SQLAlchemy ORM
- API Documentation - Swagger UI automată la
/docs
- Python 3.8+
- PostgreSQL 12+
- Google Gemini API Key
- pip (pentru instalarea dependențelor)
git clone <repository-url>
cd travel-ai-be
python -m venv venv
source venv/bin/activate # Linux/Mac
# sau
venv\Scripts\activate # Windows
pip install -r requirements.txt
# Creează baza de date PostgreSQL
sudo -u postgres psql
CREATE DATABASE travel_ai_db;
CREATE USER travel_user WITH PASSWORD 'travel_password';
GRANT ALL PRIVILEGES ON DATABASE travel_ai_db TO travel_user;
\q
Editează fișierul .env
:
DATABASE_URL=postgresql://travel_user:travel_password@localhost/travel_ai_db
SECRET_KEY=your-super-secret-key-change-in-production
ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_HOURS=24
GEMINI_API_KEY=your-gemini-api-key-here
HOST=localhost
PORT=8000
DEBUG=True
# Mod standard cu auto-reload
python start_server.py
# Mod curat fără warning-uri GUI
python start_server_clean.py
# Sau direct cu uvicorn
uvicorn app.main:app --reload --host localhost --port 8000
uvicorn app.main:app --host 0.0.0.0 --port 8000
Înregistrează un utilizator nou.
Request:
{
"full_name": "John Doe",
"email": "john@example.com",
"phone": "0712345678",
"username": "johndoe",
"age": 25,
"password": "securepassword",
"confirmPassword": "securepassword"
}
Response:
{
"message": "User registered successfully",
"user": {
"id": 1,
"full_name": "John Doe",
"email": "john@example.com",
"phone": "0712345678",
"username": "johndoe",
"age": 25,
"is_first_login": true,
"created_at": "2024-01-01T12:00:00Z",
"updated_at": "2024-01-01T12:00:00Z"
},
"token": "eyJhbGciOiJIUzI1NiIs..."
}
Autentifică un utilizator existent.
Request:
{
"identifier": "john@example.com",
"password": "securepassword"
}
Response:
{
"message": "Login successful",
"user": {
"id": 1,
"full_name": "John Doe",
"email": "john@example.com",
"phone": "0712345678",
"username": "johndoe",
"age": 25,
"is_first_login": false,
"created_at": "2024-01-01T12:00:00Z",
"updated_at": "2024-01-01T12:00:00Z"
},
"token": "eyJhbGciOiJIUzI1NiIs..."
}
Trimite un mesaj către asistentul AI pentru călătorii.
Headers:
Authorization: Bearer <your-jwt-token>
Request:
{
"message": "Ce atracții turistice îmi recomanzi în București?"
}
Response:
{
"message": "În București îți recomand să vizitezi Palatul Parlamentului, Centrul Vechi, Parcul Herăstrău, Muzeul Satului și Arcul de Triumf. Pentru o experiență completă, nu rata nici Ateneul Român și Calea Victoriei pentru shopping și cafenele."
}
- Format valid conform RFC 5322
- Unic în sistem
- Format românesc:
07xxxxxxxx
- Unic în sistem
- Minim 3 caractere
- Doar caractere alfanumerice (a-Z, 0-9)
- Unic în sistem
- Minim 6 caractere
- Hash-uită cu bcrypt
- Între 13 și 120 ani
- Minim 1 caracter, maxim 1000 caractere
travel-ai-be/
├── app/
│ ├── __init__.py
│ ├── main.py # Aplicația principală FastAPI
│ ├── database.py # Configurare PostgreSQL
│ ├── config.py # Configurare environment
│ ├── models/
│ │ ├── __init__.py
│ │ ├── user.py # Model SQLAlchemy User
│ │ └── chat.py # Model SQLAlchemy ChatMessage
│ ├── schemas/
│ │ ├── __init__.py
│ │ ├── user.py # Scheme Pydantic User
│ │ └── chat.py # Scheme Pydantic Chat
│ ├── routers/
│ │ ├── __init__.py
│ │ ├── auth.py # Rute autentificare
│ │ └── chat.py # Rute chat AI
│ └── utils/
│ ├── __init__.py
│ ├── auth.py # Utilitare JWT
│ ├── password.py # Utilitare parole
│ └── chat.py # Integrare Gemini AI
├── requirements.txt # Dependențe Python
├── start_server.py # Script pornire server (cu debug)
├── start_server_clean.py # Script pornire server (fără warning-uri)
├── .env # Variabile de mediu
├── .gitignore # Fișiere ignorate de Git
└── README.md # Documentație
Aplicația folosește Google Gemini AI pentru a oferi răspunsuri inteligente la întrebările despre călătorii. Caracteristici:
- Context specializat - Asistentul este optimizat pentru sfaturi de călătorie
- Răspunsuri concise - Limitate la 200 cuvinte pentru claritate
- Istoric conversații - Toate mesajele sunt salvate în baza de date
- Rate limiting - Gestionarea automată a limitelor API
- Obține o cheie API de la Google AI Studio
- Adaugă cheia în fișierul
.env
:GEMINI_API_KEY=your-api-key-here
- 15 cereri pe minut pentru modelul
gemini-1.5-flash
- Aplicația gestionează automat erorile de rate limiting
- Pentru utilizare intensivă, consideră upgrade la plan plătit
După pornirea serverului, accesează:
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
Register:
curl -X POST "http://localhost:8000/api/auth/register" \
-H "Content-Type: application/json" \
-d '{
"full_name": "Test User",
"email": "test@example.com",
"phone": "0712345678",
"username": "testuser",
"age": 25,
"password": "testpass",
"confirmPassword": "testpass"
}'
Login:
curl -X POST "http://localhost:8000/api/auth/login" \
-H "Content-Type: application/json" \
-d '{
"identifier": "test@example.com",
"password": "testpass"
}'
Chat (necesită token din login):
curl -X POST "http://localhost:8000/api/chat/message" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-d '{
"message": "Ce îmi recomanzi să vizitez în Cluj-Napoca?"
}'
- Verifică că PostgreSQL rulează
- Verifică credențialele din
.env
- Verifică că baza de date
travel_ai_db
există
- Asigură-te că environment-ul virtual este activat
- Rulează
pip install -r requirements.txt
- Verifică că
GEMINI_API_KEY
este setat corect în.env
- Verifică că nu ai depășit limita de 15 cereri pe minut
- Pentru erori persistente, verifică documentația oficială
- Schimbă portul în
.env
:PORT=8001
- Sau oprește procesul care folosește portul 8000
- Folosește
python start_server_clean.py
pentru a evita warning-urile - Sau setează manual variabilele de mediu:
export EDITOR=true unset DISPLAY WAYLAND_DISPLAY
- FastAPI - Framework web modern și rapid
- SQLAlchemy - ORM pentru PostgreSQL
- Pydantic - Validare și serializare date
- Uvicorn - Server ASGI
- python-jose - JWT token handling
- passlib - Hash parole cu bcrypt
- google-generativeai - Client oficial Gemini AI
- psycopg2-binary - Driver PostgreSQL
- Fork repository-ul
- Creează o ramură pentru feature:
git checkout -b feature/numele-feature
- Commit modificările:
git commit -m 'Adaugă feature nou'
- Push la ramură:
git push origin feature/numele-feature
- Deschide un Pull Request
Acest proiect este licențiat sub MIT License.
Pentru întrebări sau suport, contactează echipa de dezvoltare.