brief-rags-bench/PROJECT_STATUS.md

462 lines
16 KiB
Markdown
Raw Permalink Normal View History

2025-12-17 15:37:32 +01:00
# Brief Bench FastAPI - Текущий статус проекта
**Дата:** 17 декабря 2025
**Статус:** Базовая структура реализована, готова к продолжению
---
2025-12-18 09:52:02 +01:00
## Что реализовано
2025-12-17 15:37:32 +01:00
### 1. Структура проекта
```
brief-bench-fastapi/
├── app/
│ ├── api/
│ │ └── v1/
│ │ ├── __init__.py
2025-12-18 09:52:02 +01:00
│ │ └── auth.py POST /api/v1/auth/login
2025-12-17 15:37:32 +01:00
│ ├── models/
│ │ ├── __init__.py
2025-12-18 09:52:02 +01:00
│ │ ├── auth.py LoginRequest, LoginResponse, UserResponse
│ │ ├── settings.py EnvironmentSettings, UserSettings
│ │ ├── analysis.py SessionCreate, SessionResponse, SessionList
│ │ └── query.py BenchQueryRequest, BackendQueryRequest
2025-12-17 15:37:32 +01:00
│ ├── services/
│ │ ├── __init__.py
2025-12-18 09:52:02 +01:00
│ │ └── auth_service.py AuthService (login logic)
2025-12-17 15:37:32 +01:00
│ ├── interfaces/
│ │ ├── __init__.py
2025-12-18 09:52:02 +01:00
│ │ ├── base.py TgBackendInterface (ЗАГЛУШКА - нужна реализация)
│ │ └── db_api_client.py DBApiClient (методы для DB API)
2025-12-17 15:37:32 +01:00
│ ├── middleware/
│ │ └── __init__.py
│ ├── utils/
│ │ ├── __init__.py
2025-12-18 09:52:02 +01:00
│ │ └── security.py JWT encode/decode
2025-12-17 15:37:32 +01:00
│ ├── __init__.py
2025-12-18 09:52:02 +01:00
│ ├── config.py Settings из .env
│ ├── dependencies.py DI: get_db_client, get_current_user
│ └── main.py FastAPI app с CORS
├── static/ Пусто (нужно скопировать из rag-bench)
├── tests/ Полный набор тестов (unit/integration/e2e)
├── certs/ Не создана (для mTLS)
├── .env.example
├── .gitignore
├── requirements.txt
├── Dockerfile
├── docker-compose.yml
├── DB_API_CONTRACT.md Полный контракт для DB API
├── README.md
└── PROJECT_STATUS.md Этот файл
2025-12-17 15:37:32 +01:00
```
---
2025-12-18 09:52:02 +01:00
## Реализованные компоненты
2025-12-17 15:37:32 +01:00
### 1. Configuration (app/config.py)
- Загрузка из .env через pydantic-settings
- Настройки для 3 окружений RAG (IFT, PSI, PROD)
- JWT конфигурация
- DB API URL
### 2. Pydantic Models (app/models/)
**auth.py:**
- `LoginRequest` - login (8 цифр) + client_ip
- `UserResponse` - user_id, login, last_login_at, created_at
- `LoginResponse` - access_token + user
- `TokenPayload` - user_id, login, exp
**settings.py:**
- `EnvironmentSettings` - настройки для одного окружения (apiMode, bearerToken, platformUserId, etc.)
- `UserSettings` - настройки пользователя для всех 3 окружений
- `UserSettingsUpdate` - обновление настроек
**analysis.py:**
- `SessionCreate` - создание сессии анализа
- `SessionResponse` - полная сессия
- `SessionListItem` - элемент списка сессий
- `SessionList` - список с total
**query.py:**
- `QuestionRequest` - body + with_docs
- `BenchQueryRequest` - environment + questions[]
- `BackendQueryRequest` - environment + questions[] + reset_session
- `QueryResponse` - request_id, timestamp, environment, response
### 3. Interfaces (app/interfaces/)
2025-12-18 09:52:02 +01:00
**base.py (ЗАГЛУШКА!):**
2025-12-17 15:37:32 +01:00
```python
class TgBackendInterface:
def __init__(self, api_prefix: str, **kwargs)
async def get(path, params, response_model)
async def post(path, body, response_model)
async def put(path, body, response_model)
async def delete(path)
```
**Требует реализации пользователем!** Должна включать:
- httpx.AsyncClient для HTTP запросов
- Автоматическую сериализацию/десериализацию Pydantic моделей
- Error handling и retry logic
- Логирование
**db_api_client.py:**
Наследуется от TgBackendInterface, методы:
- `login_user(LoginRequest) -> UserResponse`
- `get_user_settings(user_id) -> UserSettings`
- `update_user_settings(user_id, settings) -> UserSettings`
- `save_session(user_id, session_data) -> SessionResponse`
- `get_sessions(user_id, environment, limit, offset) -> SessionList`
- `get_session(user_id, session_id) -> SessionResponse`
- `delete_session(user_id, session_id) -> dict`
### 4. Services (app/services/)
**auth_service.py:**
- `AuthService.login(login, client_ip)` - авторизация через DB API + генерация JWT
### 5. Security & Auth (app/utils/security.py)
- `create_access_token(data, expires_delta)` - создание JWT
- `decode_access_token(token)` - валидация JWT
### 6. Dependencies (app/dependencies.py)
- `get_db_client()` - DI для DBApiClient
- `get_current_user(credentials)` - middleware для auth
### 7. API Endpoints (app/api/v1/)
**auth.py:**
- `POST /api/v1/auth/login?login=12345678` - авторизация
- Возвращает JWT token + user info
- Фиксирует IP клиента
### 8. Main App (app/main.py)
- FastAPI app с CORS
- Include router для auth
- Health endpoint: GET /health
- Root endpoint: GET /
### 9. Docker (Dockerfile, docker-compose.yml)
- Multi-stage build
- Порт 8000
- Volumes: certs/ (ro), static/
- Network: brief-bench-network
### 10. Documentation
- **DB_API_CONTRACT.md** - полный контракт для DB API сервиса
- **README.md** - инструкции по запуску и разработке
- **.env.example** - пример конфигурации
---
2025-12-18 09:52:02 +01:00
## Что НЕ реализовано (TODO)
2025-12-17 15:37:32 +01:00
### 1. TgBackendInterface реализация (КРИТИЧНО!)
Файл: `app/interfaces/base.py`
Нужно реализовать:
```python
class TgBackendInterface:
def __init__(self, api_prefix: str, **kwargs):
self.api_prefix = api_prefix
self.client = httpx.AsyncClient(
timeout=kwargs.get('timeout', 30),
# ... другие настройки
)
async def get(self, path, params=None, response_model=None, **kwargs):
url = f"{self.api_prefix}{path}"
response = await self.client.get(url, params=params)
response.raise_for_status()
data = response.json()
if response_model:
return response_model(**data)
return data
# аналогично post, put, delete
```
### 2. API Endpoints для Settings
Файл: `app/api/v1/settings.py` (создать!)
```python
@router.get("/settings")
async def get_settings(user: dict = Depends(get_current_user)):
# Получить настройки пользователя из DB API
@router.put("/settings")
async def update_settings(settings: UserSettingsUpdate, user: dict = Depends(get_current_user)):
# Обновить настройки через DB API
```
### 3. API Endpoints для Query
Файл: `app/api/v1/query.py` (создать!)
```python
@router.post("/query/bench")
async def bench_query(request: BenchQueryRequest, user: dict = Depends(get_current_user)):
# Отправить batch запрос к RAG backend через RagService
@router.post("/query/backend")
async def backend_query(request: BackendQueryRequest, user: dict = Depends(get_current_user)):
# Отправить вопросы по одному через RagService
```
### 4. API Endpoints для Analysis Sessions
Файл: `app/api/v1/analysis.py` (создать!)
```python
@router.post("/analysis/sessions")
async def create_session(session: SessionCreate, user: dict = Depends(get_current_user)):
# Сохранить сессию через DB API
@router.get("/analysis/sessions")
async def get_sessions(environment: str = None, user: dict = Depends(get_current_user)):
# Получить список сессий
@router.get("/analysis/sessions/{session_id}")
async def get_session(session_id: str, user: dict = Depends(get_current_user)):
# Получить конкретную сессию
@router.delete("/analysis/sessions/{session_id}")
async def delete_session(session_id: str, user: dict = Depends(get_current_user)):
# Удалить сессию
```
### 5. RAG Service
Файл: `app/services/rag_service.py` (создать!)
```python
class RagService:
def __init__(self):
# Создать 3 httpx.AsyncClient для IFT, PSI, PROD
# Настроить mTLS из config
async def send_bench_query(self, environment: str, questions: list, user_settings: dict):
# Отправить batch запрос к RAG backend
# Headers: Request-Id, System-Id, Bearer token (из user_settings)
async def send_backend_query(self, environment: str, questions: list, user_settings: dict):
# Отправить вопросы по одному
# После каждого вопроса: reset session если resetSessionMode=true
```
### 6. Services для Settings и Analysis
Файлы:
- `app/services/settings_service.py` (создать!)
- `app/services/analysis_service.py` (создать!)
### 7. Frontend Integration
- Скопировать `index.html`, `app.js`, `styles.css` из rag-bench в `static/`
- Создать `static/api-client.js` для работы с FastAPI API
- Добавить login screen в index.html
- Обновить app.js для использования api-client.js
### 8. Middleware (опционально)
- `app/middleware/logging.py` - логирование запросов
- `app/middleware/error_handler.py` - глобальная обработка ошибок
2025-12-18 09:52:02 +01:00
### 9. Tests COMPLETED
- **Unit Tests** (119 tests, 99% coverage) - `tests/unit/`
2025-12-18 08:00:04 +01:00
- All services, models, utilities tested in isolation
- All external dependencies mocked
- Run: `.\run_unit_tests.bat`
2025-12-18 09:52:02 +01:00
- **Integration Tests** (DB API integration) - `tests/integration/`
2025-12-18 08:00:04 +01:00
- FastAPI endpoints with real DB API
- Requires DB API service running
- Run: `.\run_integration_tests.bat`
2025-12-18 09:52:02 +01:00
- **End-to-End Tests** (Full stack) - `tests/e2e/`
2025-12-18 08:00:04 +01:00
- Complete workflows: auth → query → save → retrieve
- Requires all services (FastAPI + DB API + RAG backends)
- Real network calls to RAG backends
- Run: `.\run_e2e_tests.bat`
2025-12-18 09:52:02 +01:00
- **Test Documentation** - `TESTING.md`
2025-12-18 08:00:04 +01:00
- Comprehensive testing guide
- Setup instructions for each test level
- Troubleshooting and best practices
2025-12-17 15:37:32 +01:00
---
2025-12-18 09:52:02 +01:00
## Важные детали для продолжения
2025-12-17 15:37:32 +01:00
### Архитектура авторизации
1. Пользователь отправляет POST /api/v1/auth/login?login=12345678
2. FastAPI вызывает DB API: POST /users/login
3. DB API возвращает UserResponse (user_id, login, ...)
4. FastAPI генерирует JWT token с {user_id, login, exp}
5. Возвращает {access_token, user}
6. Клиент сохраняет token в localStorage
7. Все последующие запросы: Authorization: Bearer {token}
8. Middleware get_current_user проверяет token
### Настройки пользователя
- **В .env** (не редактируются из UI): хосты RAG, порты, endpoint'ы, пути к сертификатам
- **В БД** (индивидуальны для каждого пользователя): bearerToken, systemPlatform, platformUserId, withClassify, resetSessionMode
- Каждый пользователь имеет свои настройки для 3 окружений (IFT, PSI, PROD)
### RAG Backend Integration
**Bench mode:**
```python
POST https://{IFT_RAG_HOST}:{IFT_RAG_PORT}/{IFT_RAG_ENDPOINT}
Headers:
Content-Type: application/json
Request-Id: {uuid}
System-Id: brief-bench-ift
Authorization: Bearer {user_settings.bearerToken} # если задан
System-Platform: {user_settings.systemPlatform} # если задан
Body: [
{"body": "вопрос", "with_docs": true},
...
]
```
**Backend mode:**
```python
# Для каждого вопроса:
POST https://{host}:{port}/{backendAskEndpoint}
Headers:
Platform-User-Id: {user_settings.platformUserId}
Platform-Id: {user_settings.platformId}
Authorization: Bearer {user_settings.bearerToken} # если задан
Body: {
"question": "вопрос",
"user_message_id": 1,
"user_message_datetime": "2025-12-17T12:00:00Z",
"with_classify": false
}
# Если resetSessionMode=true:
POST https://{host}:{port}/{backendResetEndpoint}
Body: {
"user_message_datetime": "2025-12-17T12:00:00Z"
}
```
### DB API Endpoints (см. DB_API_CONTRACT.md)
- POST /users/login
- GET /users/{user_id}/settings
- PUT /users/{user_id}/settings
- POST /users/{user_id}/sessions
- GET /users/{user_id}/sessions
- GET /users/{user_id}/sessions/{session_id}
- DELETE /users/{user_id}/sessions/{session_id}
---
2025-12-18 09:52:02 +01:00
## План дальнейшей работы
2025-12-17 15:37:32 +01:00
### Этап 1: Реализовать TgBackendInterface
**Приоритет:** ВЫСОКИЙ
**Файл:** app/interfaces/base.py
Без этого DB API клиент не будет работать.
### Этап 2: Добавить недостающие API endpoints
**Приоритет:** ВЫСОКИЙ
**Файлы:**
- app/api/v1/settings.py
- app/api/v1/query.py
- app/api/v1/analysis.py
Зарегистрировать в app/main.py:
```python
from app.api.v1 import auth, settings, query, analysis
app.include_router(settings.router, prefix="/api/v1")
app.include_router(query.router, prefix="/api/v1")
app.include_router(analysis.router, prefix="/api/v1")
```
### Этап 3: Реализовать RAG Service
**Приоритет:** ВЫСОКИЙ
**Файл:** app/services/rag_service.py
Нужно для query endpoints.
### Этап 4: Реализовать Settings & Analysis Services
**Приоритет:** СРЕДНИЙ
**Файлы:**
- app/services/settings_service.py
- app/services/analysis_service.py
### Этап 5: Frontend Integration
**Приоритет:** СРЕДНИЙ
- Скопировать static/ файлы из rag-bench
- Создать api-client.js
- Добавить login screen
- Обновить app.js
### Этап 6: Testing & Deployment
**Приоритет:** НИЗКИЙ
- Создать .env из .env.example
- Добавить mTLS сертификаты в certs/
- docker-compose up
- Тестирование
---
2025-12-18 09:52:02 +01:00
## Dependencies (requirements.txt)
2025-12-17 15:37:32 +01:00
```
fastapi==0.104.1
uvicorn[standard]==0.24.0
python-multipart==0.0.6
httpx==0.25.2
pydantic==2.5.0
pydantic-settings==2.1.0
python-jose[cryptography]==3.3.0
passlib[bcrypt]==1.7.4
anyio==4.1.0
python-dotenv==1.0.0
fastapi-cors==0.0.6
```
---
2025-12-18 09:52:02 +01:00
## Команды для разработки
2025-12-17 15:37:32 +01:00
```bash
# Установить зависимости
pip install -r requirements.txt
# Запустить локально
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
# Docker
docker-compose up -d
docker-compose logs -f fastapi
docker-compose down
# Проверить здоровье
curl http://localhost:8000/health
```
---
2025-12-18 09:52:02 +01:00
## Примечания
2025-12-17 15:37:32 +01:00
1. **TgBackendInterface** - это ваша реализация, которая будет использоваться во всех клиентах (DBApiClient, возможно RagClient в будущем)
2. **api_prefix** - каждый клиент инициализируется с базовым URL (например, http://db-api:8080/api/v1)
3. **Pydantic схемы** - используются везде для type-safety и валидации
4. **JWT токены** - 30-дневная экспирация, содержат user_id и login
5. **mTLS** - настраивается в .env, пути к сертификатам для каждого окружения
6. **CORS** - сейчас allow_origins=["*"], нужно настроить для production
7. **Ошибки** - возвращаются в формате FastAPI HTTPException с detail
---
2025-12-18 09:52:02 +01:00
## Готово к продолжению!
2025-12-17 15:37:32 +01:00
Вся базовая структура создана. Следующий шаг - реализация TgBackendInterface и остальных endpoints.
**Следующий чат:** начните с реализации TgBackendInterface или создания недостающих API endpoints.