- 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)
170 lines
9.2 KiB
Markdown
170 lines
9.2 KiB
Markdown
# 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` 0–100 + 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` 0–100 + 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.
|