feat(mapare-llm): pivot PRD 5.14 + tooling etichetare OpenRouter
PRD 5.14 rescris cu pivotul arhitectural: LLM doar etichetator OFFLINE, runtime = clasificator local fara API (fuzzy + embeddings), baza de cunostinte GOLD partajata cross-account (validarea unui service ajuta toate). Decizia 8 (corpus per-cont) SUPERSEDED. Tooling nou OpenRouter (free, familia NVIDIA Nemotron): or_common.py (client + corpus pe frecventa, cheie din .env) + or_modeltest.py (comparatie modele, acord ensemble vs Groq). Masurat: super-120b + nano-9b fiabile, 3/3 unanim pe 87% volum; ultra-550b aruncat. Corpus real (4 CSV service, coloana NR=frecventa) + etichete Groq bootstrap incluse ca date de masurare. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
13171
docs/operatii-service/operatii-service-automotive.csv
Normal file
13171
docs/operatii-service/operatii-service-automotive.csv
Normal file
File diff suppressed because it is too large
Load Diff
1669
docs/operatii-service/operatii-service-clever.csv
Normal file
1669
docs/operatii-service/operatii-service-clever.csv
Normal file
File diff suppressed because it is too large
Load Diff
3744
docs/operatii-service/operatii-service-sigma.csv
Normal file
3744
docs/operatii-service/operatii-service-sigma.csv
Normal file
File diff suppressed because it is too large
Load Diff
876
docs/operatii-service/operatii-service-south.csv
Normal file
876
docs/operatii-service/operatii-service-south.csv
Normal file
@@ -0,0 +1,876 @@
|
||||
" ";"DENOP";"NR"
|
||||
"51";"DIAGNOZA";"809"
|
||||
"160";"EFECTUAT REVIZIE PERIODICA MICA";"279"
|
||||
"159";"EFECTUAT REVIZIE PERIODICA";"214"
|
||||
"152";"EFECTUARE REVIZIE PERIODICA-MARE";"48"
|
||||
"57";"DIAGNOZA SISTEM AD-BLUE SI SCR";"36"
|
||||
"156";"EFECTUAT REVIZIE MICA";"34"
|
||||
"153";"EFECTUARE REVIZIE PERIODICA-MICA";"33"
|
||||
"625";"INLOCUIT SONDA ADBLUE";"29"
|
||||
"801";"REVIZIE ULEI + FILTRE";"28"
|
||||
"791";"REVIZIE MICA PERIODICA";"28"
|
||||
"792";"REVIZIE MICA PROGRAMATA";"27"
|
||||
"805";"SCHIMB ULEI + FILTRE";"24"
|
||||
"155";"EFECTUAT REVIZIE MARE";"24"
|
||||
"598";"INLOCUIT SENZOR NOX 1";"23"
|
||||
"769";"REPARAT SCARA SPATE STG.";"23"
|
||||
"768";"REPARAT SCARA SPATE DRT.";"23"
|
||||
"149";"DTC CONTROL";"22"
|
||||
"164";"E-PDI";"20"
|
||||
"681";"P.D.I.";"20"
|
||||
"599";"INLOCUIT SENZOR NOX 2";"18"
|
||||
"527";"INLOCUIT POMPA ADBLUE";"18"
|
||||
"789";"REVIZIE MARE PROGRAMATA";"17"
|
||||
"524";"INLOCUIT PLACUTE FRANA FATA";"17"
|
||||
"49";"DEZANSAMBLAT ARC AXA SPATE";"15"
|
||||
"168";"FSA 202322 - ECU UPDATE";"15"
|
||||
"545";"INLOCUIT PTO";"13"
|
||||
"525";"INLOCUIT PLACUTE FRANA SPATE";"13"
|
||||
"171";"FSA 202520-F3V17 BCM UPDATE";"13"
|
||||
"788";"REVIZIE MARE";"11"
|
||||
"827";"VERIFICARE FILTRU ULEI MOTOR";"11"
|
||||
"439";"INLOCUIT KIT AMBREIAJ";"11"
|
||||
"453";"INLOCUIT LAMPA GABARIT CABINA DRT.";"10"
|
||||
"794";"REVIZIE PERIODICA ISUZU";"10"
|
||||
"253";"INLOCUIT BECURI LAMPI SPATE";"10"
|
||||
"705";"REGENERARE FORTATA";"10"
|
||||
"103";"D/R CV DE PE AUTO";"9"
|
||||
"173";"FSA202511A-F3V17 UPDATE BCM";"9"
|
||||
"704";"REGENERARE";"9"
|
||||
"661";"INLOCUIT VALVA RAMPA COMBUSTIBIL";"9"
|
||||
"817";"UPDATE BCM";"9"
|
||||
"435";"INLOCUIT INJECTOR ADBLUE";"9"
|
||||
"798";"REVIZIE PROGRAMATA FILTRE + ULEI";"8"
|
||||
"835";"VERIFICARE PIERDERI ULEI MOTOR";"8"
|
||||
"31";"DEMONTAT ARC SPATE";"8"
|
||||
"151";"EFECTUARE REVIZIE PERIODICA";"8"
|
||||
"454";"INLOCUIT LAMPA GABARIT CABINA STG.";"8"
|
||||
"819";"UPDATE ECM";"7"
|
||||
"515";"INLOCUIT PLACA RELEE MARE";"7"
|
||||
"409";"INLOCUIT FOAIE DE ARC SPATE";"7"
|
||||
"410";"INLOCUIT FOAIE 1 ARC SPATE";"7"
|
||||
"70";"D/R ARC SPATE";"7"
|
||||
"440";"INLOCUIT KIT AMBREIAJ + VOLANTA";"7"
|
||||
"203";"INLOCUIT ALTERNATOR";"7"
|
||||
"441";"INLOCUIT KIT AMBREIAJ, VOLANTA + RULMENT VOLANTA";"7"
|
||||
"799";"REVIZIE PROGRAMATA TRAKKER";"6"
|
||||
"743";"REPARAT CABLAJ LAMPI SPATE";"6"
|
||||
"597";"INLOCUIT SENZOR NOX UPSTREAM DOC 1";"6"
|
||||
"218";"INLOCUIT ARC FATA FORD";"6"
|
||||
"55";"DIAGNOZA RESETARE INTERVAL";"6"
|
||||
"618";"INLOCUIT SIMERING ARBORE SPATE";"6"
|
||||
"832";"VERIFICARE MECANICA GENERALA";"5"
|
||||
"273";"INLOCUIT BUJII MOTOR";"5"
|
||||
"72";"D/R BARA FATA";"5"
|
||||
"75";"D/R BARA PROTECTIE FATA";"5"
|
||||
"543";"INLOCUIT PROIECTOR LUCRU DRT.";"5"
|
||||
"752";"REPARAT CV LA BANC";"5"
|
||||
"455";"INLOCUIT LAMPA LATERALA GABARIT";"5"
|
||||
"186";"INDREPTAT SUPORTI + MONTAT ARIPA DRT. PUNTE MOTRICA";"5"
|
||||
"170";"FSA 202511A - F3V17 BCMUPDATE";"5"
|
||||
"464";"INLOCUIT LAMPA SPATE STG";"5"
|
||||
"800";"REVIZIE PROGRAMATA ULEI + FILTRE";"5"
|
||||
"634";"INLOCUIT SUPAPA RETUR POMPA ADBLUE";"5"
|
||||
"330";"INLOCUIT CONDUCTA A/C";"5"
|
||||
"178";"GOLIT REZERVOR COMBUSTIBIL";"4"
|
||||
"862";"VERIFICAT SI INCARCAT INSTALATIE CU A/C";"4"
|
||||
"100";"D/R CUTIE DE VITEZE";"4"
|
||||
"234";"INLOCUIT BASCULA DR FATA";"4"
|
||||
"169";"FSA 202413";"4"
|
||||
"588";"INLOCUIT SENZOR ABS SPATE DR";"4"
|
||||
"611";"INLOCUIT SENZORI PLACUTE FATA";"4"
|
||||
"462";"INLOCUIT LAMPA SPATE DR";"4"
|
||||
"839";"VERIFICARE SI INCARCARE INSTALATIE A/C";"4"
|
||||
"375";"INLOCUIT DISCURI FRINA SPATE";"4"
|
||||
"607";"INLOCUIT SENZOR TEMPERATURA CATALIZATOR";"4"
|
||||
"829";"VERIFICARE INSTALATIE A/C + INCARCARE CU FREON";"4"
|
||||
"828";"VERIFICARE GENERALA";"4"
|
||||
"552";"INLOCUIT RADIATOR RACIRE MOTOR";"4"
|
||||
"25";"CURATAT REZERVOR ADBLUE";"4"
|
||||
"402";"INLOCUIT FILTRU EPURATOR";"4"
|
||||
"857";"VERIFICAT INSTALATIE AC + INCARCAT FREON";"4"
|
||||
"654";"INLOCUIT TURBOSUFLANTA";"4"
|
||||
"683";"PIAGGIO SCHIMB ULEI + FILTRE";"4"
|
||||
"821";"UPDATE TAQ 766187";"4"
|
||||
"78";"D/R BORD AUTO";"4"
|
||||
"530";"INLOCUIT POMPA APA";"4"
|
||||
"813";"TELESERVICII PENTRU LIMITARE";"4"
|
||||
"617";"INLOCUIT SIMERING ARBORE FATA";"4"
|
||||
"824";"VERIF SI INCARCAT AC";"4"
|
||||
"71";"D/R ARIPA FATA STG";"4"
|
||||
"595";"INLOCUIT SENZOR NOX DUPA DPF (ULTIMUL)";"3"
|
||||
"495";"INLOCUIT OGLINDA PIETON";"3"
|
||||
"139";"D/R ROTI AXA 2FATA STG/DR";"3"
|
||||
"521";"INLOCUIT PLACUTE FRANA";"3"
|
||||
"756";"REPARAT INSTALATIE ELECTRICA LAMPI SPATE";"3"
|
||||
"501";"INLOCUIT ORNAMENT ARIPA FATA";"3"
|
||||
"468";"INLOCUIT LEVIER COMANDA + CAPETE DE BARA TRANSV";"3"
|
||||
"549";"INLOCUIT RADIATOR AEROTERMA";"3"
|
||||
"467";"INLOCUIT LAMPI SPATE";"3"
|
||||
"596";"INLOCUIT SENZOR NOX INAINTE DE DPF";"3"
|
||||
"179";"GRESAT";"3"
|
||||
"489";"INLOCUIT OCHELAR PROIECTOR DRT.";"3"
|
||||
"478";"INLOCUIT MANETA SCHIMBATOR VITEZE";"3"
|
||||
"484";"INLOCUIT MONITOR + CAMERA";"3"
|
||||
"673";"MATERIALE ELECTRICE";"3"
|
||||
"290";"INLOCUIT CAMERA SPATE";"3"
|
||||
"575";"INLOCUIT RULMENTI INTERMEDIARI CARDAN";"3"
|
||||
"573";"INLOCUIT RULMENTI AXA SPATE";"3"
|
||||
"698";"REFACUT CABLAJ ELECTRIC USA STG";"3"
|
||||
"675";"MONTAT ARC AXA SPATE";"3"
|
||||
"581";"INLOCUIT SABOTI FRANA MANA";"3"
|
||||
"331";"INLOCUIT CONDUCTA AC";"3"
|
||||
"343";"INLOCUIT CONTACT PEDALA FRANA";"3"
|
||||
"670";"MANOPERA";"3"
|
||||
"666";"INLOCUIT VOLANTA MOTOR";"3"
|
||||
"662";"INLOCUIT VAS EXPANSIUNE";"3"
|
||||
"741";"REPARAT CABLAJ ELECTRIC LA SENZORUL DE PLACUTE STG FATA";"3"
|
||||
"610";"INLOCUIT SENZORI NOX 1 SI 2";"3"
|
||||
"394";"INLOCUIT FILTRU ADBLUE";"3"
|
||||
"184";"INCARCAT INST A/C + VERIFICAT";"3"
|
||||
"187";"INDREPTAT SUPORTI + MONTAT ARIPA STG. PUNTE MOTRICA";"3"
|
||||
"373";"INLOCUIT DISCURI FRANA STG + DR SPATE";"3"
|
||||
"715";"REMEDIAT CABLAJ PANOU COMANDA SUPRASTRUCTURA";"3"
|
||||
"710";"REGLAT FARURUI";"3"
|
||||
"249";"INLOCUIT BECURI";"3"
|
||||
"222";"INLOCUIT ARIPA + ORNAMENT DRT. PUNTE FATA";"3"
|
||||
"233";"INLOCUIT BARA FATA STG";"3"
|
||||
"235";"INLOCUIT BASCULA INFERIOARA FATA STG";"3"
|
||||
"132";"D/R REZERVOR COMBUSTIBIL";"3"
|
||||
"131";"D/R REZERVOR ADBLUE";"3"
|
||||
"779";"REPARATII ELECTRICE";"3"
|
||||
"822";"UPDATE TAS 766161";"3"
|
||||
"101";"D/R CUTIE VITEZA SI INLOCUIT BOLT SELECTOR";"3"
|
||||
"4";"AERISIT INSTALATIE RACIRE";"3"
|
||||
"122";"D/R MOTOR SI ACCESORII MOTOR";"3"
|
||||
"87";"D/R CARDAN";"3"
|
||||
"806";"SERVICE SCHIMB ULEI";"3"
|
||||
"107";"D/R FATA DE USA STANGA";"3"
|
||||
"16";"CURATAT INSTALATIE ALIMENTARE COMBUSTIBIL";"3"
|
||||
"796";"REVIZIE PERIODICA OTOKAR";"3"
|
||||
"288";"INLOCUIT CABLURI TIMONERIE";"2"
|
||||
"560";"INLOCUIT ROLA AC+CUREA";"2"
|
||||
"264";"INLOCUIT BUCSI BARA TORSIUINE FATA STG";"2"
|
||||
"443";"INLOCUIT KIT CUREA DISTRIBUTIE";"2"
|
||||
"699";"REFACUT CABLAJ LAMPA SPATE STG";"2"
|
||||
"671";"MANOPERA ADITIONALA";"2"
|
||||
"424";"INLOCUIT GARNITURI DPF";"2"
|
||||
"433";"INLOCUIT IMPULSOR CV";"2"
|
||||
"83";"D/R CAPAC OGLINDA INF STG";"2"
|
||||
"569";"INLOCUIT RULMENT ROATA FATA STG";"2"
|
||||
"267";"INLOCUIT BUCSI CABINA FATA";"2"
|
||||
"562";"INLOCUIT ROLE + CUREA";"2"
|
||||
"434";"INLOCUIT INJECTOARE";"2"
|
||||
"81";"D/R CADRU FATA AUTO";"2"
|
||||
"456";"INLOCUIT LAMPA NR DR";"2"
|
||||
"457";"INLOCUIT LAMPA NR STG";"2"
|
||||
"714";"REMEDIAT CABLAJ ELECTRIC LAMPI SPATE";"2"
|
||||
"859";"VERIFICAT INSTALATIE COMPACTARE";"2"
|
||||
"713";"REMEDIAT CABLAJ ELECTRIC";"2"
|
||||
"863";"VERIFICAT SI REPARAT INSTALATIE GIDRAULICA SUPRASTRUCTURA";"2"
|
||||
"723";"REMEDIAT PIERDERI AER PE INSTALATIA DE FRANARE";"2"
|
||||
"861";"VERIFICAT INSTALATIE ELECTRICA SISTEM EVACUARE";"2"
|
||||
"803";"REVIZIE 40 000KM";"2"
|
||||
"550";"INLOCUIT RADIATOR APA";"2"
|
||||
"858";"VERIFICAT INSTALATIE ALIMENTARE CU AD-BLUE";"2"
|
||||
"447";"INLOCUIT KIT SINCROANE REDUCTOR CV";"2"
|
||||
"448";"INLOCUIT KIT SINCROANE VIT. 1- 2";"2"
|
||||
"558";"INLOCUIT REZERVOR COMBUSTIBIL";"2"
|
||||
"255";"INLOCUIT BOLTURI ETRIER SPATE";"2"
|
||||
"444";"INLOCUIT KIT DISTRIBUTIE + POMPA DE APA";"2"
|
||||
"856";"VERIFICAT INSTALATIE A/C";"2"
|
||||
"808";"SERVICII VOPSITORIE";"2"
|
||||
"554";"INLOCUIT REGULATOR PRESIUNE AER";"2"
|
||||
"90";"D/R CHIULASA + GARNITURA";"2"
|
||||
"450";"INLOCUIT LAMPA CABINA STG";"2"
|
||||
"291";"INLOCUIT CAMERA VIDEO";"2"
|
||||
"345";"INLOCUIT CRABOTI SELECTOR CV";"2"
|
||||
"344";"INLOCUIT CONTACTOR PEDALA FRANA";"2"
|
||||
"346";"INLOCUIT CRUCE CARDAN";"2"
|
||||
"627";"INLOCUIT SONDA LITROMETRICA";"2"
|
||||
"605";"INLOCUIT SENZOR PTO";"2"
|
||||
"338";"INLOCUIT CONDUCTA RACIRE Y";"2"
|
||||
"600";"INLOCUIT SENZOR PLACUTE";"2"
|
||||
"601";"INLOCUIT SENZOR PM";"2"
|
||||
"342";"INLOCUIT CONDUCTE RACIRE";"2"
|
||||
"602";"INLOCUIT SENZOR PRESIUNE";"2"
|
||||
"358";"INLOCUIT CUZINETI ARBORE COTIT";"2"
|
||||
"372";"INLOCUIT DISCURI FRANA FATA";"2"
|
||||
"360";"INLOCUIT CUZINETI BIELE";"2"
|
||||
"368";"INLOCUIT DISCURI + ROTI AXA SPATE";"2"
|
||||
"369";"INLOCUIT DISCURI + SET PLACUTE FRANA SPATE";"2"
|
||||
"44";"DEMONTAT/MONTAT CV";"2"
|
||||
"58";"DIAGNOZA SISTEM SCR";"2"
|
||||
"623";"INLOCUIT SIMERING SI INEL RT/SP/DR";"2"
|
||||
"374";"INLOCUIT DISCURI FRINA FATA";"2"
|
||||
"376";"INLOCUIT DISCURI SI PLACUTE FRANA FATA";"2"
|
||||
"633";"INLOCUIT SUPAPA MODUL ADBLUE";"2"
|
||||
"303";"INLOCUIT CAPETE TIRANTI";"2"
|
||||
"664";"INLOCUIT VASCOCUPLAJ VENTILATOR";"2"
|
||||
"658";"INLOCUIT ULEI MOTOR + FILTRU";"2"
|
||||
"651";"INLOCUIT TERMOSTATE SISTEM DE RACIRE";"2"
|
||||
"407";"INLOCUIT FILTRU ULEI HIDRAULIC";"2"
|
||||
"294";"INLOCUIT CAP BARA DR";"2"
|
||||
"77";"D/R BARA TORSIUNE STG";"2"
|
||||
"295";"INLOCUIT CAP BARA STG";"2"
|
||||
"665";"INLOCUIT VENTILATOR AEROTERMA";"2"
|
||||
"76";"D/R BARA TORSIUNE DR";"2"
|
||||
"594";"INLOCUIT SENZOR NIVEL LICHID RACIRE OTOKAR";"2"
|
||||
"325";"INLOCUIT COMPRESOR AC";"2"
|
||||
"390";"INLOCUIT FAR FAZA SCURTA STG.";"2"
|
||||
"332";"INLOCUIT CONDUCTA CU SENZOR INCALZIRE ADBLUE";"2"
|
||||
"39";"DEMONTAT SCAUN SOFER SI INLOCUIT PERNA SEZUT";"2"
|
||||
"399";"INLOCUIT FILTRU DE PARTICULE";"2"
|
||||
"403";"INLOCUIT FILTRU HIDRAULIC";"2"
|
||||
"397";"INLOCUIT FILTRU COMBUSTIBIL";"2"
|
||||
"591";"INLOCUIT SENZOR FILTRU COMBUSTIBIL + FILTRU";"2"
|
||||
"396";"INLOCUIT FILTRU AER";"2"
|
||||
"158";"EFECTUAT REVIZIE M2";"2"
|
||||
"194";"INLOCUIRE GARNITURA CULBUTORI";"2"
|
||||
"748";"REPARAT CABLAJ SUPRASTRUCTURA";"2"
|
||||
"127";"D/R PRAG USA DR";"2"
|
||||
"165";"FACTURA TRACTARE ANB0093/07.04.2026";"2"
|
||||
"502";"INLOCUIT ORNAMENT ARIPA STG. PUNTE FATA";"2"
|
||||
"534";"INLOCUIT POMPA DE ULEI";"2"
|
||||
"157";"EFECTUAT REVIZIE MOTOR AUXILIAR";"2"
|
||||
"129";"D/R RADIATOARE + CONDENSOARE";"2"
|
||||
"507";"INLOCUIT PINION VIT 1";"2"
|
||||
"104";"D/R DIFERENTIAL AXA SPATE";"2"
|
||||
"536";"INLOCUIT POMPA ULEI";"2"
|
||||
"868";"VF. + INLOCUIT MONITOR";"2"
|
||||
"746";"REPARAT CABLAJ SENZORI PLACUTE FRANA";"2"
|
||||
"745";"REPARAT CABLAJ MOTOR";"2"
|
||||
"167";"FSA 202415B1";"2"
|
||||
"172";"FSA202420-INLOCUIT FLANSA + BOLT CARDAN";"2"
|
||||
"8";"COMPLETARE FREON + VERIFICARE INST A/C";"2"
|
||||
"786";"REVIZIE EO-MPE00000";"2"
|
||||
"870";"VF. SI INCARCAT SISTEM AC CU FREON";"2"
|
||||
"176";"GOLIT INSTALATIE RACIRE MOT.";"2"
|
||||
"174";"GOLIT INSTALATIE A/C";"2"
|
||||
"121";"D/R MOTOR DE PE AUTO";"2"
|
||||
"757";"REPARAT INSTALATIE ELECTRICA SUPRASTRUCTURA";"2"
|
||||
"784";"REVIZIE ULEI + FILTRE";"2"
|
||||
"797";"REVIZIE PERIODICA ULEI SI FILTRE";"2"
|
||||
"869";"VF. + REMEDIAT I.E. ILUMINAT EXTERIOR";"2"
|
||||
"490";"INLOCUIT OCHELAR PROIECTOR STG.";"2"
|
||||
"492";"INLOCUIT OGLINDA BORDURA";"2"
|
||||
"499";"INLOCUIT OGLINDA STG ELECTRICA";"2"
|
||||
"531";"INLOCUIT POMPA APA MOTOR";"2"
|
||||
"224";"INLOCUIT ARIPA FATA STG";"2"
|
||||
"219";"INLOCUIT ARC SPATE";"2"
|
||||
"475";"INLOCUIT MACARA STG";"2"
|
||||
"512";"INLOCUIT PIVOTI INF + SUP (AMBELE PARTI)";"2"
|
||||
"466";"INLOCUIT LAMPI LATERALE GABARIT";"2"
|
||||
"514";"INLOCUIT PLACA RELEE";"2"
|
||||
"14";"CURATAT INSTALATIA ADMISIE";"2"
|
||||
"138";"D/R ROTI AXA FATA STG/DR";"2"
|
||||
"469";"INLOCUIT LEVIER DE COMANDA";"2"
|
||||
"98";"D/R CONDUCTE COMBUSTIBIL PARTIAL";"2"
|
||||
"771";"REPARAT TOBA FINALA";"2"
|
||||
"519";"INLOCUIT PLACUTE FR FATA";"2"
|
||||
"133";"D/R RIGIDIZARE TREAPTA STG";"2"
|
||||
"520";"INLOCUIT PLACUTE FR FATA + SPATE";"2"
|
||||
"729";"REMEDIAT PIERDERI ULEI CILINDRU COMPACTARE STG.";"2"
|
||||
"776";"REPARATIE GRUP DIFERENTIAL";"2"
|
||||
"510";"INLOCUIT PIVOTI AXA FATA";"2"
|
||||
"511";"INLOCUIT PIVOTI FATA STG + DR";"2"
|
||||
"99";"D/R CUTIE DE VITEZA AUTO";"2"
|
||||
"217";"INLOCUIT ARBORE MOTOR";"2"
|
||||
"206";"INLOCUIT AMORTIZOARE AXA FATA";"2"
|
||||
"609";"INLOCUIT SENZOR ULEI MOTOR";"1"
|
||||
"517";"INLOCUIT PLACUTE AXA FATA";"1"
|
||||
"586";"INLOCUIT SENZOR ABS DR SPATE";"1"
|
||||
"587";"INLOCUIT SENZOR ABS FATA DR";"1"
|
||||
"834";"VERIFICARE PIERDERI ULEI";"1"
|
||||
"526";"INLOCUIT PLACUTE FRINA";"1"
|
||||
"846";"VERIFICARI ELECTRICE SI UDT";"1"
|
||||
"836";"VERIFICARE PRESIUNE INSTALATIE ADBLUE";"1"
|
||||
"590";"INLOCUIT SENZOR AXA CAME";"1"
|
||||
"845";"VERIFICARE ULEI GRUP DIFERENTIAL";"1"
|
||||
"589";"INLOCUIT SENZOR AMONIAC";"1"
|
||||
"518";"INLOCUIT PLACUTE AXA SPATE";"1"
|
||||
"522";"INLOCUIT PLACUTE FRANA + AERISIT";"1"
|
||||
"523";"INLOCUIT PLACUTE FRANA AXA FATA";"1"
|
||||
"841";"VERIFICARE SISTEM ALIMENTARE";"1"
|
||||
"840";"VERIFICARE SISTEM A/C";"1"
|
||||
"604";"INLOCUIT SENZOR PRESIUNE ULEI";"1"
|
||||
"874";"VOPSIT PRIZA AER STG";"1"
|
||||
"606";"INLOCUIT SENZOR STANGA FATA";"1"
|
||||
"838";"VERIFICARE SERVODIRECTIE";"1"
|
||||
"603";"INLOCUIT SENZOR PRESIUNE DIFERENTIALA";"1"
|
||||
"593";"INLOCUIT SENZOR LIFT PUBELE";"1"
|
||||
"872";"VOPSIT BARA FATA STG";"1"
|
||||
"592";"INLOCUIT SENZOR LICHID DE RACIRE";"1"
|
||||
"844";"VERIFICARE ULEI CV";"1"
|
||||
"608";"INLOCUIT SENZOR ULEI";"1"
|
||||
"837";"VERIFICARE SENZORI UZURA SI ABS";"1"
|
||||
"842";"VERIFICARE SISTEM ELECTRIC AD-BLUE";"1"
|
||||
"873";"VOPSIT CAPOTA MOTOR";"1"
|
||||
"875";"VOPSITORIE + MATERIALE VOPSITORIE";"1"
|
||||
"843";"VERIFICARE SISTEM FRANARE";"1"
|
||||
"585";"INLOCUIT SENZOR + CABLAJ NOX";"1"
|
||||
"539";"INLOCUIT PRESOSTAT";"1"
|
||||
"538";"INLOCUIT POMPITA STERGATOR";"1"
|
||||
"537";"INLOCUIT POMPITA SPALATOR PARBRIZ";"1"
|
||||
"867";"VERIFICAT UZURA CILINDRI SI BLOC MOTOR";"1"
|
||||
"557";"INLOCUIT RELEU BUJII";"1"
|
||||
"540";"INLOCUIT PREZOANE ROATA DR";"1"
|
||||
"559";"INLOCUIT REZISTENTA AEROTERMA";"1"
|
||||
"561";"INLOCUIT ROLA GHIDARE + CUREA TRANSMISIE";"1"
|
||||
"852";"VERIFICAT INCARCARE ALTERNATOR";"1"
|
||||
"563";"INLOCUIT RULMENT AMBREIAJ";"1"
|
||||
"855";"VERIFICAT INSTALATI ELECTRICA A/C";"1"
|
||||
"854";"VERIFICAT INJECTOARE";"1"
|
||||
"853";"VERIFICAT/ INCARCAT INSTALATIE A/C";"1"
|
||||
"541";"INLOCUIT PROIECTOARE";"1"
|
||||
"860";"VERIFICAT INSTALATIE ELECTRICA SI INLOCUIT BUTON AVARIE";"1"
|
||||
"553";"INLOCUIT RAMA PROIECTOR + BEC";"1"
|
||||
"547";"INLOCUIT RACORD RACIRE EGR";"1"
|
||||
"548";"INLOCUIT RADIATOR A/C";"1"
|
||||
"864";"VERIFICAT SISTEM ALIMENTARE";"1"
|
||||
"551";"INLOCUIT RADIATOR RACIRE";"1"
|
||||
"546";"INLOCUIT RACORD FLEXIBIL EVACUARE";"1"
|
||||
"555";"INLOCUIT REGULATOR PRESIUNE COMBUSTIBIL";"1"
|
||||
"556";"INLOCUIT RELEE - 2 BUC";"1"
|
||||
"542";"INLOCUIT PROIECTOR CEATA STG.";"1"
|
||||
"865";"VERIFICAT SISTEM EVACUARE";"1"
|
||||
"544";"INLOCUIT PROTECTII FOAIE DE ARC TRANSVERSALA";"1"
|
||||
"866";"VERIFICAT SISTEM FRANARE";"1"
|
||||
"564";"INLOCUIT RULMENT AXA SPATE";"1"
|
||||
"580";"INLOCUIT SABOTI AXA SPATE";"1"
|
||||
"529";"INLOCUIT POMPA AMOR";"1"
|
||||
"849";"VERIFICAT BUJII + APRINDERE";"1"
|
||||
"577";"INLOCUIT RULMENTI ROTI SPATE";"1"
|
||||
"578";"INLOCUIT RULMRNT PRESIUNE AMBREIAJ";"1"
|
||||
"579";"INLOCUIT RULMRNT PRIZA CV";"1"
|
||||
"582";"INLOCUIT SABOTI SPATE";"1"
|
||||
"847";"VERIFICAT + AERISIT SIST FRANARE";"1"
|
||||
"871";"VF. SI REMEDIAT CABLAJ ELECTROMOTOR";"1"
|
||||
"584";"INLOCUIT SEMNALIZARE DR PE OGLINDA";"1"
|
||||
"528";"INLOCUIT POMPA AMBREIAJ";"1"
|
||||
"583";"INLOCUIT SELECTOR VITEZE";"1"
|
||||
"848";"VERIFICAT ADMISIE AER";"1"
|
||||
"576";"INLOCUIT RULMENTI ROTI FATA AMBELE PARTI";"1"
|
||||
"568";"INLOCUIT RULMENT ROATA FATA DR";"1"
|
||||
"535";"INLOCUIT POMPA INALTA PRESIUNE";"1"
|
||||
"570";"INLOCUIT RULMENT ROATA SPATE";"1"
|
||||
"565";"INLOCUIT RULMENT BUTUC DR. SPATE";"1"
|
||||
"566";"INLOCUIT RULMENT DIFERENTIAL";"1"
|
||||
"567";"INLOCUIT RULMENT GRUP DIF.";"1"
|
||||
"533";"INLOCUIT POMPA DE AMORSARE INST DE COMBUSTIBIL";"1"
|
||||
"574";"INLOCUIT RULMENTI FATA (AMBELE PARTI)";"1"
|
||||
"850";"VERIFICAT CABLAJ ELECTRIC";"1"
|
||||
"532";"INLOCUIT POMPA DE AMBREIAJ";"1"
|
||||
"571";"INLOCUIT RULMENT VOLANTA";"1"
|
||||
"572";"INLOCUIT RULMENTI AXA FATA";"1"
|
||||
"851";"VERIFICAT CONCENTRATIE + COMPLETAT ANTIGEL";"1"
|
||||
"726";"REMEDIAT PIERDERI DE AER PE SISTEMUL DE FRANARE";"1"
|
||||
"725";"REMEDIAT PIERDERI APA LA INSTALATIA DE SPALAT";"1"
|
||||
"728";"REMEDIAT PIERDERI ULEI CILINDRU ACTIONARE LIFT STG.";"1"
|
||||
"727";"REMEDIAT PIERDERI DE ULEI MOTOR";"1"
|
||||
"724";"REMEDIAT PIERDERI ANTIGEL";"1"
|
||||
"720";"REMEDIAT INSTALATIE ELECTRICA";"1"
|
||||
"719";"REMEDIAT FCT. PROIECTOARE SPATE";"1"
|
||||
"722";"REMEDIAT LUMINI MI";"1"
|
||||
"721";"REMEDIAT INTRERUPERI CABLAJ MOTOR";"1"
|
||||
"736";"REPARAT ARIPA SPATE STG";"1"
|
||||
"735";"REPARAT ARC DR FATA";"1"
|
||||
"738";"REPARAT BARA STG. FATA";"1"
|
||||
"737";"REPARAT BARA DRT. FATA";"1"
|
||||
"734";"REMEDIERE PRINDERE COMP AC";"1"
|
||||
"731";"REMEDIAT PRINDERE COLIER TURBOSUFLANTA";"1"
|
||||
"730";"REMEDIAT PIULITA GRUP DIFERENTIAL";"1"
|
||||
"733";"REMEDIAT PRINDERI CONDUCTA A/C";"1"
|
||||
"732";"REMEDIAT PRINDERI ACTIONARE LIFT SUPERIOARE STG. + DRT.";"1"
|
||||
"718";"REMEDIAT DEFECTIUNI PORNIRE";"1"
|
||||
"810";"SPALAT MOTOR CU SOLUTIE";"1"
|
||||
"703";"REFACUT SUPORT TABLOU SIGURANTE";"1"
|
||||
"706";"REGLARE FARURI";"1"
|
||||
"809";"SPALAT INSTALATIE ALIMENTARE AD-BLUE";"1"
|
||||
"702";"REFACUT INSTALATIE ELECTRICA SUPRASTRUCTURA";"1"
|
||||
"700";"REFACUT CABLAJ SENZOR PLACUTE SPATE";"1"
|
||||
"697";"REFACTURARE CURATARE DPF";"1"
|
||||
"811";"TELESERVICII";"1"
|
||||
"701";"REFACUT CABLAJ TABLOU CMD. HYDRO-MAK";"1"
|
||||
"716";"REMEDIAT CABLAJ SENZOR MARSARIER";"1"
|
||||
"807";"SERVICII TERTI FACTURA 30/14.02.2025 REPARATIE INJECTOARE";"1"
|
||||
"804";"REVOPSIT USA STG FATA";"1"
|
||||
"717";"REMEDIAT CONDUCTA EVACURE";"1"
|
||||
"712";"REGLAT VOLAN";"1"
|
||||
"708";"REGLAT CULBUTORI";"1"
|
||||
"707";"REGLAT CABLURI FRANA";"1"
|
||||
"711";"REGLAT FRANA MANA";"1"
|
||||
"709";"REGLAT FARURI";"1"
|
||||
"739";"REPARAT CABLAJ LAMPA SPATE";"1"
|
||||
"782";"RESOFTARE";"1"
|
||||
"765";"REPARAT PARABICICLISTI DR";"1"
|
||||
"766";"REPARAT PRINDERE GIROFAR FATA";"1"
|
||||
"781";"RESETAT INTERVAL REVIZIE";"1"
|
||||
"764";"REPARAT PANOU COMANDA COMPACTOR";"1"
|
||||
"762";"REPARAT MUFE ELECTRICE BOBINE";"1"
|
||||
"785";"REVIZIE DIFERENTIAL";"1"
|
||||
"763";"REPARAT ORNAMENT TOBA";"1"
|
||||
"783";"REV 20000";"1"
|
||||
"774";"REPARATIE BOLT SUPRASTRUCTURA COMPACTARE";"1"
|
||||
"773";"REPARAT USA STG FATA";"1"
|
||||
"777";"REPARATIE LONJERON STG";"1"
|
||||
"775";"REPARATIE CABLAJ ELECTRIC";"1"
|
||||
"772";"REPARAT TRAVERSA SPATE SASIU";"1"
|
||||
"780";"REPROGRAMARE BODY COMPUTER";"1"
|
||||
"767";"REPARAT SCARA DREAPTA";"1"
|
||||
"770";"REPARAT SISTEM EVACUARE";"1"
|
||||
"778";"REPARATIE LUMINI LAMPI SPATE";"1"
|
||||
"761";"REPARAT MUFA ELECTRICA PE CABLAJ NOX";"1"
|
||||
"750";"REPARAT CONDUCTA SISTEM PNEUMATIC SPATE";"1"
|
||||
"749";"REPARAT CABLAJ TABLOU CMD.";"1"
|
||||
"753";"REPARAT INST. ELECTRICA SENZOR PEDALA FR";"1"
|
||||
"751";"REPARAT CUTIE VITEZE";"1"
|
||||
"747";"REPARAT CABLAJ SI INLOCUIT LAMPA SPATE";"1"
|
||||
"802";"REVIZIE ULEI +FILTRE";"1"
|
||||
"740";"REPARAT CABLAJ COMUTATOR FTANA MANA";"1"
|
||||
"744";"REPARAT CABLAJ LUMINI SPATE";"1"
|
||||
"742";"REPARAT CABLAJ ELECTRIC SISTEM EVACUARE";"1"
|
||||
"790";"REVIZIE MICA - PROGRAMATA";"1"
|
||||
"759";"REPARAT LIFT SUPRASTRUCTURA";"1"
|
||||
"760";"REPARAT MANETA COMENZI HIDRAULICE";"1"
|
||||
"787";"REVIZIE FILTRE + ULEI";"1"
|
||||
"758";"REPARAT INSTALATIE HIDRAULICA SUPRASTRUCTURA";"1"
|
||||
"755";"REPARAT INSTALATIE ELECTRICA";"1"
|
||||
"754";"REPARAT INSTALATIE ELECRICA ILUMINAT";"1"
|
||||
"793";"REVIZIE MOTOR AUXILIAR";"1"
|
||||
"795";"REVIZIE PERIODICA MARE";"1"
|
||||
"696";"REFACTURARE ALEZAJ BLOC MOTOR";"1"
|
||||
"638";"INLOCUIT SUPORT FAR STG";"1"
|
||||
"637";"INLOCUIT SUPORT CAPOTA INFERIOR STG";"1"
|
||||
"640";"INLOCUIT SUPORTI BARA SPATE STG + DR";"1"
|
||||
"639";"INLOCUIT SUPORT INF. DR CAPOTA";"1"
|
||||
"823";"UPDATE VBR 768840";"1"
|
||||
"635";"INLOCUIT SUPAPA SISTEM ALIMENTARE RAMPA";"1"
|
||||
"826";"VERIFICARE ELECTRICA";"1"
|
||||
"825";"VERIFICARE AUTO/CONSTATARE";"1"
|
||||
"636";"INLOCUIT SUPAPA SUPRASTRUCTURA";"1"
|
||||
"647";"INLOCUIT TAMPOANE CABINA FATA";"1"
|
||||
"646";"INLOCUIT TAMPOANE ARCURI SPATE";"1"
|
||||
"649";"INLOCUIT TAMPOANE SUPERIOARE RIGIDIZARE FATA";"1"
|
||||
"648";"INLOCUIT TAMPOANE INFERIOARE PUNTE FATA";"1"
|
||||
"645";"INLOCUIT TAMBURI SPATE AXA 3";"1"
|
||||
"642";"INLOCUIT SURUBURI FUZETA SPATE";"1"
|
||||
"641";"INLOCUIT SURUB AMORTIZOR FATA STG/DR";"1"
|
||||
"644";"INLOCUIT TAMBURI FRANA AXA 2 FATA";"1"
|
||||
"643";"INLOCUIT SURUBURI VOLANTA";"1"
|
||||
"632";"INLOCUIT SUPAPA GV";"1"
|
||||
"831";"VERIFICARE INSTALATIE ELECTRA SISTEM AD-BLUE";"1"
|
||||
"833";"VERIFICARE PIERDERI COMBUSTIBIL";"1"
|
||||
"620";"INLOCUIT SIMERING BUTUC SPATE";"1"
|
||||
"619";"INLOCUIT SIMERING AX CAME";"1"
|
||||
"616";"INLOCUIT SIMERERING GRUP DIFERENTIAL";"1"
|
||||
"613";"INLOCUIT SENZOT PTO";"1"
|
||||
"612";"INLOCUIT SENZORI TEMPERATURA EVACUARE";"1"
|
||||
"615";"INLOCUIT SIGURANTA 7.5 AH";"1"
|
||||
"614";"INLOCUIT SERPENTINA ADBLUE";"1"
|
||||
"629";"INLOCUIT STUT";"1"
|
||||
"830";"VERIFICARE INSTALATIE ALIMENTARE CU AD-BLUE";"1"
|
||||
"631";"INLOCUIT SUPAPA EGR";"1"
|
||||
"630";"INLOCUIT SUPAPA CUTIE DE VITEZA";"1"
|
||||
"628";"INLOCUIT SONDA REZERVOR";"1"
|
||||
"622";"INLOCUIT SIMERING PALIER SPATE";"1"
|
||||
"621";"INLOCUIT SIMERING FATA MOTOR";"1"
|
||||
"626";"INLOCUIT SONDA LAMBDA";"1"
|
||||
"624";"INLOCUIT SINE SCAUN SOFER";"1"
|
||||
"650";"INLOCUIT TERMOFLOT";"1"
|
||||
"685";"PREGATIRE ELEMENTE DIN PLASTIC";"1"
|
||||
"684";"PIESE MARUNTE";"1"
|
||||
"686";"PREGATIRE ELEMENTE METALICE";"1"
|
||||
"812";"TELESERVICII IVECO INLOCUIRE INSTRUMENTE BORD";"1"
|
||||
"814";"TELESERVICII- SOFT ALM";"1"
|
||||
"679";"MONTAT PARABICICLISTI STG";"1"
|
||||
"678";"MONTAT CONDUCTA ALIMENTARE PENTRU INCALZIRE AUXILIARA";"1"
|
||||
"682";"PIAGGIO INLOCUIT DISCURI SI PLACUTE FRANA FATA";"1"
|
||||
"680";"MONTAT PROIECTOARE FATA";"1"
|
||||
"693";"RAMPA INJECTOARE DEMONTATA";"1"
|
||||
"692";"PURJAT FILTRU MOTORINA";"1"
|
||||
"695";"RECTIFICAT FILETE COMPRESOR A/C";"1"
|
||||
"694";"RECTIFICAT FILET AXA DR SPATE";"1"
|
||||
"691";"PROGRAMARE CHEIE";"1"
|
||||
"688";"PRINDERE CONDUCTA EVACUARE PE SASIU";"1"
|
||||
"687";"PREGATIRE PENTRU VOPSIRE";"1"
|
||||
"690";"PROGRAMARE BODY COMPUTER";"1"
|
||||
"689";"PRINDERE CONDUCTE A/C";"1"
|
||||
"677";"MONTAT BUTUC ROATA SPATE DR";"1"
|
||||
"660";"INLOCUIT USA STG FATA";"1"
|
||||
"659";"INLOCUIT UNITATE CONTROL BUJII";"1"
|
||||
"818";"UPDATE BCM 76618 ATAQ";"1"
|
||||
"820";"UPDATE SOFT FSA 202418";"1"
|
||||
"657";"INLOCUIT ULEI CV";"1"
|
||||
"653";"INLOCUIT TURBINA MOTOR AUXILIAR";"1"
|
||||
"652";"INLOCUIT TREAPTA CABINA ARIPA DR";"1"
|
||||
"656";"INLOCUIT ULEI CUTIE VITEZE";"1"
|
||||
"655";"INLOCUIT ULEI + FILTRU ULEI";"1"
|
||||
"674";"MONTAT APARATOARE NOROI SPATE";"1"
|
||||
"672";"MASURAT UZURA ARBORE SI INLOCUIT CUZINETI PALIER (6 +1 AXIAL)";"1"
|
||||
"676";"MONTAT ARC AXA SPATE DR";"1"
|
||||
"815";"TEST ACUMULATORI";"1"
|
||||
"816";"TEST FRANARE";"1"
|
||||
"667";"INLOCUIT 2 BIELE MOTOR";"1"
|
||||
"663";"INLOCUIT VAS EXPANSIUNE CU SENZOR";"1"
|
||||
"669";"LIMITARE VITEZA LA 110KM/H";"1"
|
||||
"668";"LIMITARE AUTO 110 KM/H";"1"
|
||||
"183";"INCARCAT INSTALATIE A/C CU FREON";"1"
|
||||
"182";"INCARCARE INSTALATIE A/C";"1"
|
||||
"185";"INDREPTAT CAPAC SPATE PARTEA DRT.";"1"
|
||||
"189";"INL. INCHIZ CAPOTA DR";"1"
|
||||
"188";"INL DUBLURA INTERIOARA LONGERON FATA STG";"1"
|
||||
"181";"IINLOCUIT TERMOSTAT";"1"
|
||||
"166";"FACTURA VOPSITORIE F1897";"1"
|
||||
"163";"EFECTUAT TESTE + REGENERARE";"1"
|
||||
"175";"GOLIT INSTALATIE RACIRE";"1"
|
||||
"180";"GRESAT PUNCTE";"1"
|
||||
"177";"GOLIT REZERVOR AD-BLUE";"1"
|
||||
"198";"INLOCUIRE VENTILATOR AEROTERMA";"1"
|
||||
"197";"INLOCUIRE RIGIDIZARE STALP EXT. INT. DR";"1"
|
||||
"199";"INLOCUIT + REGLAT CABLURI TIMONERIE";"1"
|
||||
"201";"INLOCUIT ACUMULATORI";"1"
|
||||
"200";"INLOCUIT ACUMULATOR";"1"
|
||||
"196";"INLOCUIRE PERNA AER PUNTE MOTRICA DRT. SPRE FATA";"1"
|
||||
"191";"INLOCOUIT FAR FAZA LUNGA STG.";"1"
|
||||
"190";"INL. INCHIZ CAPOTA STG";"1"
|
||||
"192";"INLOCUIRE BARA FATA STG";"1"
|
||||
"195";"INLOCUIRE PERNA AER PUNTE MOTRICA";"1"
|
||||
"193";"INLOCUIRE BARA PROTECTIE FATA";"1"
|
||||
"136";"D/R ROATA SPATE DR AXA 4";"1"
|
||||
"135";"D/R ROATA DR SPATE";"1"
|
||||
"137";"D/R ROTI ( AXA 1/2/3) SI VERIFICAT ELEMENTE DE FRANARE";"1"
|
||||
"141";"D/R SCAUN SOFER";"1"
|
||||
"140";"D/R SCARA USA STG";"1"
|
||||
"134";"D/R ROATA";"1"
|
||||
"125";"D/R POMPA DE APA";"1"
|
||||
"124";"D/R PARASOC STG BARA FATA";"1"
|
||||
"126";"D/R PRAG STG";"1"
|
||||
"130";"D/R RADIATOR APA SI VERIFICAT ETANSEITATE";"1"
|
||||
"128";"D/R PROIECTOR FATA DR";"1"
|
||||
"150";"ECHIPAT ANEXE PE MOTOR";"1"
|
||||
"148";"D/R TURBOSUFLANTA";"1"
|
||||
"154";"EFECTUAT REGLAJ DIRECTIE";"1"
|
||||
"162";"EFECTUAT TEST FRANARE";"1"
|
||||
"161";"EFECTUAT REVIZIE PERIODICA-MICA";"1"
|
||||
"147";"D/R TURBINA";"1"
|
||||
"143";"D/R SI INLOCUIRE SEMNALIZATOR FAT DR";"1"
|
||||
"142";"D/R SEMNALIZARE LATERALA DR";"1"
|
||||
"144";"D/R SUPORT STG BARA FATA";"1"
|
||||
"146";"D/R TREAPTA ARIPA DR CABINA";"1"
|
||||
"145";"D/R SUSPENSIE FATA";"1"
|
||||
"202";"INLOCUIT ALM";"1"
|
||||
"242";"INLOCUIT BEC FAR ST + DR";"1"
|
||||
"241";"INLOCUIT BEC FAR DR";"1"
|
||||
"243";"INLOCUIT BEC FAZA SCURTA";"1"
|
||||
"245";"INLOCUIT BEC POZITIE";"1"
|
||||
"244";"INLOCUIT BEC LAMPA NR";"1"
|
||||
"240";"INLOCUIT BCM";"1"
|
||||
"236";"INLOCUIT BASCULA STG";"1"
|
||||
"232";"INLOCUIT BARA FATA DR";"1"
|
||||
"237";"INLOCUIT BASCULA STG FATA";"1"
|
||||
"239";"INLOCUIT BASCULE FATA";"1"
|
||||
"238";"INLOCUIT BASCULA SUPERIOARA FATA STG";"1"
|
||||
"256";"INLOCUIT BORNA BATERIE MINUS";"1"
|
||||
"254";"INLOCUIT BECURI PE LAMPILE GABARIT";"1"
|
||||
"257";"INLOCUIT BRATE SUSPENSIE FATA";"1"
|
||||
"259";"INLOCUIT BUCSI ARCURI FATA";"1"
|
||||
"258";"INLOCUIT BROASCA USA FATA STG";"1"
|
||||
"252";"INLOCUIT BECURI LAMPI GABARIT";"1"
|
||||
"247";"INLOCUIT BEC STOP";"1"
|
||||
"246";"INLOCUIT BEC SEMNALIZARE SI POZITIE";"1"
|
||||
"248";"INLOCUIT BEC STOP FRANA";"1"
|
||||
"251";"INLOCUIT BECURI FARURI FATA";"1"
|
||||
"250";"INLOCUIT BECURI FARURI";"1"
|
||||
"212";"INLOCUIT AMORTIZOR CABINA FATA STG/DR";"1"
|
||||
"211";"INLOCUIT AMORTIZOR AXA FATA (AMBELE PARTI)";"1"
|
||||
"213";"INLOCUIT AMORTIZOR DR FATA";"1"
|
||||
"215";"INLOCUIT ANSAMBLU BASCULA FATA STG";"1"
|
||||
"214";"INLOCUIT ANSAMBLU BASCULA FATA DR";"1"
|
||||
"210";"INLOCUIT AMORTIZOARE SPATE";"1"
|
||||
"205";"INLOCUIT AMORTIOARE FATA";"1"
|
||||
"204";"INLOCUIT AMBREIAJ";"1"
|
||||
"207";"INLOCUIT AMORTIZOARE CABINA FATA";"1"
|
||||
"209";"INLOCUIT AMORTIZOARE FATA S + D";"1"
|
||||
"208";"INLOCUIT AMORTIZOARE FATA";"1"
|
||||
"228";"INLOCUIT BALAMALE USA STG FATA";"1"
|
||||
"227";"INLOCUIT BALAMALE USA DR";"1"
|
||||
"229";"INLOCUIT BARA DRT. FATA";"1"
|
||||
"231";"INLOCUIT BARA FATA + SUPORTI BARA";"1"
|
||||
"230";"INLOCUIT BARA FATA";"1"
|
||||
"226";"INLOCUIT ARIPA ROATA FATA STG";"1"
|
||||
"220";"INLOCUIT ARC SPATE STG";"1"
|
||||
"216";"INLOCUIT ANSAMBLU USCATOR AER";"1"
|
||||
"221";"INLOCUIT ARC SPATE(O PARTE)";"1"
|
||||
"225";"INLOCUIT ARIPA ROATA FATA DR";"1"
|
||||
"223";"INLOCUIT ARIPA + ORNAMENT STG. PUNTE FATA";"1"
|
||||
"123";"D/R ORNAMENT STG GRILA";"1"
|
||||
"36";"DEMONTAT FURCI CUPLARE CV";"1"
|
||||
"35";"DEMONTAT COMPRESOR A/C";"1"
|
||||
"37";"DEMONTAT REZERVOR COMBUSTIBIL";"1"
|
||||
"40";"DEMONTAT SEGMENTI CILINDRU EXPULZIE";"1"
|
||||
"38";"DEMONTAT ROTI AXA SPATE";"1"
|
||||
"34";"DEMONTAT BORD SI INLOCUIT CEASURI";"1"
|
||||
"29";"DEMONTAT ANEXE DE PE MOTOR";"1"
|
||||
"28";"DEMNTAT BUTUC AXA SPATE DR";"1"
|
||||
"30";"DEMONTAT ARC AXA SPATE STG";"1"
|
||||
"33";"DEMONTAT BORD DREAPTA";"1"
|
||||
"32";"DEMONTAT BORD AUTO";"1"
|
||||
"50";"DEZANSAMBLAT ARC AXA SPATE STG";"1"
|
||||
"48";"DESFACUT SI REPARAT CILINDRI COMPACTARE";"1"
|
||||
"52";"DIAGNOZA NOX";"1"
|
||||
"54";"DIAGNOZA PTO";"1"
|
||||
"53";"DIAGNOZA: MARTOR CHECK ENGINE";"1"
|
||||
"47";"DESCARCAT-INCARCAT INST A/C";"1"
|
||||
"42";"DEMONTAT/MONTAT CAPAC BAIE ULEI";"1"
|
||||
"41";"DEMONTAT SISTEM EVACUARE";"1"
|
||||
"43";"DEMONTAT/MONTAT CILINDRU EXPULZIE";"1"
|
||||
"46";"DEPRESAT RULMENTI";"1"
|
||||
"45";"DEMONTAT/MONTAT CV PE AUTO";"1"
|
||||
"10";"COMPLETAT CU FREON";"1"
|
||||
"9";"COMPLETARE LICHID FRANA";"1"
|
||||
"11";"COMPLETAT INSTALATIE FREON";"1"
|
||||
"13";"CURATAT FILTRU DE PARTICULE";"1"
|
||||
"12";"CURATAT BIELA SI INLOCUIT CUZINETI (6 BIELE)";"1"
|
||||
"7";"APARATOARE ARIPA";"1"
|
||||
"2";"AERISIT INSTALATIE FRANARE";"1"
|
||||
"1";"AERISIT FRANE";"1"
|
||||
"3";"AERISIT INSTALATIE HIDRAULICA";"1"
|
||||
"6";"ANSAMBLAT BORD AUTO";"1"
|
||||
"5";"AERISIT SISTEM HIDRAULIC AMBREIAJ";"1"
|
||||
"23";"CURATAT PINI";"1"
|
||||
"22";"CURATAT MUFE SI CABLAJE";"1"
|
||||
"24";"CURATAT PISTOANE SI INLOCUIT SEGMENTI ( 6 PISTOANE)";"1"
|
||||
"27";"DECONECTAT CONDUCTE COMBUSTIBIL";"1"
|
||||
"26";"CURATAT SUPAPA DEBIT GAZE";"1"
|
||||
"21";"CURATAT INTRECOOLER";"1"
|
||||
"17";"CURATAT INSTALATIE DE AER";"1"
|
||||
"15";"CURATAT INSTALATIE ADBLUE";"1"
|
||||
"18";"CURATAT INSTALATIE DRENARE A/C";"1"
|
||||
"20";"CURATAT INSTALATIE RACIRE";"1"
|
||||
"19";"CURATAT INSTALATIE ELECTRICA PORNIRE";"1"
|
||||
"56";"DIAGNOZA SI UPDATE AUTO";"1"
|
||||
"105";"D/R DISC FRANA SI BUTUC ROATA DR SPATE";"1"
|
||||
"102";"D/R CUTIE VITEZE";"1"
|
||||
"106";"D/R EPURATOR GAZE SI INLOCUIT RACORD";"1"
|
||||
"109";"D/R FILTRU DE PARTICULE SI INLOCUIT GARNITURI + COLIERE";"1"
|
||||
"108";"D/R FATA DE USA STG";"1"
|
||||
"97";"D/R CONDUCTA PRESIUNE POMPA SERVO";"1"
|
||||
"93";"D/R CILINDRU DE EXPULZIE";"1"
|
||||
"92";"D/R CILINDRI HIDRAULICI SPATE COMPACTOR";"1"
|
||||
"94";"D/R CILINDRU EXPULZIE";"1"
|
||||
"96";"D/R COMPONENTE CATALIZATOR";"1"
|
||||
"95";"D/R COLTAR FATA DR";"1"
|
||||
"117";"D/R LAMPA SEMNALIZARE DR";"1"
|
||||
"116";"D/R KIT AMBREIAJ + VOLANTA";"1"
|
||||
"118";"D/R MANER CAPOTA MOTOR";"1"
|
||||
"120";"D/R MOTOR";"1"
|
||||
"119";"D/R MODUL ALIMENTARE AD-BLUE";"1"
|
||||
"115";"D/R JANTA FATA STG";"1"
|
||||
"111";"D/R GEAM INF USA DR";"1"
|
||||
"110";"D/R FILTRU PARTICULE";"1"
|
||||
"112";"D/R GRILA RADIATOR";"1"
|
||||
"114";"D/R JANTA FATA DR";"1"
|
||||
"113";"D/R INJECTOARE";"1"
|
||||
"66";"D/R + REPARAT ELECTROMOTOR";"1"
|
||||
"65";"D/R RADIATOARE";"1"
|
||||
"67";"D/R ANVELOPA FATA DR";"1"
|
||||
"69";"D/R APARATOARE";"1"
|
||||
"68";"D/R ANVELOPA FATA STG";"1"
|
||||
"64";"D/M SI REPARAT CILINDRU LIFT";"1"
|
||||
"60";"D/M FILTRU PARTICULE";"1"
|
||||
"59";"D/M CHIULASA MOTOR SI INLOCUIT GARNITURA CHIULASA";"1"
|
||||
"61";"D/M GRUP DIFERENTIAL";"1"
|
||||
"63";"D/M SI REPARAT CILINDRU GHEARA";"1"
|
||||
"62";"D/M SI REPARAT CILINDRU EXPULZIE";"1"
|
||||
"86";"D/R CAPITONAJ USA DR SP\";"1"
|
||||
"85";"D/R CAPITONAJ FATA DR CABINA";"1"
|
||||
"88";"D/R CATALIZATOR X 2";"1"
|
||||
"91";"D/R CHIULOASA MOTOR";"1"
|
||||
"89";"D/R CAUTATOR CV";"1"
|
||||
"84";"D/R CAPAC SUPERIOR OGLINDA EXT DR";"1"
|
||||
"74";"D/R BARA FATA DR SI INLOCUIT";"1"
|
||||
"73";"D/R BARA FATA DR";"1"
|
||||
"79";"D/R BUTUC ROATA SPATE";"1"
|
||||
"82";"D/R CADRU MOTOR FATA";"1"
|
||||
"80";"D/R BUTUCI ROATA SPATE";"1"
|
||||
"260";"INLOCUIT BUCSI ARCURI SPATE + BRIDE";"1"
|
||||
"418";"INLOCUIT FURTUN RACIRE COMPRESOR";"1"
|
||||
"417";"INLOCUIT FURTUN INTERCOOLER";"1"
|
||||
"419";"INLOCUIT FURTUNE INSTALATIE HIDRAULICA";"1"
|
||||
"421";"INLOCUIT FUZETA FATA DR";"1"
|
||||
"420";"INLOCUIT FURTUNE RACIRE";"1"
|
||||
"416";"INLOCUIT FURTUN INFERIOR RADIATOR APA";"1"
|
||||
"412";"INLOCUIT FOAIE 2 ARC SPATE STG";"1"
|
||||
"411";"INLOCUIT FOAIE 2 ARC SPATE DR";"1"
|
||||
"413";"INLOCUIT FOAIE 3 ARC SPATE";"1"
|
||||
"415";"INLOCUIT FURTUN COMPRESOR AER";"1"
|
||||
"414";"INLOCUIT FULIE ALTERNATOR";"1"
|
||||
"430";"INLOCUIT GEAM OGLINDA MICA DR";"1"
|
||||
"429";"INLOCUIT GEAM OGLINDA MIC STG";"1"
|
||||
"431";"INLOCUIT GIROFAR FATA";"1"
|
||||
"436";"INLOCUIT INTINZATOR ALTERNATOR";"1"
|
||||
"432";"INLOCUIT GRILA SUPERIOARA";"1"
|
||||
"428";"INLOCUIT GARNITURI RACITOR DE ULEI MOTOR";"1"
|
||||
"423";"INLOCUIT GARNITURA CHIULOASA";"1"
|
||||
"422";"INLOCUIT GARNITURA CAPAC CUVA";"1"
|
||||
"425";"INLOCUIT GARNITURI EGR";"1"
|
||||
"427";"INLOCUIT GARNITURI FILTRU";"1"
|
||||
"426";"INLOCUIT GARNITURI ETANSARE DPF";"1"
|
||||
"386";"INLOCUIT ETRIER STG";"1"
|
||||
"385";"INLOCUIT ETRIER FRANA DR SPATE";"1"
|
||||
"387";"INLOCUIT FAR DR";"1"
|
||||
"389";"INLOCUIT FAR DR COMPLET";"1"
|
||||
"388";"INLOCUIT FAR DR + LAMPA POZITIE";"1"
|
||||
"384";"INLOCUIT ELECTROVALVA";"1"
|
||||
"380";"INLOCUIT DOZATOR ADBLUE";"1"
|
||||
"379";"INLOCUIT DISTRIBUITOR LIFT";"1"
|
||||
"381";"INLOCUIT ECU GEARBOX";"1"
|
||||
"383";"INLOCUIT ECU ULEI MOTOR";"1"
|
||||
"382";"INLOCUIT ECU PTO";"1"
|
||||
"404";"INLOCUIT FILTRU POLEN";"1"
|
||||
"401";"INLOCUIT FILTRU DPF";"1"
|
||||
"405";"INLOCUIT FILTRU SCRUF";"1"
|
||||
"408";"INLOCUIT FOAIE DE ARC FATA";"1"
|
||||
"406";"INLOCUIT FILTRU ULEI";"1"
|
||||
"400";"INLOCUIT FILTRU DE ULEI";"1"
|
||||
"392";"INLOCUIT FERODOURI AXA 2 FATA STG/DR";"1"
|
||||
"391";"INLOCUIT FAR STG";"1"
|
||||
"393";"INLOCUIT FILTRE MOTORINA";"1"
|
||||
"398";"INLOCUIT FILTRU DE AER MOTOR";"1"
|
||||
"395";"INLOCUIT FILTRU ADBLUE+CAPAC FILTRU ADBLUE";"1"
|
||||
"437";"INLOCUIT KIT ACCESORII";"1"
|
||||
"491";"INLOCUIT OGLINDA STG";"1"
|
||||
"488";"INLOCUIT NUCA SCHIMBATOR";"1"
|
||||
"493";"INLOCUIT OGLINDA DR";"1"
|
||||
"496";"INLOCUIT OGLINDA SI BUSON REZERVOR";"1"
|
||||
"494";"INLOCUIT OGLINDA MICA STG.";"1"
|
||||
"487";"INLOCUIT MOTOR ELECTRIC ACTIONARE LIFT";"1"
|
||||
"482";"INLOCUIT MODUL DOZARE UPSTREAM CATALIZATOR";"1"
|
||||
"481";"INLOCUIT MODUL - POMPA ADBLUE";"1"
|
||||
"483";"INLOCUIT MODULATOR ABS/EBS";"1"
|
||||
"486";"INLOCUIT MONITOR+CAMERA VIDE";"1"
|
||||
"485";"INLOCUIT MONITOR LED";"1"
|
||||
"508";"INLOCUIT PINION VIT2 + SINCROANE 1/2";"1"
|
||||
"506";"INLOCUIT PINION CV VIT. 6";"1"
|
||||
"509";"INLOCUIT PIVOTI";"1"
|
||||
"516";"INLOCUIT PLACUTE FR";"1"
|
||||
"513";"INLOCUIT PLACA DE COMANDA LIFT";"1"
|
||||
"505";"INLOCUIT PINION CV VIT 2";"1"
|
||||
"498";"INLOCUIT OGLINDA STG";"1"
|
||||
"497";"INLOCUIT OGLINDA ST";"1"
|
||||
"500";"INLOCUIT ORNAMENT ARIPA DRT. PUNTE FATA";"1"
|
||||
"504";"INLOCUIT PERNA AER";"1"
|
||||
"503";"INLOCUIT ORNAMENT PROIECTOR";"1"
|
||||
"458";"INLOCUIT LAMPA NUMAR";"1"
|
||||
"452";"INLOCUIT LAMPA DR PE CABINA";"1"
|
||||
"459";"INLOCUIT LAMPA SEMNAL PE OGLINDA DREAPA";"1"
|
||||
"461";"INLOCUIT LAMPA SEMNALIZARE STG PE OGLINDA";"1"
|
||||
"460";"INLOCUIT LAMPA SEMNAL STANGA IN BARA";"1"
|
||||
"451";"INLOCUIT LAMPA CORN STG SPATE";"1"
|
||||
"442";"INLOCUIT KIT CUREA ACCESORII";"1"
|
||||
"438";"INLOCUIT KIT AMBREAJ";"1"
|
||||
"445";"INLOCUIT KIT GARNITURI CILINDRU EXPULZIE";"1"
|
||||
"449";"INLOCUIT LAMPA CABINA DR";"1"
|
||||
"446";"INLOCUIT KIT HIDRAULIC";"1"
|
||||
"476";"INLOCUIT MANER USA DR FATA";"1"
|
||||
"474";"INLOCUIT MACARA GEAM USA FATA STG";"1"
|
||||
"477";"INLOCUIT MANER USA FATA STG";"1"
|
||||
"480";"INLOCUIT MANSETE LA CILINDRU DE EXPULZIE";"1"
|
||||
"479";"INLOCUIT MANETA SEMNALIZARE";"1"
|
||||
"473";"INLOCUIT MACARA GEAM STG";"1"
|
||||
"465";"INLOCUIT LAMPI";"1"
|
||||
"463";"INLOCUIT LAMPA SPATE DRT.";"1"
|
||||
"470";"INLOCUIT LICHID RACIRE";"1"
|
||||
"472";"INLOCUIT MACARA GEAM DR FATA";"1"
|
||||
"471";"INLOCUIT MACARA CU MOTORAS USA STG";"1"
|
||||
"378";"INLOCUIT DISTRIBUITOR HIDRAULIC PRINCIPAL";"1"
|
||||
"298";"INLOCUIT CAPETE BARA AXA VIRATOARE S +D";"1"
|
||||
"297";"INLOCUIT CAPAC VIZITARE FAR STG SUPERIOR";"1"
|
||||
"299";"INLOCUIT CAPETE BARA ST + DR";"1"
|
||||
"301";"INLOCUIT CAPETE DE BARA LA CASETA DE DIRECTIE";"1"
|
||||
"300";"INLOCUIT CAPETE BARA TRANSVERSALA S + D AXA 1";"1"
|
||||
"296";"INLOCUIT CAPAC VIZITARE FAR STG INFERIOR";"1"
|
||||
"287";"INLOCUIT CABLURI FRANA PARCARE";"1"
|
||||
"286";"INLOCUIT CABLURI FRANA MANA";"1"
|
||||
"289";"INLOCUIT CAMERA SI MONITOR";"1"
|
||||
"293";"INLOCUIT CAP BARA DIRECTIE ST + DR";"1"
|
||||
"292";"INLOCUIT CAP BARA (AMBELE PARTI)";"1"
|
||||
"310";"INLOCUIT CAUTATOR CV";"1"
|
||||
"309";"INLOCUIT CATALIZATOR";"1"
|
||||
"311";"INLOCUIT CHIULASA COMPRESOR";"1"
|
||||
"313";"INLOCUIT CILINDRU LATERAL";"1"
|
||||
"312";"INLOCUIT CILINDRU AMBREIAJ";"1"
|
||||
"308";"INLOCUIT CASETA DE DIRECTIE";"1"
|
||||
"304";"INLOCUIT CAPOTA MOTOR";"1"
|
||||
"302";"INLOCUIT CAPETE DE BARA S + D";"1"
|
||||
"305";"INLOCUIT CARCASA OGLINDA DR";"1"
|
||||
"307";"INLOCUIT CARDAN";"1"
|
||||
"306";"INLOCUIT CARCASA OGLINDA STG.";"1"
|
||||
"270";"INLOCUIT BUJIE INCANDESCENTA (4)";"1"
|
||||
"269";"INLOCUIT BUCSI ETRIERI FATA";"1"
|
||||
"271";"INLOCUIT BUJIE MOTOR 1 BUCATA";"1"
|
||||
"274";"INLOCUIT BUJII 2 BUCATI";"1"
|
||||
"272";"INLOCUIT BUJII";"1"
|
||||
"268";"INLOCUIT BUCSI CABINA SPATE";"1"
|
||||
"262";"INLOCUIT BUCSI BARA STABILIZATIOARE FATA";"1"
|
||||
"261";"INLOCUIT BUCSI BARA STAB SPATE";"1"
|
||||
"263";"INLOCUIT BUCSI BARA STABILIZATOARE FATA";"1"
|
||||
"266";"INLOCUIT BUCSI BASCULA FATA STG + DR";"1"
|
||||
"265";"INLOCUIT BUCSI BARA TORSIUNE FATA DR";"1"
|
||||
"282";"INLOCUIT CABLU AMBREIAJ";"1"
|
||||
"281";"INLOCUIT CABLU ACCELERATIE";"1"
|
||||
"283";"INLOCUIT CABLU TIMONERIE";"1"
|
||||
"285";"INLOCUIT CABLURI FRANA DE MANA";"1"
|
||||
"284";"INLOCUIT CABLURI FRANA DE MANA";"1"
|
||||
"280";"INLOCUIT CABLAJ POMPA ADBLUE";"1"
|
||||
"276";"INLOCUIT BUTUC ROATA";"1"
|
||||
"275";"INLOCUIT BUTUC FATA DREAPTA";"1"
|
||||
"277";"INLOCUIT BUTUC ROATA FATA + RULMENT DR";"1"
|
||||
"279";"INLOCUIT CABLAJ NOXE";"1"
|
||||
"278";"INLOCUIT BUTUCI FATA CU RULMENTI";"1"
|
||||
"314";"INLOCUIT CILINDRU RECEPTOR";"1"
|
||||
"354";"INLOCUIT CUREA ALTERNATOR";"1"
|
||||
"353";"INLOCUIT CUREA ALTERBATOR";"1"
|
||||
"355";"INLOCUIT CUREA +ROLA TRANSMISIE";"1"
|
||||
"357";"INLOCUIT CUREA TRANSMISIE";"1"
|
||||
"356";"INLOCUIT CUREA SI ROLE";"1"
|
||||
"352";"INLOCUIT CUREA A/C";"1"
|
||||
"348";"INLOCUIT CRUCI CARDANICE";"1"
|
||||
"347";"INLOCUIT CRUCE CRADAN";"1"
|
||||
"349";"INLOCUIT CULISANTE ETRIER SPATE STG/DR";"1"
|
||||
"351";"INLOCUIT CUREA + ROLA DISTRIBUTIE";"1"
|
||||
"350";"INLOCUIT CUREA + ROLA AC";"1"
|
||||
"367";"INLOCUIT DISCURI + PLACUTE FATA";"1"
|
||||
"366";"INLOCUIT DISC SI PLACUTE AXA FATA";"1"
|
||||
"370";"INLOCUIT DISCURI FATA";"1"
|
||||
"377";"INLOCUIT DISTRIBUITOR COMPACTARE";"1"
|
||||
"371";"INLOCUIT DISCURI FATA + PLACUTE";"1"
|
||||
"365";"INLOCUIT DISC FRINA + PLACUTE SPATE";"1"
|
||||
"361";"INLOCUIT DISC AMBREIAJ";"1"
|
||||
"359";"INLOCUIT CUZINETI BIELA + 1 BIELA";"1"
|
||||
"362";"INLOCUIT DISC FR SP (AMBELE)";"1"
|
||||
"364";"INLOCUIT DISC FRANA(AMBELE)";"1"
|
||||
"363";"INLOCUIT DISC FRANA FATA STG/DR";"1"
|
||||
"322";"INLOCUIT COMPRESOR + CUREA";"1"
|
||||
"321";"INLOCUIT COMANDA LIFT";"1"
|
||||
"323";"INLOCUIT COMPRESOR A.C.";"1"
|
||||
"326";"INLOCUIT COMPRESOR AER";"1"
|
||||
"324";"INLOCUIT COMPRESOR A/C";"1"
|
||||
"320";"INLOCUIT COLIERE TURBO";"1"
|
||||
"316";"INLOCUIT CIRCUIT HIDRAULIC AMBREIAJ";"1"
|
||||
"315";"INLOCUIT CILINDRU RECEPTOR AMBREIAJ";"1"
|
||||
"317";"INLOCUIT CLAPETA ACCELERATIE";"1"
|
||||
"319";"INLOCUIT COLIERE SI GARNITURI EVACUARE";"1"
|
||||
"318";"INLOCUIT COLIERE FURTUN TURBINA";"1"
|
||||
"337";"INLOCUIT CONDUCTA RACIRE EGR";"1"
|
||||
"336";"INLOCUIT CONDUCTA RACIRE COMPRESOR/CHIULOASA";"1"
|
||||
"339";"INLOCUIT CONDUCTA SISTEM INCALZIRE AD-BLUE";"1"
|
||||
"341";"INLOCUIT CONDUCTE ALIMENTARE COMBUSTIBIL";"1"
|
||||
"340";"INLOCUIT CONDUCTA ULEI TURBINA";"1"
|
||||
"335";"INLOCUIT CONDUCTA POMPA RABATARE";"1"
|
||||
"328";"INLOCUIT COMUTATOT STOP FRANA";"1"
|
||||
"327";"INLOCUIT COMUTATOR MI";"1"
|
||||
"329";"INLOCUIT CONDUCT RACIRE VAS - RADIATOR";"1"
|
||||
"334";"INLOCUIT CONDUCTA INJECTOR";"1"
|
||||
"333";"INLOCUIT CONDUCTA EGR";"1"
|
||||
|
224
docs/prd/prd-5.14-mapare-llm-distilata.md
Normal file
224
docs/prd/prd-5.14-mapare-llm-distilata.md
Normal file
@@ -0,0 +1,224 @@
|
||||
<!-- plan sub /autoplan -->
|
||||
# PRD 5.14 — Mapare automata operatii service prin distilare LLM
|
||||
|
||||
## Problema
|
||||
|
||||
La ingestie (canal API si import web), o prestatie poate veni cu `cod_op_service`
|
||||
+ `denumire` in loc de `cod_prestatie` RAR. Daca nu exista mapare, submission-ul
|
||||
intra in `needs_mapping` si asteapta confirmare umana. Service-urile reale au
|
||||
**volume mari de denumiri particulare** (masurat: 17.435 denumiri DISTINCTE in 4
|
||||
CSV-uri de clienti reali — `automotive` 13.170, `sigma` 3.743, `clever` 1.668,
|
||||
`south` 875). Maparea manuala a acestora, prin editorul `needs_mapping`, e
|
||||
prohibitiva: zeci de mii de operatii × confirmare umana.
|
||||
|
||||
Nomenclatorul RAR are doar **18 coduri** foarte largi (REPARATIE, INTRETINERE,
|
||||
REVIZIE PERIODICA, etc. — `nomenclator_seed.py`). Deci problema nu e potrivire de
|
||||
sinonime, ci **clasificare** a mii de operatii granulare in 18 categorii abstracte
|
||||
+ detectare de „gunoi" (linii care nu sunt operatii: `ITP CT 12 ABC`, `DISCOUNT
|
||||
MATERIALE 5%`, `MANOPERA`, nr. inmatriculare).
|
||||
|
||||
## Viziune (pivot 2026-06-28)
|
||||
|
||||
LLM-ul **NU ruleaza la runtime**. Rol unic: **etichetator offline** care
|
||||
construieste un set de date (denumire -> cod). La runtime ruleaza un **clasificator
|
||||
local mic, fara API** (similaritate / fuzzy / embeddings), „distilat" din etichetele
|
||||
LLM + maparile validate de oameni. Trei straturi:
|
||||
|
||||
1. **Etichetare offline (LLM, periodic):** acopera denumirile cu cele mai multe
|
||||
aparitii (frecventa) si grupeaza denumirile asemanatoare ca sa eticheteze ieftin.
|
||||
2. **Clasificator runtime (fara AI):** exact -> fuzzy/substring -> similaritate
|
||||
semantica (embeddings) peste baza de cunostinte. Zero cost per cerere, ruleaza pe
|
||||
LXC.
|
||||
3. **Baza de cunostinte PARTAJATA:** maparile validate de oameni din TOATE conturile
|
||||
de service contribuie la clasificare (strat „gold" comun), peste etichetele LLM
|
||||
(„silver" bootstrap). Munca de validare a unui service ajuta toate service-urile.
|
||||
|
||||
Viitor (nu acum): un LLM generativ local pe LXC. Pasul curent foloseste un model de
|
||||
**embedding** (nu generativ): mic, CPU, milisecunde/text.
|
||||
|
||||
## Premise
|
||||
|
||||
1. **Volumul de denumiri distincte e finit si se schimba lent.** Odata etichetate,
|
||||
90%+ din traficul viitor sunt repetari ale acelorasi denumiri (service-ul
|
||||
refoloseste propriul vocabular). Lege Zipf: top 100 denumiri = 43.6% volum,
|
||||
top 500 = 67.7%, top 1000 = 76.2% (din 155.195 operatii totale).
|
||||
2. **RAR accepta NUMAI coduri din nomenclator.** Un cod necunoscut -> HTTP 500
|
||||
(`ORA-12899`) + record PARTIAL FINALIZATA (terminal). Deci orice cod propus de
|
||||
un sistem automat TREBUIE validat fata de nomenclator inainte de enqueue
|
||||
(invariant existent in `resolve_prestatii(..., valid_codes)`).
|
||||
3. **Maparea gresita are cost asimetric:** un cod gresit trimis = FINALIZATA
|
||||
ireversibil la RAR. Deci pragul de auto-trimitere ramane conservator; incertul
|
||||
ramane `needs_mapping` cu om in bucla. Etichetele LLM NEVALIDATE = sugestie, nu
|
||||
auto-trimitere (vezi scara de incredere).
|
||||
4. **Hardware LLM local generativ e prea lent acum** (masurat: Ollama LXC 104
|
||||
generativ 180-320s/op). Embeddings locale insa sunt rapide pe CPU si suficiente
|
||||
pentru similaritate la runtime.
|
||||
5. **Datele nu sunt sensibile** (confirmat utilizator): denumirile de operatii pot
|
||||
merge la API-uri cloud pentru etichetare. PII incidental (nr. inmatriculare/VIN)
|
||||
se face scrub inainte de trimitere (F3).
|
||||
|
||||
## Masuratori
|
||||
|
||||
### Bootstrap (anterior, Groq)
|
||||
- Groq `llama-3.3-70b`: 28ms/op, acord 94% cu heuristica pe cazuri clare, detectare
|
||||
gunoi excelenta (`NUL`). Abandonat ca furnizor: cap zilnic free atins + cheie expusa.
|
||||
|
||||
### OpenRouter free — NVIDIA Nemotron (masurat 2026-06-28)
|
||||
Furnizor nou pentru etichetare: cheie utilizator, modele GRATUITE, date ne-sensibile.
|
||||
|
||||
- **Capcane de cont (rezolvate):** modelele free dau initial `404 No allowed
|
||||
providers` din cauza unui allowlist de provideri pe cont (venice/together/fireworks/
|
||||
atlas-cloud) — `open-inference`/`google-ai-studio`/`nvidia` erau excluse. Fix:
|
||||
eliminat restrictia in Settings -> Preferences + activat toggle-ul de privacy
|
||||
„free endpoints may publish/train". WAF: User-Agent `Mozilla/5.0` obligatoriu.
|
||||
- **Set fiabil = familia NVIDIA Nemotron.** Restul modelelor sunt 429 (rate-limited
|
||||
upstream, partajat global: llama-3.3-70b, qwen3-next, gemma, hermes, dolphin) sau
|
||||
404 (gpt-oss). Cap free tier ~50 cereri/zi fara credit.
|
||||
- **Test ensemble pe top 120 dupa frecventa (46.4% din volum), 2026-06-28:**
|
||||
|
||||
| Model | ms/op | parse-fail | acord vs Groq (overlap) |
|
||||
|---|---|---|---|
|
||||
| nemotron-3-super-120b | 1463 | 0 | 100% |
|
||||
| nemotron-nano-9b-v2 | 1248 | 0 | 100% |
|
||||
| nemotron-3-ultra-550b | 6450 | 0 | 100% |
|
||||
|
||||
Acord ensemble ponderat pe volum: **3/3 unanim = 87% volum**, 2/3 = 13%, dezacord
|
||||
total = **0%**. Din unanim: 7 NUL (gunoi), 100 coduri reale.
|
||||
- **Decizie model:** pastram `super-120b` + `nano-9b`; **aruncam `ultra-550b`**
|
||||
(4-5x mai lent, zero castig de acuratete). Caveat: ensemble din aceeasi familie
|
||||
NVIDIA -> acordul supraestimeaza increderea fata de un ensemble cross-family.
|
||||
- **Dezacordurile (13%) sunt cazuri de granita taxonomica reala**, nu zgomot:
|
||||
`REGLAT DIRECTIE/FARURI` (OE-2 intretinere vs OE-4 reglare), `MANOPERA
|
||||
TINICHIGERIE` (NUL vs OE-1), `DEZECHIPAT usa/bara` (pas de demontare), `INLOCUIT
|
||||
FILTRU AER` (OE-1 vs OE-3). Astea trebuie sa cada in `needs_mapping`.
|
||||
|
||||
## Solutia
|
||||
|
||||
### Stratul 1 — Etichetare offline (LLM, fara cod runtime)
|
||||
|
||||
Tool CLI (`tools/mapare-llm/`, stil `tools/apikey`). Etichetatorul OpenRouter
|
||||
(`or_common.py` + `or_label.py`) clasifica denumirile in cele 18 coduri RAR + `NUL`:
|
||||
|
||||
1. **Prioritizare pe FRECVENTA (NR), nu alfabetic.** Etichetam intai denumirile cu
|
||||
cele mai multe aparitii (acopera cel mai mult volum per apel).
|
||||
2. **Grupare pe similaritate inainte de etichetare.** Denumirile aproape identice
|
||||
(`REGLAT DIRECTIE` / `REGLAT DIRECTIA` / `REGLARE DIRECTIE`) se grupeaza; LLM
|
||||
eticheteaza doar **reprezentantul grupului**, codul se propaga la tot grupul.
|
||||
Maximizeaza acoperirea per apel LLM (critic pe cap free de ~50 cereri/zi).
|
||||
3. **Ensemble NVIDIA** (`super-120b` + `nano-9b`): acord -> incredere mai mare;
|
||||
dezacord -> ramane pentru `needs_mapping`. Vot pe coduri, nu self-confidence.
|
||||
4. **Scrub PII** (regex nr. inmatriculare/VIN) inainte de trimitere (F3, exista).
|
||||
5. Output: dataset etichetat cu `denumire, cod, sursa, confidence` (provenienta).
|
||||
`NUL` marcat separat (ancore negative + supresie), NU se promoveaza la cod RAR.
|
||||
|
||||
Prompt cu reguli explicite (avarii grave DOAR la accident; vopsire = reparatie;
|
||||
ulei+filtru = revizie; gunoi -> NUL). Batch mare (cap free tier), retry/backoff pe
|
||||
429, respecta `Retry-After`.
|
||||
|
||||
### Stratul 2 — Clasificator runtime (FARA AI, fara API)
|
||||
|
||||
Pentru o denumire din prezentare (canal API sau import), in `app/mapping.py`:
|
||||
|
||||
1. **Exact** in baza de cunostinte (`operations_mapping` + strat partajat) -> cod direct.
|
||||
2. **Fuzzy/substring** (`operation_text_rules`, `rapidfuzz`) — exista deja.
|
||||
3. **Similaritate semantica (embeddings)** — NOU: model multilingv mic (ex.
|
||||
`intfloat/multilingual-e5-small` sau `paraphrase-multilingual-MiniLM`), CPU.
|
||||
Vectorizam baza etichetata o data; la runtime vectorizam denumirea noua si luam
|
||||
cel mai apropiat vecin (sau top-k cu vot). Optional: clasificator `scikit-learn`
|
||||
(regresie logistica / kNN) antrenat pe (embedding -> cod) pentru generalizare
|
||||
dincolo de vecinul exact. „Antrenarea pe datele de test" = acest pas, secunde,
|
||||
ruleaza oriunde.
|
||||
4. Cod propus -> validat OBLIGATORIU `valid_codes` (garda ORA-12899). Peste pragul
|
||||
de incredere -> conform scarii; altfel `needs_mapping`.
|
||||
|
||||
Decizie de gazduire runtime: ramane deschisa pentru reviziile plan (in-proces in
|
||||
gateway vs microserviciu pe LXC/Flowise). Default propus: in-proces (cel mai simplu).
|
||||
|
||||
### Stratul 3 — Baza de cunostinte PARTAJATA cross-account
|
||||
|
||||
**Schimbare fata de versiunea anterioara** (care izola corpusul per cont):
|
||||
|
||||
- **Strat GOLD partajat:** maparile **validate de oameni** (din `needs_mapping`, in
|
||||
ORICE cont) intra intr-un store partajat `denumire_normalizata -> cod`. Astfel
|
||||
validarea facuta de un service ridica increderea pentru toate. Cheia = denumire
|
||||
normalizata (scrub PII, lower, strip), nu textul brut.
|
||||
- **Strat SILVER:** etichetele LLM (bootstrap) — sugestii, NU auto-trimitere.
|
||||
- **Override per-cont:** daca un cont mapeaza explicit o denumire la alt cod decat
|
||||
cel partajat (conflict legitim de vocabular), override-ul contului castiga pentru
|
||||
acel cont. Conflictele inter-cont se rezolva cu provenienta + (optional) majoritate.
|
||||
|
||||
Confirmarile umane curg organic prin folosirea normala a editorului `needs_mapping`
|
||||
— FARA sesiune separata de adjudecare manuala (cerinta utilizator).
|
||||
|
||||
### Scara de incredere (runtime, per operatie din prezentare)
|
||||
|
||||
| Treapta | Sursa | Actiune | Frictiune |
|
||||
|---|---|---|---|
|
||||
| Certa | exact in stratul GOLD (validat de om, orice cont) sau override cont | auto-trimite | zero |
|
||||
| Inalta | embedding NN cu similaritate FOARTE inalta la o mapare GOLD + ensemble LLM unanim | auto-trimite (prag calibrat) | zero |
|
||||
| Medie | LLM silver / similaritate medie | `needs_mapping` cu sugestie pre-completata -> 1 click | minima |
|
||||
| Joasa | similaritate slaba / coduri apropiate | `needs_mapping` manual | normala |
|
||||
| NUL | non-operatie (ITP, discount, nr. inmatriculare) | marcat „nu e operatie", suprimat | — |
|
||||
|
||||
**Invariant F1 (pastrat):** o eticheta pur-LLM NEVALIDATA nu auto-trimite singura;
|
||||
auto-send cere ori GOLD (validat de om), ori treapta „inalta" calibrata. Tensiunea
|
||||
centrala (utilizatorul se bazeaza pe LLM, dar FINALIZATA e ireversibil) = intrebarea
|
||||
cheie pentru reviziile plan: unde fix se aseaza bara treptei „inalta".
|
||||
|
||||
## Integrare
|
||||
|
||||
- Stratul 1: tool CLI offline `tools/mapare-llm/` (exista: `or_common.py`,
|
||||
`or_modeltest.py`; de adaugat `or_label.py` cu grupare + propagare).
|
||||
- Stratul 2: `suggest_from_corpus` + similaritate embeddings in `app/mapping.py`,
|
||||
apelata in `pending_unmapped` pentru sugestia din editor. Model embedding incarcat
|
||||
la pornire / serviciu, vectori pre-calculati pe baza.
|
||||
- Stratul 3: store partajat (tabela noua `shared_mappings` sau coloana de scope pe
|
||||
`operations_mapping`), seed la confirmare umana; override per-cont.
|
||||
- Validare `valid_codes` pe tot lantul (exista).
|
||||
|
||||
## Non-obiective
|
||||
|
||||
- Nu inlocuim confirmarea umana pentru cazuri incerte.
|
||||
- Nu trimitem automat coduri sub prag / etichete LLM nevalidate.
|
||||
- Nu adaugam dependenta cloud la RUNTIME (LLM doar offline pentru etichetare).
|
||||
- Nu antrenam un LLM generativ local acum (viitor).
|
||||
|
||||
## Riscuri
|
||||
|
||||
- Etichete LLM gresite tratate ca adevar daca scapa garda F1 (seed direct in GOLD).
|
||||
- Ensemble aceeasi familie (NVIDIA) -> acord corelat-gresit; supraestimare incredere.
|
||||
- Strat partajat cross-account: o denumire poate insemna lucruri diferite la
|
||||
service-uri diferite -> conflict; mitigat prin override per-cont + provenienta.
|
||||
- Drift: denumiri noi neacoperite; embeddings ajuta dar nu elimina.
|
||||
- Free tier OpenRouter flaky (429/404, cap 50/zi) -> etichetarea bulk e lenta;
|
||||
e offline, deci tolerabil, dar nu pe calea critica de productie.
|
||||
- Model embedding ales: calitate pe limba romana de verificat empiric.
|
||||
|
||||
<!-- AUTONOMOUS DECISION LOG -->
|
||||
## Decision Audit Trail
|
||||
|
||||
| # | Faza | Decizie | Clasificare | Principiu | Rationament | Respins |
|
||||
|---|------|---------|-------------|-----------|-------------|---------|
|
||||
| 1 | Eng | Seed-ul NU intra direct in stratul auto-send; etichetele LLM = strat SILVER (sugestii). Auto-send cere GOLD (validat de om) sau treapta inalta calibrata | TASTE (critic) | P1, P5 | `resolve_prestatii`->`queued` direct => seed auto = AUTO-TRIMITERE ghiciri la FINALIZATA ireversibil (Premisa 3) | seed direct in auto-send |
|
||||
| 2 | Eng | Seeder = `INSERT OR IGNORE` / refuza overwrite pe randuri validate de om | MECHANICAL | P1 | re-rularea ar clobber-ui maparile umane cu ghiciri LLM | ON CONFLICT UPDATE |
|
||||
| 3 | Eng | Scrub regex (nr. inmatriculare/VIN) inainte de trimitere la LLM | TASTE | P1 | gunoiul contine `ITP CT 12 ABC` = nr. inmatriculare = PII | trimitere text brut |
|
||||
| 4 | Eng | NUL = ancore negative in corpus + lista supresie | MECHANICAL | P1 | altfel gunoiul recurent reintra mereu in needs_mapping si fuzzy ii da cod gresit | exclude NUL |
|
||||
| 5 | Eng | Coloana `source`/`confidence` (provenienta) pe baza de cunostinte | MECHANICAL | P1 | audit + rollback batch model prost + safe re-seed | fara provenienta |
|
||||
| 6 | Eng | Runtime = embeddings + clasificator mic (sklearn), NU LLM generativ | TASTE | P3, P5 | LLM generativ local prea lent (Premisa 4); embeddings CPU suficiente + rapide | LLM la runtime |
|
||||
| 8 | Eng | **SUPERSEDED:** corpus partajat cross-account (strat GOLD comun), NU per-cont izolat; override per-cont pe conflict | TASTE | P1, P2 | cerinta utilizator: validarea unui service ajuta toate; muncă compusa. Conflictul de vocabular rezolvat prin override + provenienta | (vechi: corpus strict per-cont) |
|
||||
| 9 | Eng | Furnizor etichetare = OpenRouter free, ensemble NVIDIA (super-120b + nano-9b); aruncat ultra-550b | MECHANICAL | P3 | masurat 2026-06-28: doar NVIDIA routeaza fiabil; ultra 4-5x lent fara castig | Groq (cap atins) / ultra |
|
||||
| 10 | Eng | Etichetare prioritizata pe frecventa + grupare pe similaritate (eticheteaza reprezentant, propaga) | MECHANICAL | P2 | acopera mult mai mult volum per apel; critic pe cap free ~50/zi | etichetare alfabetica |
|
||||
|
||||
## Istoric review (pre-pivot)
|
||||
|
||||
Versiunea anterioara a trecut prin `/autoplan` (mod SELECTIVE EXPANSION, subagent-only,
|
||||
Codex indisponibil). Constatari portante atunci: **F1 CRITIC** (seed=auto-send),
|
||||
F2/F3/F4 HIGH (idempotenta seed, scrub PII, ancore NUL), F5/F6/F7/F8 MEDIUM. Acele
|
||||
decizii sunt incorporate in Decision Audit Trail de mai sus. Pivotul 2026-06-28
|
||||
(LLM offline-only + runtime embeddings + strat partajat cross-account) NECESITA o
|
||||
noua rulare de review (CEO / Eng / Design) — de aceea sectiunea GSTACK REVIEW REPORT
|
||||
e goala momentan si se completeaza la urmatoarea rulare.
|
||||
|
||||
## GSTACK REVIEW REPORT
|
||||
|
||||
(de completat la rularea reviziilor pe versiunea pivotata — plan-ceo / plan-eng / plan-design)
|
||||
85
tools/mapare-llm/bigtest.py
Normal file
85
tools/mapare-llm/bigtest.py
Normal file
@@ -0,0 +1,85 @@
|
||||
import json, urllib.request, math, time, csv, glob, random, re, unicodedata
|
||||
|
||||
IP="10.0.20.161"; MODEL="nomic-embed-text"; N=140
|
||||
random.seed(42)
|
||||
|
||||
def embed(t):
|
||||
req=urllib.request.Request(f"http://{IP}:11434/api/embeddings",
|
||||
data=json.dumps({"model":MODEL,"prompt":t,"keep_alive":"30m"}).encode(),
|
||||
headers={"Content-Type":"application/json"})
|
||||
with urllib.request.urlopen(req,timeout=120) as r: return json.load(r)["embedding"]
|
||||
def cos(a,b): return sum(x*y for x,y in zip(a,b))/(math.sqrt(sum(x*x for x in a))*math.sqrt(sum(y*y for y in b)))
|
||||
|
||||
ANCORE={
|
||||
"OE-1":"REPARATIE: inlocuit sau reparat piesa defecta: placute frana, kit ambreaj, kit distributie, amortizoare, rulment, toba esapament, alternator, pompa, radiator, demontat montat piesa, vopsit usa aripa, reparat caroserie, vulcanizare, sudura",
|
||||
"OE-2":"INTRETINERE curenta: aerisit frane, gresat, curatat, verificat si completat nivele lichide, intretinere periodica minora",
|
||||
"OE-3":"REVIZIE PERIODICA la kilometri: schimb ulei motor si filtru ulei, filtru aer polen combustibil, revizie 15000 30000 60000 km",
|
||||
"OE-4":"REGLARE FUNCTIONALA: reglaj faruri, geometrie directie, supape, calibrare senzori, adaptare actuator, fara inlocuire piese",
|
||||
"OE-5":"MODIFICARE CONSTRUCTIVA: montare carlig remorcare, GPL, transformare omologata",
|
||||
"OE-6":"RECONSTRUCTIE vehicul avariat sever dupa dauna totala",
|
||||
"OE-7":"ACTUALIZARE SOFTWARE: update software calculator, programare ECU, codare module, flash",
|
||||
"OE-8":"INLOCUIRE SEZONIERA A ANVELOPELOR: montat anvelope iarna vara, schimb sezonier cauciucuri",
|
||||
"OE-D":"AVARIE GRAVA sistem directie in urma unui accident",
|
||||
"OE-F":"AVARIE GRAVA sistem franare in urma unui accident",
|
||||
"OE-C":"AVARIE GRAVA structura caroserie in urma unui accident",
|
||||
"OE-S":"AVARIE GRAVA structura sasiu in urma unui accident",
|
||||
"OE-R":"AVARIE GRAVA sistem retinere airbag centuri in urma unui accident",
|
||||
"OE-A":"AVARIE GRAVA sistem ADAS asistenta condus in urma unui accident",
|
||||
"OE-I":"ISTORIC INDICATIE ODOMETRU vehicule inmatriculate anterior in alte tari",
|
||||
"AITLV":"INREGISTRARE ATELIER inspectie tahografe limitatoare viteza",
|
||||
"R-ODO":"REPARATIE ODOMETRU kilometraj ceas bord",
|
||||
"I-ODO":"INLOCUIRE ODOMETRU kilometraj ceas bord"}
|
||||
|
||||
# heuristica de referinta (doar pe cazuri clare) pentru un semnal de acord
|
||||
def norm(s): return ''.join(c for c in unicodedata.normalize('NFD',s.upper()) if unicodedata.category(c)!='Mn')
|
||||
def heur(op):
|
||||
s=norm(op)
|
||||
if re.search(r'\bITP\b|ACHITAT|CONF\.|FACTUR|MANOPERA|DEPLAS|^[A-Z]{1,2} ?\d{2,3} ?[A-Z]{3}$',s): return "NUL"
|
||||
if 'ANVELOP' in s or 'CAUCIUC' in s or 'JANT' in s: return "OE-8"
|
||||
if 'SOFTWARE' in s or 'CODARE' in s or 'PROGRAMARE' in s or 'UPDATE' in s: return "OE-7"
|
||||
if 'REVIZIE' in s or ('ULEI' in s and 'MOTOR' in s) or 'FILTRU ULEI' in s: return "OE-3"
|
||||
if 'REGLAJ' in s or 'REGLARE' in s or 'GEOMETRIE' in s or 'CALIBRARE' in s: return "OE-4"
|
||||
if 'AERISIT' in s or 'GRESAT' in s or 'CURATAT' in s: return "OE-2"
|
||||
if s.startswith('INLOCUIT') or s.startswith('INLOC') or 'REPARAT' in s or s.startswith('D/R') or 'VOPSIT' in s or 'SCHIMBAT' in s or 'MONTAT' in s:
|
||||
return "OE-1"
|
||||
return None # necunoscut -> nu evaluam
|
||||
|
||||
# incarca toate operatiile distincte
|
||||
ops=set()
|
||||
for f in sorted(glob.glob("/workspace/autopass/docs/operatii-service/*.csv")):
|
||||
for r in list(csv.reader(open(f,encoding="utf-8",errors="replace"),delimiter=";"))[1:]:
|
||||
if len(r)>1 and r[1].strip(): ops.add(r[1].strip())
|
||||
ops=sorted(ops); sample=random.sample(ops,N)
|
||||
print(f"{len(ops)} operatii distincte; esantion random {N}\n",flush=True)
|
||||
|
||||
t0=time.time()
|
||||
anc=[(c,embed(d)) for c,d in ANCORE.items()]
|
||||
print(f"ancore embed: {time.time()-t0:.0f}s",flush=True)
|
||||
|
||||
THR=0.55 # prag de incredere
|
||||
res=[]
|
||||
for op in sample:
|
||||
e=embed(op)
|
||||
rang=sorted(((cos(e,v),c) for c,v in anc),reverse=True)
|
||||
sim,cod=rang[0]; sim2=rang[1][0]
|
||||
res.append((op,cod,sim,sim-sim2))
|
||||
|
||||
# statistici
|
||||
from collections import Counter
|
||||
dist=Counter(c for _,c,_,_ in res)
|
||||
acc=sum(1 for _,_,s,_ in res if s>=THR)
|
||||
amb=sum(1 for _,_,_,m in res if m<0.03)
|
||||
# acord cu heuristica pe subsetul clar
|
||||
ev=[(op,cod) for (op,cod,_,_) in res if heur(op) is not None]
|
||||
agree=sum(1 for op,cod in ev if heur(op)==cod)
|
||||
print(f"\n--- {N} operatii in {time.time()-t0:.0f}s ({(time.time()-t0)/N:.1f}s/op) ---")
|
||||
print("Distributie coduri:", dict(dist.most_common()))
|
||||
print(f"Peste prag {THR}: {acc}/{N} ({100*acc//N}%) | Ambigue(marja<0.03): {amb}")
|
||||
print(f"Acord cu heuristica pe {len(ev)} cazuri clare: {agree}/{len(ev)} ({100*agree//max(len(ev),1)}%)")
|
||||
print("\nDEZACORDURI fata de heuristica (de inspectat):")
|
||||
for op,cod in ev:
|
||||
if heur(op)!=cod: print(f" {op:<40} embed={cod:<6} heur={heur(op)}")
|
||||
print("\nESANTION (primele 45):")
|
||||
for op,cod,sim,m in res[:45]:
|
||||
flag="LOW" if sim<THR else ("AMB" if m<0.03 else "")
|
||||
print(f" {op:<42}{cod:<6}{sim:.3f} {flag}")
|
||||
81
tools/mapare-llm/eval_det.py
Normal file
81
tools/mapare-llm/eval_det.py
Normal file
@@ -0,0 +1,81 @@
|
||||
"""Evalueaza un clasificator DETERMINIST (fara AI la runtime) construit din
|
||||
etichetele Groq. Split 90/10: 'antrenam' pe 90% (lookup exact + fuzzy NN +
|
||||
Naive Bayes pe tokeni), testam pe 10% nevazute. Masuram acoperire + acuratete
|
||||
per strat si global, fata de etichetele Groq (referinta)."""
|
||||
import json, re, unicodedata, random, math, time, os
|
||||
from collections import defaultdict, Counter
|
||||
from rapidfuzz import process, fuzz
|
||||
|
||||
OUT="/tmp/claude-1000/-workspace-autopass/4177677c-7995-4fab-bbd5-16735cb335e3/scratchpad/labels.json"
|
||||
random.seed(7)
|
||||
|
||||
def norm(s):
|
||||
s=''.join(c for c in unicodedata.normalize('NFD',s.upper()) if unicodedata.category(c)!='Mn')
|
||||
s=re.sub(r'[^A-Z0-9/ ]',' ',s); s=re.sub(r'\s+',' ',s).strip()
|
||||
return s
|
||||
def toks(s): return [t for t in norm(s).split() if len(t)>1]
|
||||
|
||||
labels=json.load(open(OUT))
|
||||
items=list(labels.items())
|
||||
random.shuffle(items)
|
||||
cut=int(len(items)*0.9)
|
||||
train=items[:cut]; test=items[cut:]
|
||||
print(f"{len(items)} etichetate | train {len(train)} | test {len(test)}")
|
||||
|
||||
# --- strat 1: lookup exact normalizat ---
|
||||
exact={}
|
||||
for op,c in train: exact[norm(op)]=c # ultima castiga (rar conflicte)
|
||||
|
||||
# --- strat 2: fuzzy NN (rapidfuzz) ---
|
||||
train_norm=[norm(op) for op,_ in train]
|
||||
train_code=[c for _,c in train]
|
||||
norm2code={}
|
||||
for n,c in zip(train_norm,train_code): norm2code.setdefault(n,c)
|
||||
choices=list(norm2code.keys())
|
||||
FUZZ_THR=88
|
||||
|
||||
# --- strat 3: Naive Bayes pe tokeni (invatat din etichete) ---
|
||||
classes=Counter(c for _,c in train)
|
||||
prior={c:math.log(n/len(train)) for c,n in classes.items()}
|
||||
tok_cnt=defaultdict(lambda: defaultdict(int)); tok_tot=defaultdict(int)
|
||||
vocab=set()
|
||||
for op,c in train:
|
||||
for t in toks(op): tok_cnt[c][t]+=1; tok_tot[c]+=1; vocab.add(t)
|
||||
V=len(vocab)
|
||||
def nb(op):
|
||||
best=None; bests=-1e18
|
||||
for c in classes:
|
||||
s=prior[c]
|
||||
for t in toks(op):
|
||||
s+=math.log((tok_cnt[c][t]+1)/(tok_tot[c]+V))
|
||||
if s>bests: bests=s; best=c
|
||||
return best
|
||||
MAJ=classes.most_common(1)[0][0]
|
||||
|
||||
def predict(op):
|
||||
n=norm(op)
|
||||
if n in exact: return exact[n],"exact"
|
||||
m=process.extractOne(n,choices,scorer=fuzz.WRatio)
|
||||
if m and m[1]>=FUZZ_THR: return norm2code[m[0]],"fuzzy"
|
||||
if toks(op): return nb(op),"nb"
|
||||
return MAJ,"default"
|
||||
|
||||
t0=time.time()
|
||||
layer=Counter(); ok=Counter(); tot=Counter()
|
||||
mis=[]
|
||||
for op,truth in test:
|
||||
pred,lyr=predict(op)
|
||||
layer[lyr]+=1; tot[lyr]+=1
|
||||
if pred==truth: ok[lyr]+=1
|
||||
elif len(mis)<25: mis.append((op,pred,truth,lyr))
|
||||
dt=time.time()-t0
|
||||
TOTAL=len(test); OKALL=sum(ok.values())
|
||||
print(f"\nPredictie {TOTAL} cazuri in {dt:.2f}s ({1000*dt/TOTAL:.2f} ms/op) - FARA AI")
|
||||
print(f"\nACURATETE GLOBALA (vs Groq): {OKALL}/{TOTAL} = {100*OKALL/TOTAL:.1f}%")
|
||||
print(f"\n{'strat':<8}{'aparitii':>9}{'corecte':>9}{'acuratete':>11}{'acoperire':>11}")
|
||||
for lyr in ["exact","fuzzy","nb","default"]:
|
||||
if tot[lyr]:
|
||||
print(f"{lyr:<8}{tot[lyr]:>9}{ok[lyr]:>9}{100*ok[lyr]/tot[lyr]:>10.1f}%{100*tot[lyr]/TOTAL:>10.1f}%")
|
||||
print("\nExemple gresite (pred != Groq):")
|
||||
for op,p,t,l in mis[:20]:
|
||||
print(f" [{l}] {op:<42} pred={p:<6} groq={t}")
|
||||
86
tools/mapare-llm/f7_ensemble.py
Normal file
86
tools/mapare-llm/f7_ensemble.py
Normal file
@@ -0,0 +1,86 @@
|
||||
import json, urllib.request, urllib.error, time, os, csv, glob, random, re
|
||||
from collections import Counter
|
||||
|
||||
KEY=os.environ["GROQ_KEY"]; N=150; BATCH=30
|
||||
MODELS=["llama-3.3-70b-versatile","openai/gpt-oss-120b","qwen/qwen3-32b"]
|
||||
OUT="/tmp/claude-1000/-workspace-autopass/4177677c-7995-4fab-bbd5-16735cb335e3/scratchpad/f7_result.json"
|
||||
random.seed(123)
|
||||
|
||||
CODURI=("OE-1=REPARATIE, OE-2=INTRETINERE, OE-3=REVIZIE PERIODICA, OE-4=REGLARE FUNCTIONALA, "
|
||||
"OE-5=MODIFICARE CONSTRUCTIVA, OE-6=RECONSTRUCTIE, OE-7=ACTUALIZARE SOFTWARE, "
|
||||
"OE-8=INLOCUIRE SEZONIERA ANVELOPE, OE-D=AVARIE GRAVA DIRECTIE, OE-F=AVARIE GRAVA FRANARE, "
|
||||
"OE-C=AVARIE GRAVA CAROSERIE, OE-S=AVARIE GRAVA SASIU, OE-R=AVARIE GRAVA RETINERE/AIRBAG, "
|
||||
"OE-A=AVARIE GRAVA ADAS, OE-I=ISTORIC ODOMETRU, AITLV=ATELIER TAHOGRAFE, "
|
||||
"R-ODO=REPARATIE ODOMETRU, I-ODO=INLOCUIRE ODOMETRU, NUL=NU e operatie de service")
|
||||
SYS=("Esti expert RAR AUTOPASS. Clasifici fiecare operatie de service-auto in EXACT unul din coduri:\n"+CODURI+
|
||||
"\nReguli: AVARIILE GRAVE (OE-D/F/C/S/R/A) DOAR pentru daune in urma unui accident, NU reparatii curente. "
|
||||
"Vopsire/revopsire/retus = REPARATIE (OE-1). Inlocuire/D-R/reparare piese = REPARATIE (OE-1). "
|
||||
"Schimb ulei motor + filtre = REVIZIE (OE-3). Aerisit/gresat/completat nivele = INTRETINERE (OE-2). "
|
||||
"Text care nu e operatie efectiva (ITP, plata, discount, manopera generica, nr inmatriculare, doar nume piesa) -> NUL. "
|
||||
"Raspunde DOAR JSON {\"rez\":[{\"i\":<numar>,\"cod\":\"...\"}]}.")
|
||||
|
||||
# F3: scrub PII (nr inmatriculare) inainte de trimitere
|
||||
PLATE=re.compile(r'\b[A-Z]{1,2}\s?\d{2,3}\s?[A-Z]{3}\b')
|
||||
VIN=re.compile(r'\b[A-HJ-NPR-Z0-9]{17}\b')
|
||||
def scrub(s): return VIN.sub('[VIN]',PLATE.sub('[NR]',s))
|
||||
|
||||
def call(model,batch):
|
||||
msgs=[{"role":"system","content":SYS},
|
||||
{"role":"user","content":"\n".join(f"{i+1}. {scrub(o)}" for i,o in enumerate(batch))}]
|
||||
body={"model":model,"messages":msgs,"temperature":0,"response_format":{"type":"json_object"}}
|
||||
data=json.dumps(body).encode()
|
||||
for attempt in range(8):
|
||||
req=urllib.request.Request("https://api.groq.com/openai/v1/chat/completions",
|
||||
data=data,headers={"Authorization":f"Bearer {KEY}","Content-Type":"application/json","User-Agent":"Mozilla/5.0"})
|
||||
try:
|
||||
with urllib.request.urlopen(req,timeout=180) as r: d=json.load(r)
|
||||
out=json.loads(d["choices"][0]["message"]["content"])["rez"]
|
||||
m={x["i"]:x["cod"] for x in out}
|
||||
return [m.get(i+1,"?") for i in range(len(batch))]
|
||||
except urllib.error.HTTPError as e:
|
||||
if e.code in (429,500,502,503):
|
||||
wait=float(e.headers.get("retry-after",0)) or min(2**attempt,30); time.sleep(wait); continue
|
||||
raise
|
||||
except Exception:
|
||||
time.sleep(min(2**attempt,20)); continue
|
||||
return ["?"]*len(batch)
|
||||
|
||||
# corpus + esantion random
|
||||
ops=set()
|
||||
for f in sorted(glob.glob("/workspace/autopass/docs/operatii-service/*.csv")):
|
||||
for r in list(csv.reader(open(f,encoding="utf-8",errors="replace"),delimiter=";"))[1:]:
|
||||
if len(r)>1 and r[1].strip(): ops.add(r[1].strip())
|
||||
sample=random.sample(sorted(ops),N)
|
||||
print(f"esantion random {N} din {len(ops)} distincte",flush=True)
|
||||
|
||||
votes={m:[] for m in MODELS}
|
||||
t0=time.time()
|
||||
for m in MODELS:
|
||||
res=[]
|
||||
nb=(N+BATCH-1)//BATCH
|
||||
for bi,k in enumerate(range(0,N,BATCH)):
|
||||
res+=call(m,sample[k:k+BATCH])
|
||||
print(f" {m} batch {bi+1}/{nb} ({time.time()-t0:.0f}s)",flush=True)
|
||||
time.sleep(6) # pacing sub TPM 12000
|
||||
votes[m]=res
|
||||
print(f" {m}: GATA ({time.time()-t0:.0f}s)",flush=True)
|
||||
|
||||
rows=[]
|
||||
for i,op in enumerate(sample):
|
||||
vs=[votes[m][i] for m in MODELS]
|
||||
c=Counter(vs); top,cnt=c.most_common(1)[0]
|
||||
level=3 if cnt==3 else (2 if cnt==2 else 1)
|
||||
rows.append({"op":op,"votes":vs,"cod":top,"agree":level})
|
||||
|
||||
json.dump(rows,open(OUT,"w"),ensure_ascii=False,indent=1)
|
||||
a3=[r for r in rows if r["agree"]==3]; a2=[r for r in rows if r["agree"]==2]; a1=[r for r in rows if r["agree"]==1]
|
||||
print(f"\n=== F7 ENSEMBLE ({N} ops, {time.time()-t0:.0f}s) ===")
|
||||
print(f"ACORD 3/3 (candidat auto-send): {len(a3)} ({100*len(a3)//N}%)")
|
||||
print(f"ACORD 2/3: {len(a2)} ({100*len(a2)//N}%)")
|
||||
print(f"DEZACORD total (1+1+1): {len(a1)} ({100*len(a1)//N}%)")
|
||||
n3=sum(1 for r in a3 if r['cod']=='NUL')
|
||||
print(f" din 3/3: {n3} sunt NUL (gunoi), {len(a3)-n3} coduri reale")
|
||||
print(f"\nrezultat complet salvat: {OUT}")
|
||||
print("\n--- ACORD 2/3 si DEZACORD (astea ar merge la needs_mapping) ---")
|
||||
for r in a2+a1:
|
||||
print(f" {r['op']:<42} {r['cod']:<6} voturi={r['votes']}")
|
||||
61
tools/mapare-llm/label_common.py
Normal file
61
tools/mapare-llm/label_common.py
Normal file
@@ -0,0 +1,61 @@
|
||||
import json, urllib.request, urllib.error, time, os, csv, glob, re
|
||||
from collections import Counter
|
||||
|
||||
KEY=os.environ["GROQ_KEY"]; MODEL="llama-3.3-70b-versatile"; BATCH=40
|
||||
OUT="/tmp/claude-1000/-workspace-autopass/4177677c-7995-4fab-bbd5-16735cb335e3/scratchpad/labels.json"
|
||||
|
||||
CODURI=("OE-1=REPARATIE, OE-2=INTRETINERE, OE-3=REVIZIE PERIODICA, OE-4=REGLARE FUNCTIONALA, "
|
||||
"OE-5=MODIFICARE CONSTRUCTIVA, OE-6=RECONSTRUCTIE, OE-7=ACTUALIZARE SOFTWARE, "
|
||||
"OE-8=INLOCUIRE SEZONIERA ANVELOPE, OE-D=AVARIE GRAVA DIRECTIE, OE-F=AVARIE GRAVA FRANARE, "
|
||||
"OE-C=AVARIE GRAVA CAROSERIE, OE-S=AVARIE GRAVA SASIU, OE-R=AVARIE GRAVA RETINERE/AIRBAG, "
|
||||
"OE-A=AVARIE GRAVA ADAS, OE-I=ISTORIC ODOMETRU, AITLV=ATELIER TAHOGRAFE, "
|
||||
"R-ODO=REPARATIE ODOMETRU, I-ODO=INLOCUIRE ODOMETRU, NUL=NU e operatie de service")
|
||||
SYS=("Esti expert RAR AUTOPASS. Clasifici fiecare operatie de service-auto in EXACT unul din coduri:\n"+CODURI+
|
||||
"\nReguli: AVARIILE GRAVE DOAR pentru daune in urma unui accident, NU reparatii curente. "
|
||||
"Vopsire/revopsire/retus = REPARATIE (OE-1). Inlocuire/D-R/reparare piese = REPARATIE (OE-1). "
|
||||
"Schimb ulei motor + filtre = REVIZIE (OE-3). Aerisit/gresat/completat nivele = INTRETINERE (OE-2). "
|
||||
"Text care nu e operatie efectiva (ITP, plata, discount, manopera generica, nr inmatriculare, doar nume piesa) -> NUL. "
|
||||
"Raspunde DOAR JSON {\"rez\":[{\"i\":<numar>,\"cod\":\"...\"}]}.")
|
||||
PLATE=re.compile(r'\b[A-Z]{1,2}\s?\d{2,3}\s?[A-Z]{3}\b'); VIN=re.compile(r'\b[A-HJ-NPR-Z0-9]{17}\b')
|
||||
def scrub(s): return VIN.sub('[VIN]',PLATE.sub('[NR]',s))
|
||||
|
||||
def classify(batch):
|
||||
msgs=[{"role":"system","content":SYS},{"role":"user","content":"\n".join(f"{i+1}. {scrub(o)}" for i,o in enumerate(batch))}]
|
||||
body={"model":MODEL,"messages":msgs,"temperature":0,"response_format":{"type":"json_object"}}
|
||||
data=json.dumps(body).encode()
|
||||
for attempt in range(8):
|
||||
req=urllib.request.Request("https://api.groq.com/openai/v1/chat/completions",data=data,
|
||||
headers={"Authorization":f"Bearer {KEY}","Content-Type":"application/json","User-Agent":"Mozilla/5.0"})
|
||||
try:
|
||||
with urllib.request.urlopen(req,timeout=180) as r: d=json.load(r)
|
||||
m={x["i"]:x["cod"] for x in json.loads(d["choices"][0]["message"]["content"])["rez"]}
|
||||
return [m.get(i+1,"?") for i in range(len(batch))]
|
||||
except urllib.error.HTTPError as e:
|
||||
if e.code in (429,500,502,503):
|
||||
time.sleep(float(e.headers.get("retry-after",0)) or min(2**attempt,30)); continue
|
||||
raise
|
||||
except Exception:
|
||||
time.sleep(min(2**attempt,20)); continue
|
||||
return ["?"]*len(batch)
|
||||
|
||||
# presence in CSV-uri
|
||||
files=sorted(glob.glob("/workspace/autopass/docs/operatii-service/*.csv"))
|
||||
presence=Counter()
|
||||
for f in files:
|
||||
seen=set()
|
||||
for r in list(csv.reader(open(f,encoding="utf-8",errors="replace"),delimiter=";"))[1:]:
|
||||
if len(r)>1 and r[1].strip(): seen.add(r[1].strip())
|
||||
for op in seen: presence[op]+=1
|
||||
|
||||
labels=json.load(open(OUT))
|
||||
todo=sorted([op for op,c in presence.items() if c>=2 and op not in labels])
|
||||
print(f"comune (>=2 service) de etichetat: {len(todo)} (peste {len(labels)} deja)",flush=True)
|
||||
|
||||
t0=time.time(); nb=(len(todo)+BATCH-1)//BATCH
|
||||
for bi,k in enumerate(range(0,len(todo),BATCH)):
|
||||
b=todo[k:k+BATCH]
|
||||
for o,c in zip(b,classify(b)): labels[o]=c
|
||||
json.dump(labels,open(OUT,"w"),ensure_ascii=False)
|
||||
print(f" batch {bi+1}/{nb} -> total {len(labels)} ({time.time()-t0:.0f}s)",flush=True)
|
||||
time.sleep(4)
|
||||
print(f"GATA comune: {len(labels)} etichete totale ({time.time()-t0:.0f}s)",flush=True)
|
||||
1
tools/mapare-llm/labels-groq-partial.json
Normal file
1
tools/mapare-llm/labels-groq-partial.json
Normal file
File diff suppressed because one or more lines are too long
1570
tools/mapare-llm/modeltest-result.json
Normal file
1570
tools/mapare-llm/modeltest-result.json
Normal file
File diff suppressed because it is too large
Load Diff
112
tools/mapare-llm/or_common.py
Normal file
112
tools/mapare-llm/or_common.py
Normal file
@@ -0,0 +1,112 @@
|
||||
"""Comun pentru etichetarea operatii->coduri RAR prin OpenRouter (modele FREE).
|
||||
|
||||
Difera de tooling-ul Groq (label_common.py / f7_ensemble.py) prin:
|
||||
- endpoint OpenRouter (OpenAI-compatibil), cheie din .env (nu env exportat);
|
||||
- corpus ordonat pe FRECVENTA (suma NR per denumire distincta), nu alfabetic.
|
||||
|
||||
Refoloseste IDENTIC: cele 18 coduri RAR, promptul de sistem si scrub-ul PII (F3).
|
||||
"""
|
||||
import json, urllib.request, urllib.error, time, os, csv, glob, re
|
||||
from collections import Counter
|
||||
|
||||
# --- cheie din .env (gitignored). Tool-urile Groq citeau os.environ; aici din fisier,
|
||||
# fiindca shell-ul non-interactiv nu pastreaza export-urile intre apeluri. ---
|
||||
def _load_key():
|
||||
if os.environ.get("OPENROUTER_KEY"):
|
||||
return os.environ["OPENROUTER_KEY"]
|
||||
env = os.path.join(os.path.dirname(__file__), "..", "..", ".env")
|
||||
for line in open(env, encoding="utf-8", errors="replace"):
|
||||
line = line.strip()
|
||||
if line.startswith("OPENROUTER_KEY="):
|
||||
return line.split("=", 1)[1].strip()
|
||||
raise RuntimeError("OPENROUTER_KEY lipseste din .env si din mediu")
|
||||
|
||||
KEY = _load_key()
|
||||
URL = "https://openrouter.ai/api/v1/chat/completions"
|
||||
|
||||
# --- nomenclator + prompt: identic cu label_common.py / f7_ensemble.py (sursa de adevar) ---
|
||||
CODURI = ("OE-1=REPARATIE, OE-2=INTRETINERE, OE-3=REVIZIE PERIODICA, OE-4=REGLARE FUNCTIONALA, "
|
||||
"OE-5=MODIFICARE CONSTRUCTIVA, OE-6=RECONSTRUCTIE, OE-7=ACTUALIZARE SOFTWARE, "
|
||||
"OE-8=INLOCUIRE SEZONIERA ANVELOPE, OE-D=AVARIE GRAVA DIRECTIE, OE-F=AVARIE GRAVA FRANARE, "
|
||||
"OE-C=AVARIE GRAVA CAROSERIE, OE-S=AVARIE GRAVA SASIU, OE-R=AVARIE GRAVA RETINERE/AIRBAG, "
|
||||
"OE-A=AVARIE GRAVA ADAS, OE-I=ISTORIC ODOMETRU, AITLV=ATELIER TAHOGRAFE, "
|
||||
"R-ODO=REPARATIE ODOMETRU, I-ODO=INLOCUIRE ODOMETRU, NUL=NU e operatie de service")
|
||||
SYS = ("Esti expert RAR AUTOPASS. Clasifici fiecare operatie de service-auto in EXACT unul din coduri:\n" + CODURI +
|
||||
"\nReguli: AVARIILE GRAVE (OE-D/F/C/S/R/A) DOAR pentru daune in urma unui accident, NU reparatii curente. "
|
||||
"Vopsire/revopsire/retus = REPARATIE (OE-1). Inlocuire/D-R/reparare piese = REPARATIE (OE-1). "
|
||||
"Schimb ulei motor + filtre = REVIZIE (OE-3). Aerisit/gresat/completat nivele = INTRETINERE (OE-2). "
|
||||
"Text care nu e operatie efectiva (ITP, plata, discount, manopera generica, nr inmatriculare, doar nume piesa) -> NUL. "
|
||||
"Raspunde DOAR JSON {\"rez\":[{\"i\":<numar>,\"cod\":\"...\"}]}.")
|
||||
|
||||
# --- F3: scrub PII inainte de a trimite la LLM ---
|
||||
PLATE = re.compile(r'\b[A-Z]{1,2}\s?\d{2,3}\s?[A-Z]{3}\b')
|
||||
VIN = re.compile(r'\b[A-HJ-NPR-Z0-9]{17}\b')
|
||||
def scrub(s): return VIN.sub('[VIN]', PLATE.sub('[NR]', s))
|
||||
|
||||
VALID = {c.split("=")[0] for c in CODURI.replace(", ", ",").split(",")}
|
||||
|
||||
|
||||
def call(model, batch, timeout=180, max_attempts=6):
|
||||
"""Un apel OpenRouter pe un batch. Intoarce (coduri, meta) unde meta are latenta si erori.
|
||||
|
||||
coduri: lista paralela cu batch; "?" pe pozitiile fara raspuns / parse-fail.
|
||||
"""
|
||||
msgs = [{"role": "system", "content": SYS},
|
||||
{"role": "user", "content": "\n".join(f"{i+1}. {scrub(o)}" for i, o in enumerate(batch))}]
|
||||
body = {"model": model, "messages": msgs, "temperature": 0,
|
||||
"response_format": {"type": "json_object"}}
|
||||
data = json.dumps(body).encode()
|
||||
t0 = time.time()
|
||||
for attempt in range(max_attempts):
|
||||
req = urllib.request.Request(URL, data=data, headers={
|
||||
"Authorization": f"Bearer {KEY}", "Content-Type": "application/json",
|
||||
"User-Agent": "Mozilla/5.0", # WAF: Python-urllib -> 403
|
||||
"HTTP-Referer": "https://gitea.romfast.ro/romfast/autopass",
|
||||
"X-Title": "autopass-mapare-llm"})
|
||||
try:
|
||||
with urllib.request.urlopen(req, timeout=timeout) as r:
|
||||
d = json.load(r)
|
||||
content = d["choices"][0]["message"]["content"]
|
||||
out = json.loads(content)["rez"]
|
||||
m = {x["i"]: x["cod"] for x in out}
|
||||
codes = [m.get(i + 1, "?") for i in range(len(batch))]
|
||||
return codes, {"ms": int((time.time() - t0) * 1000), "err": None}
|
||||
except urllib.error.HTTPError as e:
|
||||
if e.code in (429, 500, 502, 503):
|
||||
wait = float(e.headers.get("retry-after", 0)) or min(2 ** attempt, 30)
|
||||
time.sleep(wait); continue
|
||||
return ["?"] * len(batch), {"ms": int((time.time() - t0) * 1000), "err": f"HTTP {e.code}"}
|
||||
except Exception as e:
|
||||
if attempt < max_attempts - 1:
|
||||
time.sleep(min(2 ** attempt, 20)); continue
|
||||
return ["?"] * len(batch), {"ms": int((time.time() - t0) * 1000), "err": type(e).__name__}
|
||||
return ["?"] * len(batch), {"ms": int((time.time() - t0) * 1000), "err": "max_attempts"}
|
||||
|
||||
|
||||
def corpus_by_freq():
|
||||
"""Toate denumirile distincte, cu frecventa = suma NR pe toate CSV-urile, desc.
|
||||
|
||||
Intoarce lista de (denop, nr_total). NR = de cate ori apare denumirea in prezentari.
|
||||
"""
|
||||
freq = Counter()
|
||||
for f in sorted(glob.glob(os.path.join(os.path.dirname(__file__), "..", "..",
|
||||
"docs", "operatii-service", "*.csv"))):
|
||||
for r in list(csv.reader(open(f, encoding="utf-8", errors="replace"), delimiter=";"))[1:]:
|
||||
if len(r) > 2 and r[1].strip():
|
||||
try:
|
||||
freq[r[1].strip()] += int(r[2].strip() or 0)
|
||||
except ValueError:
|
||||
freq[r[1].strip()] += 0
|
||||
return freq.most_common()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
c = corpus_by_freq()
|
||||
tot = sum(n for _, n in c)
|
||||
print(f"distincte: {len(c)} volum total (suma NR): {tot}")
|
||||
for cut in (100, 500, 1000):
|
||||
cov = sum(n for _, n in c[:cut])
|
||||
print(f" top {cut}: {100*cov/tot:.1f}% din volum")
|
||||
print("--- top 15 dupa frecventa ---")
|
||||
for op, n in c[:15]:
|
||||
print(f" {n:>6} {op}")
|
||||
137
tools/mapare-llm/or_modeltest.py
Normal file
137
tools/mapare-llm/or_modeltest.py
Normal file
@@ -0,0 +1,137 @@
|
||||
"""Compara modele FREE OpenRouter la clasificarea operatii->coduri RAR (RO).
|
||||
|
||||
Ruleaza fiecare model candidat pe top-N denumiri DUPA FRECVENTA (cele care conteaza
|
||||
la volum), si raporteaza per model:
|
||||
- latenta (ms/batch), rata de eroare/parse-fail (cate "?"),
|
||||
- cate NUL detecteaza (gunoi), distributia codurilor,
|
||||
- acord cu etichetele Groq existente (labels-groq-partial.json) ca referinta silver,
|
||||
- acord pereche intre modele + vot majoritar (candidat treapta auto-send).
|
||||
|
||||
Salveaza voturile brute in modeltest-result.json pentru adjudicare de catre om.
|
||||
|
||||
Rulare: python3 tools/mapare-llm/or_modeltest.py [N] [model1 model2 ...]
|
||||
N = cate denumiri (top dupa frecventa). Default 120.
|
||||
modelN = override lista de modele. Default = set curat din modele free live.
|
||||
"""
|
||||
import sys, os, json, time
|
||||
from collections import Counter
|
||||
sys.path.insert(0, os.path.dirname(__file__))
|
||||
import or_common as oc
|
||||
|
||||
HERE = os.path.dirname(__file__)
|
||||
GROQ_LABELS = os.path.join(HERE, "labels-groq-partial.json")
|
||||
OUT = os.path.join(HERE, "modeltest-result.json")
|
||||
BATCH = 40 # batch mare = mai putine cereri (cap free tier ~50/zi fara credit)
|
||||
PACE = 4.0 # sec intre batch-uri (free tier OpenRouter ~20 req/min)
|
||||
|
||||
# Set FIABIL pe free tier (probat live 2026-06-28): doar familia NVIDIA Nemotron
|
||||
# routeaza fara 429/404. llama/qwen/gemma/gpt-oss/hermes = rate-limited sau provider
|
||||
# blocat. CAVEAT F7: aceeasi familie -> acordul supraestimeaza increderea; scale
|
||||
# diferite (9B/120B/550B) dau totusi divergenta pe cazuri grele.
|
||||
DEFAULT_MODELS = [
|
||||
"nvidia/nemotron-3-super-120b-a12b:free", # 120B, rapid (~3s)
|
||||
"nvidia/nemotron-nano-9b-v2:free", # 9B, scala mica
|
||||
"nvidia/nemotron-3-ultra-550b-a55b:free", # 550B, lent (~36s) dar capabil
|
||||
]
|
||||
|
||||
|
||||
def run_model(model, sample):
|
||||
codes, total_ms, errs = [], 0, []
|
||||
nb = (len(sample) + BATCH - 1) // BATCH
|
||||
for bi, k in enumerate(range(0, len(sample), BATCH)):
|
||||
batch = sample[k:k + BATCH]
|
||||
c, meta = oc.call(model, batch)
|
||||
codes += c
|
||||
total_ms += meta["ms"]
|
||||
if meta["err"]:
|
||||
errs.append(meta["err"])
|
||||
print(f" {model:<45} batch {bi+1}/{nb} {meta['ms']}ms err={meta['err']}", flush=True)
|
||||
time.sleep(PACE)
|
||||
return codes, total_ms, errs
|
||||
|
||||
|
||||
def main():
|
||||
args = sys.argv[1:]
|
||||
n = 120
|
||||
models = DEFAULT_MODELS
|
||||
if args and args[0].isdigit():
|
||||
n = int(args[0]); args = args[1:]
|
||||
if args:
|
||||
models = args
|
||||
|
||||
corpus = oc.corpus_by_freq()
|
||||
sample = [op for op, _ in corpus[:n]]
|
||||
freq = {op: nr for op, nr in corpus[:n]}
|
||||
vol_total = sum(freq.values())
|
||||
print(f"esantion: top {n} dupa frecventa = {vol_total} volum "
|
||||
f"({100*vol_total/sum(nr for _,nr in corpus):.1f}% din total)\n", flush=True)
|
||||
|
||||
groq = {}
|
||||
if os.path.exists(GROQ_LABELS):
|
||||
groq = json.load(open(GROQ_LABELS, encoding="utf-8"))
|
||||
|
||||
results = {}
|
||||
t0 = time.time()
|
||||
for m in models:
|
||||
print(f"=== {m} ===", flush=True)
|
||||
codes, total_ms, errs = run_model(m, sample)
|
||||
results[m] = {"codes": codes, "total_ms": total_ms, "errs": errs}
|
||||
print(f" -> {total_ms/1000:.0f}s total\n", flush=True)
|
||||
|
||||
# vot majoritar + nivel de acord, ponderat pe frecventa
|
||||
rows = []
|
||||
for i, op in enumerate(sample):
|
||||
votes = {m: results[m]["codes"][i] for m in models}
|
||||
valid = [v for v in votes.values() if v not in ("?",)]
|
||||
c = Counter(valid)
|
||||
top, cnt = (c.most_common(1)[0] if c else ("?", 0))
|
||||
rows.append({"op": op, "nr": freq[op], "votes": votes,
|
||||
"maj": top, "agree": cnt, "n_models": len(models),
|
||||
"groq": groq.get(op)})
|
||||
|
||||
json.dump({"models": models, "n": n, "rows": rows}, open(OUT, "w"),
|
||||
ensure_ascii=False, indent=1)
|
||||
|
||||
# --- raport per model ---
|
||||
print("=" * 78)
|
||||
print(f"RAPORT ({n} ops, {time.time()-t0:.0f}s, ponderare pe frecventa NR)")
|
||||
print("=" * 78)
|
||||
print(f"{'model':<46} {'ms/op':>6} {'?fail':>6} {'NUL':>5} {'~Groq':>7}")
|
||||
for m in models:
|
||||
codes = results[m]["codes"]
|
||||
fails = sum(1 for x in codes if x == "?")
|
||||
nul = sum(1 for x in codes if x == "NUL")
|
||||
# acord vs Groq pe overlap (ponderat pe frecventa)
|
||||
ov_w = ov_match = 0
|
||||
for i, op in enumerate(sample):
|
||||
g = groq.get(op)
|
||||
if g and codes[i] != "?":
|
||||
ov_w += freq[op]
|
||||
if codes[i] == g:
|
||||
ov_match += freq[op]
|
||||
agr = f"{100*ov_match/ov_w:.0f}%" if ov_w else "n/a"
|
||||
msop = results[m]["total_ms"] / max(1, len(codes))
|
||||
print(f"{m:<46} {msop:>6.0f} {fails:>6} {nul:>5} {agr:>7}")
|
||||
|
||||
# --- acord ensemble ponderat pe frecventa ---
|
||||
print("\n--- ACORD ENSEMBLE (ponderat pe volum) ---")
|
||||
nm = len(models)
|
||||
for lvl in range(nm, 0, -1):
|
||||
w = sum(r["nr"] for r in rows if r["agree"] == lvl)
|
||||
cnt = sum(1 for r in rows if r["agree"] == lvl)
|
||||
tag = " <- candidat auto-send" if lvl == nm else ""
|
||||
print(f" acord {lvl}/{nm}: {cnt:>4} ops, {100*w/vol_total:.0f}% volum{tag}")
|
||||
unan = [r for r in rows if r["agree"] == nm]
|
||||
nul_un = sum(1 for r in unan if r["maj"] == "NUL")
|
||||
print(f" din unanim {nm}/{nm}: {nul_un} NUL (gunoi), {len(unan)-nul_un} coduri reale")
|
||||
|
||||
print(f"\nbrut salvat: {OUT}")
|
||||
print("--- esantion dezacord (volum mare, de adjudecat de om) ---")
|
||||
disp = sorted([r for r in rows if r["agree"] < nm], key=lambda r: -r["nr"])[:20]
|
||||
for r in disp:
|
||||
vs = "/".join(sorted(set(r["votes"].values())))
|
||||
print(f" {r['nr']:>5} {r['op']:<40} maj={r['maj']:<6} ({vs})")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user