didi-lot1-ai/ai_platform/local_gpu_stack/TESTING.md

9.6 KiB

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ă)

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)

# 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)

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)

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)

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)

# 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)

# 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)

# 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)

# 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.

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)

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)

# 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)

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.