12 KiB
didiCache - Index
Productia ruleaza pe Redis LOCAL (container didi-cache pe didi-network). Decizie: stabilitate + zero dependinte externe + acces rapid. Clusterul Redis RAG (managed extern, HAProxy VIP peste rag01/02/03) ramane configurat ca fallback de urgenta pentru HA — activabil cu redis-switch.sh cluster, nu este folosit operational acum.
Productie (LOCAL — activ):
- Container:
didi-cache(imagineredis:7-alpine) - Host intern Docker:
didi-cache:6379 - DB:
0 - Parola:
REDIS_PASSWORDdin.env(defaultredis123in dev) - Memorie: 512MB (eviction: allkeys-lru)
- Retea:
didi-network; portul6379este expus pe host (0.0.0.0:6379->6379) - Persistenta: RDB + AOF
Fallback HA (cluster RAG — disponibil dar inactiv):
- Host:
10.11.50.100(HAProxy VIP) - Port:
16379 - DB:
0 - User:
didi - Parola: din
.cluster-credentials.env(gitignored)
Switch intre LOCAL si cluster: backend/services/orchestration-layer/scripts/redis-switch.sh {cluster|local|status} rescrie fisierele .env ale serviciilor (agent-v3, didiFramework) + restart containere. Status curent: local.
Helper de conectare folosit de toate serviciile:
- agent-v3 ->
src/shared/redis/connection.ts(createRedisConnection()) - didiFramework ->
src/config/redis.ts(createRedisConnection())
Ce face
Stocheaza date temporare si configurari pentru platforma DIDI:
- Cache framework (parametri tehnici, verdicts, ponderi) -- scrise de didiFramework via sync-redis
- Configurare HIL Moderation (triage thresholds, brain client config, sensitive topics, roluri) -- scrise de didiFramework
- Sesiuni analiza (AnalysisSession JSON, TTL 7 zile) -- scrise de agent-v3
- Rezultate intermediare per etapa (TTL 7 zile) -- scrise de agent-v3
- Stare coada async (progres workeri) -- scrise de agent-v3
- Lock-uri concurenta workeri (TTL 30s-5min) -- scrise de agent-v3
- Chei API extensie browser (cache validare) -- scrise de didiFramework
- Configurare modele viziune -- scrise de didiFramework
Sync-redis scrie ~51 chei de configurare (crescut de la 48 dupa adaugarea cheilor HIL Moderation in 2026-05-01). Plus framework_keys: 7 chei standard sau 8 daca include providers.
Cine scrie in Redis
| Serviciu | Ce scrie | Chei Redis |
|---|---|---|
| didiFramework (sync-redis) | Ierarhie tehnici, claims, verdicts, ponderi, surse, provideri | didi:framework:* |
| didiFramework (sync-redis) | Configurare componente pe etape | didi:config:* |
| didiFramework (extension-keys) | Cache validare chei API extensie | didi:extension:key:* |
| agent-v3 (sesiuni) | Sesiune completa JSON | didi:pipeline:{sessionId}:status |
| agent-v3 (executori) | Rezultate intermediare per etapa | agent:result:{sessionId}:{component}:{stage} |
| agent-v3 (coada) | Stare procesare async | didi:queue:session:{sessionId} |
| agent-v3 (workeri) | Lock-uri concurenta | didi:queue:lock:* |
Cine citeste din Redis
| Serviciu | Ce citeste | Chei Redis |
|---|---|---|
| agent-v3 (executori) | Configurare framework (tehnici, ponderi, verdicts) | didi:framework:* |
| agent-v3 (executori) | Modele disponibile, stage assignments, prompturi | didi:config:* |
| agent-v3 (rute) | Sesiuni pentru polling status | didi:pipeline:{sessionId}:status |
| agent-v3 (rute) | Rezultate intermediare | agent:result:{sessionId}:* |
| agent-v3 (pipeline) | Validare cheie extensie | didi:extension:key:* |
| didiFramework (debug) | Verificare date sincronizate | didi:framework:* |
Chei Redis principale
| Pattern | Scop | TTL | Scris de |
|---|---|---|---|
| didi:framework:manifest | Index categorii + timestamp sync | permanent | didiFramework |
| didi:framework:techniques | Ierarhie completa tehnici (denormalizata) | permanent | didiFramework |
| didi:framework:claims | Parametri claims (tipuri, statusuri, confidence) | permanent | didiFramework |
| didi:framework:verdicts | Categorii verdict + risk mappings + severity | permanent | didiFramework |
| didi:framework:weights | Ponderi componente + scenarii + multiplicatori | permanent | didiFramework |
| didi:framework:sources | Evaluare surse | permanent | didiFramework |
| didi:framework:providers | Configurare LLM | permanent | didiFramework |
| didi:framework:dimensions_compact | Lista compacta dimensiuni (screening) | permanent | didiFramework |
| didi:config:{component}:v1:* | Config componenta (modele, etape, prompturi) | permanent | didiFramework |
| didi:config:techniques:v3:stage_assignments | TIER-NESTED {stage: {free: {models}, premium: {models}}} — chain-uri LLM per tier |
permanent | didiFramework |
| didi:config:ai-tampered:v1:stage_assignments | TIER-NESTED stage assignments AI-Tampered | permanent | didiFramework |
| didi:config:claims:v1:stage_assignments | TIER-NESTED stage assignments Claims | permanent | didiFramework |
| didi:config:source-assessment:v1:stage_assignments | TIER-NESTED stage assignments Source Assessment | permanent | didiFramework |
| didi:config:vision:v1:stage_assignments | TIER-NESTED (Etapa 4) stage image_analysis — citit de callVision() cu tier param |
permanent | didiFramework |
| didi:config:verdict:v1:stage_assignments | TIER-NESTED (Etapa 5) stage verdict_review — citit de verdict-explanation.ts loadModels(tier) |
permanent | didiFramework |
| didi:config:ai-tampered:v1:vision_models | Legacy flat vision config (fallback pentru vision.ts daca didi:config:vision:v1:stage_assignments lipseste) |
permanent | didiFramework |
| didi:config:vision:v1:prompts:extraction | Prompt viziune: extragere text din imagini | permanent | didiFramework |
| didi:config:vision:v1:prompts:video_frames | Prompt viziune: analiza cadre video | permanent | didiFramework |
| didi:config:vision:v1:prompts:ai_detection | Prompt viziune: detectie AI imagini | permanent | didiFramework |
| didi:config:pipeline:v1:component_config | Config componente pipeline + video track weights | permanent | didiFramework |
| didi:config:pipeline:v1:session_config | Config sesiune pipeline | permanent | didiFramework |
| didi:config:pipeline:v1:verdict_config | Override-uri verdict, synergy, confidence (globale). JSONB sincronizat din PG bos_parammgmt.component_config WHERE (component_code='pipeline', config_key='verdict_config'). Contine: synergy + override-uri (false_claims, severe_techniques, undisclosed_ai, untrusted_domain, domain_red_flags) + confidence + confidence_levels. Editabil din admin dashboard via /api/verdicts/runtime-config (GET/PUT/PATCH). |
permanent | didiFramework |
| didi:config:pipeline:v1:input_profiles | Profiluri verdict per input type (6 profile: ponderi, override-uri, INCONCLUSIVE) | permanent | didiFramework |
| didi:config:techniques:v3:scoring_config | Parametri scoring techniques (count_scaler, intensity, severe_threshold) | permanent | didiFramework |
| didi:config:ai-tampered:v1:scoring_config | Parametri scoring AI (blend_weights, disclosure_impact, thresholds) | permanent | didiFramework |
| didi:config:claims:v1:scoring_config | Parametri scoring claims (status_weights, unverified behavior) | permanent | didiFramework |
| didi:config:source-assessment:v1:scoring_config | Parametri scoring source (axis_weights, verdict_thresholds) | permanent | didiFramework |
| didi:config:source-assessment:v1:available_models | Modele LLM source assessment (union free+premium) | permanent | didiFramework |
| didi:config:source-assessment:v1:prompts:extraction | Prompt extractie metadata sursa | permanent | didiFramework |
| didi:config:source-assessment:v1:prompts:evaluation | Prompt evaluare sursa | permanent | didiFramework |
| didi:config:verdict:v1:available_models | Legacy fallback pentru verdict reviewer (folosit daca stage_assignments lipseste) |
permanent | didiFramework |
HIL Moderation (synced from PG by sync-redis)
Adaugat in 2026-05-01. Citit de agent-v3 in triage.ts (cache local 60s) si brain/client.ts pentru configurare live.
| Pattern | Scop | TTL | Scris de |
|---|---|---|---|
| didi:config:moderation:v1:settings | Single-row config: triage thresholds + brain client config (brain_enabled, brain_url, lookup/write timeouts, brain_confidence_min_silver, brain_semantic_threshold, brain_per_component) | permanent | didiFramework |
| didi:config:moderation:v1:sensitive_topics | Active topics list (elections, health, war, covid, climate) | permanent | didiFramework |
| didi:config:moderation:v1:roles | Keycloak role -> permissions (moderator, senior_moderator) cu toggle flags | permanent | didiFramework |
Nota structura tier-nested (aplicabila tuturor cheilor stage_assignments):
{
"techniques_screening": {
"free": { "models": [{"order":1,"model_key":"qwen35:Qwen3.5-397B-A17B",...}, ...] },
"premium": { "models": [{"order":1,"model_key":"openrouter:google/gemini-3-flash-preview",...}, ...] }
},
"techniques_deep": { "free": {...}, "premium": {...} }
}
Sync-redis scrie cheia intr-un singur SET (atomic). agent-v3 citeste cheia o singura data, apoi rezolva tier-ul local cu stages[stageCode][tier] || stages[stageCode].free.
| didi:pipeline:{sessionId}:status | Status executie pipeline (JSON: PipelineStatus) | 7 zile | agent-v3 |
| didi:pipeline:{sessionId}:{component} | Rezultat componenta (JSON: TechniquesResult etc.) | 7 zile | agent-v3 |
| didi:pipeline:{sessionId}:verdict | Rezultat verdict final (JSON: VerdictResult) | 7 zile | agent-v3 |
| didi:pipeline:history:entry:{sessionId} | Date intrare sesiune (input + metadata) | 7 zile | agent-v3 |
| didi:pipeline:history:user:{userId} | Sorted set istoric utilizator (score=timestamp) | 7 zile | agent-v3 |
| agent:result:{sessionId}:{comp}:{stage} | Rezultat intermediar etapa | 7 zile | agent-v3 |
| didi:queue:session:{sessionId} | Stare coada async | 24 ore | agent-v3 |
| didi:queue:lock:{sessionId}:{comp} | Lock worker per componenta | 5 min | agent-v3 |
| didi:queue:aggregator:{sessionId} | Lock agregator verdict | 30s | agent-v3 |
| didi:extension:key:{key} | Cache cheie API extensie | permanent | didiFramework |
Configurare
redis.conf
- Bind: 0.0.0.0 (acces din Docker network)
- Protected mode: activat
- Max memorie: 512MB
- Eviction: allkeys-lru (sterge cele mai vechi chei cand se umple)
- Persistenta RDB: snapshot la 60s/10000 keys, 300s/10 keys, 900s/1 key
- Persistenta AOF: activat, sync everysec
- Max clienti: 10000
- 16 baze de date
- Slow log: 10ms threshold
- Parola: obligatorie (requirepass)
Pornire in productie
Nota: didi-cache NU este definit in data-layer/docker-compose.yml. Containerul Redis este definit in production/docker-compose.yml (alaturi de Kong si Keycloak).
# din production/docker-compose.yml
didi-cache:
image: redis:7-alpine
command: redis-server --requirepass ${REDIS_PASSWORD} --save 60 1 --save 300 10
volumes:
- didi-cache-data:/data
networks:
- didi-network
healthcheck:
test: redis-cli -a ${REDIS_PASSWORD} ping
Nota: redis.conf din directorul didiCache nu este montat in container in productie. Containerul foloseste parametrii din command line.
Conexiune
Productie (LOCAL — activ):
- Host:
didi-cache(Docker DNS pedidi-network) - Port:
6379(expus si pe host:0.0.0.0:6379->6379) - DB:
0 - Parola:
redis123(din.env,REDIS_PASSWORD)
Fallback HA (cluster RAG — disponibil dar inactiv, doar dupa redis-switch.sh cluster):
- Host:
10.11.50.100(HAProxy VIP rag01/02/03) - Port:
16379 - DB:
0 - Username:
didi - Parola: din
.cluster-credentials.env(gitignored)
Administrare
- Conexiune directa:
redis-cli -h didi-cache -a redis123(sau127.0.0.1:6379de pe host).
Fisiere in directorul didiCache
redis.conf -- Configurare Redis completa (183 linii, nu e montata in productie)
.env.example -- Template variabile de mediu
.gitignore -- Exclude .env, data/, *.rdb, *.aof
README.md -- Documentatie
Zero cod custom. Zero module Redis. Zero scripturi. Doar configurare.
Ce NU face
- Nu e Redis Cluster (instanta singulara)
- Nu e Redis Sentinel (fara failover automat)
- Nu are module custom
- Nu are replicare
- Nu are ACL (doar autentificare cu parola)
- Nu proceseaza nimic -- doar stocheaza si serveste date scrise de alte servicii