LOT 1 - Optimizare script build -Instalare mono comanda

This commit is contained in:
Dezvoltari Evotech 2026-06-27 06:42:02 -07:00
parent 5380c3fc63
commit 42ff22bf85
127 changed files with 16163 additions and 532 deletions

View file

@ -0,0 +1,228 @@
# DiDi LOT 1 — Comenzi de testare per componentă
Host: **10.11.10.18**. Toate comenzile sunt `curl` copy-paste. Statusul din dreptul
fiecăreia e rezultatul verificat la ultima rulare.
> Convenție: `H=10.11.10.18`. Rulează întâi `export H=10.11.10.18`.
---
## 0. Pregătire fișiere de test (o singură dată)
```bash
export H=10.11.10.18
cd /home/topclossers/didi-lot1-ai/ai_platform/local_gpu_stack
mkdir -p test_assets
# video mic din artefacte
cp "$(find ../../artefacte_lot1/runs_deepfake -iname '*.mp4' -printf '%s\t%p\n' | sort -n | head -1 | cut -f2)" test_assets/sample.mp4
# extrage un cadru (jpg) + audio (wav) cu ffmpeg din containerul extractors
docker cp test_assets/sample.mp4 didiAI-extractors:/tmp/s.mp4
docker exec didiAI-extractors sh -c 'ffmpeg -y -i /tmp/s.mp4 -frames:v 1 /tmp/frame.jpg -vn -ar 16000 -ac 1 -t 8 /tmp/audio.wav'
docker cp didiAI-extractors:/tmp/frame.jpg test_assets/frame.jpg
docker cp didiAI-extractors:/tmp/audio.wav test_assets/audio.wav
cd test_assets # restul comenzilor presupun că ești aici pentru fișiere
```
---
## 1. LLM — Qwen3.5-35B-A3B (port 14011) ✅
```bash
# modele servite
curl -s http://$H:14011/v1/models | python3 -m json.tool
# chat completion
curl -s http://$H:14011/v1/chat/completions -H 'Content-Type: application/json' -d '{
"model":"qwen3.5",
"messages":[{"role":"user","content":"Ce este un deepfake? Raspunde scurt."}],
"max_tokens":200
}' | python3 -m json.tool
# health
curl -s http://$H:14011/health
```
> Notă: Qwen3.5 e model de **reasoning** — răspunsul conține un bloc „Thinking" înainte de
> răspunsul final. Normal.
## 2. Embeddings — bge-m3 (port 14100) ✅
```bash
curl -s http://$H:14100/v1/embeddings -H 'Content-Type: application/json' -d '{
"model":"bge-m3","input":"text de analizat"
}' | python3 -c "import sys,json;print('dim:',len(json.load(sys.stdin)['data'][0]['embedding']))"
```
> Așteptat: `dim: 1024`.
## 3. Rerank — bge-reranker-v2-m3 (port 14200) ✅
```bash
curl -s http://$H:14200/v1/rerank -H 'Content-Type: application/json' -d '{
"model":"bge-reranker-v2-m3",
"query":"detectie deepfake",
"documents":["o pisica neagra","sistem de detectie deepfake pentru video"]
}' | python3 -m json.tool
```
> Așteptat: documentul relevant primește scor mult mai mare (index 1).
## 4. Audio / Whisper — large-v3-turbo (port 54300) ✅
```bash
curl -s http://$H:54300/v1/audio/transcriptions \
-F "file=@audio.wav" -F "model=large-v3-turbo" | python3 -m json.tool
# modele / info
curl -s http://$H:54300/v1/models | python3 -m json.tool
```
> Acceptă și `.mp4` direct (ffmpeg în container). Returnează `text` + `language`.
## 5. Video / BusterX++ (deepfake) (port 54600) ✅
```bash
# verdict deepfake REAL/FAKE/UNCERTAIN
curl -s http://$H:54600/analyze/video -F "file=@sample.mp4" | python3 -m json.tool
# analiza semantica (descriere continut, foloseste si LLM-ul)
curl -s http://$H:54600/analyze/video/semantic -F "file=@sample.mp4" | python3 -m json.tool
curl -s http://$H:54600/v1/info | python3 -m json.tool
```
> Așteptat: `{"verdict":"REAL"|"FAKE"|"UNCERTAIN","frames_analyzed":16,"evidence":[...]}`.
## 6. Extractors (port 54400)
```bash
# 6a. metadata: EXIF/ELA/ffprobe/integritate/C2PA ✅
curl -s http://$H:54400/v1/metadata -F "file=@sample.mp4" | python3 -m json.tool
# 6b. NER (GLiNER, multilingv) ✅
curl -s http://$H:54400/v1/ner -H 'Content-Type: application/json' -d '{
"text":"Klaus Iohannis s-a intalnit cu Emmanuel Macron la Bucuresti."
}' | python3 -m json.tool
# 6c. detectie obiecte (YOLOv8) ✅
curl -s http://$H:54400/v1/detect -F "file=@frame.jpg" | python3 -m json.tool
# 6d. OCR (LLM vision) ✅
curl -s http://$H:54400/v1/ocr -F "file=@frame.jpg" | python3 -m json.tool
# 6e. sentiment (deleaga LLM) ✅
curl -s http://$H:54400/v1/sentiment -H 'Content-Type: application/json' -d '{
"text":"Produsul este excelent, sunt foarte multumit!"
}' | python3 -m json.tool
```
> Așteptat: `{"ok":true,"results":{"label":"pozitiv","score":0.9,"rationale":"..."}}`.
> (Gateway-ul LLM injectează `enable_thinking:false` pe vLLM → JSON curat din modelul de reasoning.)
## 7. Forensic — rPPG / lip-sync / forgery / lighting (port 8085) ✅
```bash
# module disponibile
curl -s http://$H:8085/api/forensic-modules | python3 -m json.tool
# analiza forensica (multipart; campul fisierului se numeste 'video')
curl -s http://$H:8085/api/forensic-evidence \
-F "video=@sample.mp4" -F "modules=m25,m26,m27,m28,m29" -F "every_n_frames=10" \
| python3 -m json.tool
```
> Rulează sincron implicit; returnează `modules_run`, `n_frames_extracted`, evidence per modul.
> Pentru async: adaugă `-F "async_mode=true"` → primești `job_id`, apoi
> `GET /api/status/{job_id}` și `GET /api/result/{job_id}`.
## 8. Web — căutare & fact-checking evidence (port 51100) ✅
```bash
# cautare (SearXNG + provideri); ATENTIE: campul e "queries" (lista)
curl -s http://$H:51100/v1/search -H 'Content-Type: application/json' -d '{
"queries":["deepfake detection 2024"],"max_results":5
}' | python3 -m json.tool
# fetch pagini (camp "urls" = LISTA)
curl -s http://$H:51100/v1/fetch -H 'Content-Type: application/json' -d '{
"urls":["https://en.wikipedia.org/wiki/Deepfake"]
}' | python3 -m json.tool
# gather (cautare + fetch + evidence pack); camp "claim", max_search_results >= 5
curl -s http://$H:51100/v1/gather -H 'Content-Type: application/json' -d '{
"claim":"Deepfakes can be detected by AI","max_search_results":5
}' | python3 -m json.tool
curl -s http://$H:51100/v1/info | python3 -m json.tool
```
## 9. Catalog — service discovery (port 11000, doar prin gateway/intern) ✅
`catalog-api` nu e publicat pe host; se accesează prin **gateway** (Bearer) sau din rețea.
```bash
TOK=didi-local-dev-token-123
curl -s http://$H:11000/catalog/v1/status -H "Authorization: Bearer $TOK" | python3 -m json.tool
curl -s http://$H:11000/catalog/v1/components -H "Authorization: Bearer $TOK" | python3 -m json.tool
curl -s http://$H:11000/catalog/v1/models -H "Authorization: Bearer $TOK" | python3 -m json.tool
```
## 10. Gateway — nginx reverse proxy + auth (port 11000) ✅
```bash
TOK=didi-local-dev-token-123
curl -s http://$H:11000/health # fara auth -> ok
curl -s http://$H:11000/web/v1/info -H "Authorization: Bearer $TOK" # rutare -> web
curl -s http://$H:11000/catalog/v1/status -H "Authorization: Bearer $TOK" # rutare -> catalog
curl -s http://$H:11000/web/v1/info # fara token -> 401
```
## 11. Brain — RAG + fact-checking + cache (port 8090) ✅
```bash
# cautare in baza de cunostinte (contract web; camp "queries")
curl -s http://$H:8090/v1/search -H 'Content-Type: application/json' -d '{
"queries":["deepfake"],"max_results":3
}' | python3 -m json.tool
# gather (RAG complet: search -> fetch -> evidence); camp "claim"
curl -s http://$H:8090/v1/gather -H 'Content-Type: application/json' -d '{
"claim":"Deepfakes can be detected by AI"
}' | python3 -m json.tool
# statistici atom store (folosit de dashboard "Brain — fact status")
curl -s http://$H:8090/v1/analysis_atom/stats/extended | python3 -m json.tool
curl -s http://$H:8090/health
```
> `results: []` la început e normal — baza de cunoștințe e goală până se indexează conținut.
---
## Smoke-test rapid (toate componentele, un singur script)
```bash
export H=10.11.10.18; TOK=didi-local-dev-token-123
ok(){ printf "%-26s %s\n" "$1" "$2"; }
ok "llm" "$(curl -s -m60 http://$H:14011/v1/chat/completions -H 'Content-Type: application/json' -d '{"model":"qwen3.5","messages":[{"role":"user","content":"hi"}],"max_tokens":5}' -o /dev/null -w %{http_code})"
ok "embeddings" "$(curl -s -m20 http://$H:14100/v1/embeddings -H 'Content-Type: application/json' -d '{"model":"bge-m3","input":"x"}' -o /dev/null -w %{http_code})"
ok "rerank" "$(curl -s -m20 http://$H:14200/v1/rerank -H 'Content-Type: application/json' -d '{"model":"bge-reranker-v2-m3","query":"a","documents":["a","b"]}' -o /dev/null -w %{http_code})"
ok "audio" "$(curl -s -m10 http://$H:54300/health -o /dev/null -w %{http_code})"
ok "video" "$(curl -s -m10 http://$H:54600/health -o /dev/null -w %{http_code})"
ok "extractors" "$(curl -s -m10 http://$H:54400/health -o /dev/null -w %{http_code})"
ok "forensic" "$(curl -s -m10 http://$H:8085/health -o /dev/null -w %{http_code})"
ok "web" "$(curl -s -m10 http://$H:51100/health -o /dev/null -w %{http_code})"
ok "gateway" "$(curl -s -m10 http://$H:11000/health -o /dev/null -w %{http_code})"
ok "catalog" "$(curl -s -m10 http://$H:11000/catalog/v1/status -H "Authorization: Bearer $TOK" -o /dev/null -w %{http_code})"
ok "brain" "$(curl -s -m10 http://$H:8090/health -o /dev/null -w %{http_code})"
# 200 peste tot = totul up
```
---
## Probleme rezolvate (istoric)
- **sentiment / output JSON** ✅ — gateway-ul LLM injectează acum `enable_thinking:false`
pe vLLM (`LLM_VLLM_DISABLE_THINKING`, default true), deci modelul de reasoning întoarce
JSON curat pentru sentiment/OCR/semantic/brain.
- **catalog `degraded`** ✅ — aliniat prin `CATALOG_LLM_URL/AUDIO_URL/VIDEO_URL/WEB_URL`
în compose → acum `healthy`.
- **brain taxonomy 401** ✅ — creat token atomic (`atomic-server token create`), setat
`ATOMIC_TOKEN`, seed-uită taxonomia (79 tag-uri în atomic), parolele postgres aliniate
(`infra/.env`). Scheduler-ul feed-uiește acum cu `errors=0`.
## Rămas minor (non-blocant)
- **atomic embeddings** — atomic-server logează „OpenRouter API key not configured, skipping
embedding". Atomic-server și-ar face vectori proprii prin OpenRouter; nu e nevoie — brain
folosește bge-m3 local pentru embeddings. Doar un warning în logul atomic.