didi-lot1-ai/README_LIVRABIL.md
EVOTECH IT SRL af0ec4a150 Arhitectură (diagrame) + imagini Docker module + contract furnizare + optimizări deploy
- docs/ARCHITECTURE.md (7 diagrame Mermaid) + architecture.html + diagrame originale (offer_diagram_1..7.png)
- artefacte_lot1/imagini_docker: imagini pre-construite pt toate cele 13 module (la zi)
- documentatie: Contract de furnizare nr.19
- optimizări deploy.sh/seed (MODELS_DIR, fix download python3); .gitignore (modele/.env/PV-uri excluse)
2026-06-29 16:23:03 +03:00

170 lines
9.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Livrabil LOT 1 — Sistem AI (DiDi / PNRR DIGI150)
Pachet de lucru pentru continuarea LOT 1 pe serverul cu **inferență GPU**. Conține
codul `ai_platform` (curățat), documentația de achiziție (caiet + ofertă) și
raportul de audit cod-vs-caiet-vs-ofertă.
> **Scop:** platforma este deja deployată și LIVE pe host-ul GPU (2x H200, 11/11
> containere healthy) prin `ai_platform/local_gpu_stack/deploy.sh`. Acest pachet
> servește pentru portabilitate (mutare pe alt host) și pentru punctele rămase
> de infra (vezi §5).
---
## 1. Structura pachetului
```
livrabil_lot1/
├── README_LIVRABIL.md ← acest fișier (handoff)
├── ai_platform/ ← codul LOT 1 (curățat: fără node_modules/.git/runs/cache)
│ ├── modules/<modul>/ ← fiecare modul: src/ tests/ deploy/ README.md API.md
│ ├── CLAUDE.md INDEX.md ← convenții + overview oficial
│ └── DEPLOYMENT.md bootstrap.sh
└── documentatie/
├── Caiet_de_sarcini.pdf
├── Propunere_tehnica.pdf / Lot1.pdf / LOT1_AI_Propunere_Tehnica.docx
└── AUDIT_LOT1.md ← audit complet pe module (citește-l pentru detalii)
```
`uv.lock` au fost excluse intenționat. Fix aplicat: Dockerfile-urile `llm-inference`
și `video-analysis` NU mai cer `uv.lock` la build (se rezolvă din `pyproject.toml`).
`node_modules` se regenerează cu `npm ci`.
---
## 2. Ce este LOT 1 — harta modulelor (logica)
Sistemul AI = servicii independente, containerizate, pe care backend-ul (LOT 2)
le consumă prin API. Fiecare modul are `deploy/deploy.sh`, `docker-compose.yml`,
`Dockerfile`, `.env.example`.
> **Stare generală: platformă LIVE pe host-ul GPU (2x H200), 11/11 containere healthy**
> (+ stack-ul izolat `domain_check`, 4 containere proprii, healthy).
> Toate cele 14 module sunt livrate și funcționale. Singurul punct cu nuanță:
> dashboard rulează în STAGING MODE (`DASHBOARD_STAGING_MODE=true`, Keycloak bypassed).
| Modul | Ce face | Stare |
|---|---|---|
| **llm-inference** | Gateway OpenAI-compatible peste 3 backend-uri (vLLM/llama.cpp/LiteLLM); rutare + fallback + metrici | 🟢 livrat |
| **extractors** *(nou)* | Feature extraction *ușor*: metadata (EXIF/ELA/spectrogramă/integritate), sentiment/OCR (deleagă LLM), NER (GLiNER), detect (YOLOv8n) | 🟢 livrat |
| **video-analysis** | Deepfake video (BusterX/vLLM), verdict REAL/FAKE/UNCERTAIN + frames + evidence | 🟢 livrat |
| **audio** | Transcriere (faster-whisper) | 🟢 livrat |
| **web** | Web crawl & evidence (Playwright, SearXNG + provideri premium) | 🟢 livrat |
| **embeddings / rerank** | bge-m3 / bge-reranker-v2-m3, OpenAI-compatible | 🟢 livrat |
| **didi_brain** | Cache rezultate (Postgres/pgvector) + RAG (Atomic) + fact-checking; consumat de backend | 🟢 livrat |
| **dashboard** | Admin UI (React+FastAPI): monitorizare AI, catalog modele DB, config, RBAC | 🟢 livrat (STAGING MODE — auth bypassed) |
| **catalog-api** | Agregator service-discovery (`/v1/info`), stateless | 🟢 livrat |
| **gateway** | Reverse-proxy nginx (config-only) — punct de intrare AI | 🟢 livrat |
| **forensic_features** | Detectoare forensice (rPPG/lip-sync/forgery heatmap/lighting) | 🟢 livrat |
| **domain_check** *(nou)* | **T4 — credibilitate sursă**: WHOIS (vârstă/registrar), SSL, blacklist (DNSBL), DNS, IP-intel, HTTP + mail-intel → `risk_score` 0100 + verdict. Flask+Celery+Postgres+Redis, izolat; consumat de backend pe `domain-check-api:11000` | 🟢 livrat |
| **cloak** | Scraper SERP stealth (tier-3 fallback pt `web`) | 🟢 livrat |
Detalii complete per cerință: **`documentatie/AUDIT_LOT1.md`**.
---
## 3. Ce s-a remediat în această iterație (rezumat)
Toate validate rulând în container (mediul de build n-are python/GPU local).
- **Extractor ML — modul nou `extractors`** (39 teste): `/v1/metadata` (EXIF, codec/bitrate via ffprobe, spectrogramă numpy, ELA, integritate/C2PA), `/v1/sentiment` + `/v1/ocr` (deleagă la gateway-ul LLM), `/v1/ner` (GLiNER, validat pe RO), `/v1/detect` (YOLOv8, validat real).
- **video-analysis** — verdict aliniat: enum `UNCERTAIN`, `frames_analyzed` + `evidence[]`; reparat bug pyproject (virgulă lipsă → modul neinstalabil). 7 teste.
- **dashboard** — *AI Monitoring* (health agregat + cozi RabbitMQ + latențe Prometheus, fail-open), *Catalog modele/extractoare DB-backed* + CRUD, *RBAC* pe suprafața de citire + warning staging. 12 teste pe Postgres. Reparat 2 bug-uri reale (audit NOT NULL, Query default).
- **llm-inference** — model `qwen3.5` + alias, `/v1/completions`, **fallback cascadă** cross-backend, **metrici Prometheus** (latență/tokens/requests). 100 teste. Pin `fastapi<0.116`.
- **domain_check — modul nou (T4, credibilitate sursă)**: microserviciu Flask+Celery cu Postgres+Redis proprii (rulează izolat), analizează un domeniu (WHOIS/SSL/blacklist/DNS/IP/HTTP/mail-intel) și întoarce `risk_score` 0100 + verdict. Expus pe `didi-network` ca `domain-check-api:11000`, consumat de agent-v3 (Lot 2) pentru scorul de credibilitate a sursei. Contract `POST /api/v1/check/check`.
- **Cache** — reclasificat: acoperit la nivel de orchestrare (didi_brain + Redis backend), nu se construiește cache nou în LOT 1.
---
## 4. Cum se validează (fără a instala nimic local) — reț. Docker
Mediul de dezvoltare n-are python/uv/ffmpeg/GPU. Tot se rulează în container:
```bash
# Teste unui modul Python (în containerul lui de build):
cd ai_platform/modules/<modul>
docker run --rm -v "$PWD":/app -w /app python:3.11-slim \
bash -c "pip install -e '.[dev]' && pytest -q"
# Module cu model greu (extractors NER/YOLO): instalează extra-ul ml
# pip install -e '.[ml]' (trage torch — imagine mai mare)
# dashboard (are nevoie de Postgres): Postgres efemer în Docker
docker run -d --name pg --network <net> -e POSTGRES_PASSWORD=test -e POSTGRES_DB=test postgres:16-alpine
docker run --rm --network <net> -v "$PWD":/app -w /app \
-e TEST_DATABASE_URL="postgresql+asyncpg://postgres:test@pg:5432/test" \
python:3.11-slim bash -c "pip install -e '.[dev]' && pytest -q"
# frontend dashboard (Vite 7 cere Node 20+):
cd ai_platform/modules/dashboard/web
docker run --rm -v "$PWD":/app -w /app node:20-slim bash -c "npm ci && npx tsc -b --noEmit"
```
---
## 5. Stare deploy + ce mai e de făcut
**Deploy livrat (single-host GPU):** `ai_platform/local_gpu_stack/deploy.sh`
orchestrează tot stack-ul „cărămidă cu cărămidă" (gated, pas cu pas, fail-fast).
Platforma rulează deja LIVE (11/11 healthy). Vezi `local_gpu_stack/README.md`.
### 5.1 Rezolvate în această iterație
- **extractors** și **forensic_features** — deployate și healthy.
- **enable_thinking** (Qwen3.5) — rezolvat (parametrul e gestionat corect în
llm-inference / video-analysis).
- **dashboard** — panourile de monitorizare (health agregat, cozi, latențe) live.
### 5.2 Configurări la mutare pe alt host (portabilitate)
- **llm-inference**: vLLM cu `--served-model-name qwen3.5`, `VLLM_MODEL=Qwen/Qwen3.5-35B-A3B`.
- **video-analysis / audio / embeddings / rerank**: setează URL-urile vLLM/model în `.env`.
- **dashboard**: `DASHBOARD_PROMETHEUS_URL`, `DASHBOARD_RABBITMQ_MGMT_URL` (+ user/parolă).
**Scoate `DASHBOARD_STAGING_MODE` în producție** pentru a activa Keycloak/RBAC
(în starea livrată dashboard rulează în STAGING MODE, cu auth bypassed).
### 5.3 Cod rămas deschis
- **llm-inference — load/unload model** (Task 4): vLLM **nu** suportă hot-swap
nativ (un model/proces). Decizie: (a) „register/route" — load = asiguri că un
backend servește modelul X; sau (b) marchezi „nesuportat de vLLM". *(singurul
punct deschis la inferență)*
- **web** (ofertă): `robots.txt`, rate-limit per-domeniu, jurnal audit persistent.
- **embeddings/rerank**: failover automat între backend-uri + teste API.
- **CI/CD**: non-root pe Dockerfile-uri rămase, rollback + publish imagini AI în registry.
### 5.4 Infra (manifeste de scris; validare reală doar cu cluster/GPU)
- **Orchestrare / scalare automată** (caiet 747-766) — k8s/Helm + HPA. *Singurul
gap mare de caiet rămas.*
- **dashboard GPU/VRAM** — exporter dcgm pe host-ul GPU + panou (se cablează ca
latențele, prin Prometheus).
- **dashboard control rute** — gateway-ul AI e nginx static; control real = view +
enable/disable prin regenerare config + reload (NU Kong, care e LOT 2).
---
## 6. Pornire rapidă
**Recomandat — stack complet single-host GPU (cărămidă cu cărămidă, gated):**
```bash
cd ai_platform/local_gpu_stack
cp .env.example .env # completează variabilele (fail-fast, fără defaults)
./deploy.sh # pornește tot stack-ul, pas cu pas
```
**Per modul (debug / dezvoltare):**
```bash
cd ai_platform/modules/<modul>/deploy
cp ../.env.example .env
./deploy.sh up # sau: docker compose up -d --build
```
Convenție porturi: `1xxxx` producție / `5xxxx` dev (vezi `ai_platform/CLAUDE.md`).
Bootstrap pentru host CPU-only (web + dashboard): `ai_platform/bootstrap.sh` + `DEPLOYMENT.md`.
---
## 7. Pointere
- **Audit complet pe cerințe** (procente, file:line, ce lipsește): `documentatie/AUDIT_LOT1.md`
- Convenții cod + porturi: `ai_platform/CLAUDE.md`
- Overview module: `ai_platform/INDEX.md`
- Fiecare modul: `README.md` + `API.md` + `INDEX.md` propriu.