🔍
Audyt tłumaczeń
⚡ experimentalSkan katalogu pod kątem polish leak (eksperymentalny — czeka na podpięcie)
Wkrótce — na razie skrypty CLI w `procesy/wycieki-polskiego/`
Realne wykonanie: skrypty CLI
Czas: ~30min audyt + zależnie od scope naprawy
Co robi ten tryb
Planowany jako follow-up po findingach stróża. Realnym backendem są skrypty CLI (`procesy/wycieki-polskiego/verify_FINAL.py` + step `0_fetch...` → `3b_upload_smart_resume.py`). Webapp UI dla tego trybu jeszcze nie powstał — wracamy do niego po deploy TOP3.
Kiedy używać
- Cykliczny audyt jakości tłumaczeń
- Po większym uploadzie sprawdzić co poszło źle
- Follow-up po stróżu (kindy: polish_leak / brak_h3 / duplikat_widgetu)
⚙️ Realny pipeline (bioshi-score-v2)
path
procesy/wycieki-polskiego/ (skrypty CLI)
main_module
verify_FINAL.py + identify_retranslate_gaps.py + 0..3b_*.py
ai_model
gemini-2.5-flash (weryfikator)
status
CLI tylko — Flask UI do dorobienia
To są ścieżki do kodu w drugim projekcie na pulpicie — webapp w przyszłości będzie te skrypty triggerował automatycznie zamiast wymagać uruchomienia z `.bat`.
Szczegółowa instrukcja procesu
6automatycznych
1manualnych
Łącznie:~30min audyt + zależnie od scope naprawy
0
Pobranie katalogu z IdoSell
🤖 auto
⏱ ~3-5 min
📥 3 input(ów) · 📤 2 output(ów) · 📝 6 sub-kroków
▼
📝 Sub-kroki
- 0.1 Autentykacja: Service Account (Secret Manager) lub API key
- 0.2 Bulk GET `/products` z paginacją (batch 100/request)
- 0.3 Per produkt: wyciągnięcie `productLongDescriptions` per lang_code
- 0.4 Normalizacja: EAN + nazwa pol + opis html pol + per lang (name, long_desc)
- 0.5 Filtrowanie subset (jeśli scope='subset' ze stróża)
- 0.6 Zapis CSV + metadanych
📥 Input
- IdoSell REST API (`/api/admin/v8/products/products`)
- Config: `config/core/shared_config.json` (IdoSell API key)
- Opcjonalnie: lista EAN-ów do auditowania (subset, np. ze stróża)
📤 Output
- `audit_catalog.csv` — EAN, nazwa pol, opis html pol + per język (name, long_desc)
- `audit_metadata.json` — liczba produktów, języków, timestamp
⚠️ Ryzyka
- IdoSell API timeout na >50k → paginacja + exponential backoff
- Brakujące tłumaczenia → flagging jako 'EMPTY' w step 1
- Stare dane w cache IdoSell (24h) → info w logu
🔔 Slack: Log start: liczba produktów + języków + scope (subset/full)
💾 Archiwum:
audit_catalog_{ts}.csvaudit_metadata_{ts}.json1
Audyt 6 kategorii błędów (verify_FINAL.py)
🤖 auto
⏱ ~5-15 min
📥 3 input(ów) · 📤 2 output(ów) · 📝 13 sub-kroków
▼
📝 Sub-kroki
- 1.1 Loop per produkt × język
- 1.2 KAT 1 Empty: long_desc pusty/null/whitespace only
- 1.3 KAT 2 Polish leak — 4 metody w jednym kroku (`verify_FINAL.py`):
- • `pol_kw()` — keyword regex (się, oraz, ż, ł, ą, itd. + maltese exception)
- • `pol_chars()` — unique polish diacritics count
- • `pol_words()` — characteristic polish words list
- • `langdetect` → flag `detected_pl` jeśli zwraca 'pol' dla lang≠pol
- 1.4 KAT 3 Widget leak: niezdekodowane etykiety widgetu Bioshi w lang≠pol (np. `Skład` pojawia się w niemieckim opisie)
- 1.5 KAT 4 Markdown: surowy markdown (`**`, `##`) który nie został przerenderowany do HTML
- 1.6 KAT 5 Too short: long_desc < N znaków (threshold per język)
- 1.7 KAT 6 Wrong language: `langdetect` zwraca inny język niż docelowy (np. niemiecki opis wykryty jako francuski)
- 1.8 Output: per (EAN, lang) wiersz z 9 flagami (4 polish leak metody zliczane osobno)
- UWAGA: kategorie h3_mismatch, dup_widget, missing_sections, format_inconsistency, broken_html — TO ROZSZERZENIA WEBAPPA, nie ma ich w CLI `verify_FINAL.py`. Implementacja w webappie zostawiona na później.
📥 Input
- `audit_catalog.csv` z step 0 (long_desc per lang)
- Inline słowniki w `verify_FINAL.py`: polish keywords (`pol_kw()`), polish chars (`pol_chars()`), polish words (`pol_words()`)
- Biblioteka `langdetect` do detekcji języka
📤 Output
- `01_audit_results.csv` — per (produkt × język) flagi: empty, pol_kw, pol_chars, pol_words, detected_pl, widget, markdown, too_short, detected_<lang>
- `01_audit_summary.json` — per kategoria, per język statystyka
⚠️ Ryzyka
- False positive na polskich markach (`Żurawina`) → threshold tuning
- Maltese ma natywnie `ż` → wyłączyć z polish detection dla lang='mlt' (już w `pol_kw()` jako exception)
- Langdetect niedokładny na krótkich tekstach (<50 znaków) → combine z keyword
- Katalogi >50k → consider parallel processing
🔔 Slack: Progress co 10%: ile produktów, które kategorie mają najwyższy problem rate
💾 Archiwum:
01_audit_results.csv01_audit_summary.json2
Weryfikacja Gemini (per produkt × język)
🤖 auto
⏱ ~30-60 min
📥 3 input(ów) · 📤 2 output(ów) · 📝 6 sub-kroków
▼
📝 Sub-kroki
- 2.1 JSONL: per (produkt × język) z flagami auto-check jako kontekst
- 2.2 Prompt ocenia holistically: kompletność, HTML, język, sens, zgodność z oryginałem
- 2.3 Vertex AI Batch (gemini-2.5-flash), response schema `{ocena, status, problemy}`
- 2.4 Polling 30s do SUCCEEDED (timeout >2h → alert)
- 2.5 Parse JSON per wpis
- 2.6 Auto-retry dla brakujących par (max 2x)
📥 Input
- `01_audit_results.csv`
- Prompt: `config/translation_prompts/weryfikator_tlumaczen.txt`
- Oryginalne tłumaczenia + metadane auditu
📤 Output
- `02_verifier_results.csv` — ocena 1-10, status OK/DO_POPRAWY, problemy
- `02_batch_job_log.json` — job_id, input, output, timing
⚠️ Ryzyka
- Gemini leniary (zawsze 8) → prompt tuning
- Zepsuty JSON → fallback regex (`translation_verifier.py`)
- Rate limit (429) → batch split
🔔 Slack: Start + ETA. Po SUCCEEDED: rozkład ocen per język
💾 Archiwum:
02_verifier_results.csv02_batch_job_log.jsonM1
MANUAL: Review wyników audytu
👤 manual
⏱ 10-60 min
📥 2 input(ów) · 📤 2 output(ów) · 📝 5 sub-kroków
▼
📝 Sub-kroki
- M1.1 DM: link do `/audit/review/{run_id}`
- M1.2 Strona pokazuje tabelę EAN × lang, color-coded (≥7 zielony, <7 czerwony)
- M1.3 Filter 'Pokaż tylko DO_POPRAWY'
- M1.4 Per (EAN, lang): 'Zaakceptuj' / 'Zaznacz do retłumaczenia'
- M1.5 'Zatwierdź audyt' → lista EAN-ów do retry
📥 Input
- `02_verifier_results.csv` z ocenami
- Slack DM z linkiem do strony review
📤 Output
- Lista produktów do retłumaczenia (EAN + języki)
- Notatka operator review
⚠️ Ryzyka
- Operator zatwierdzi bez przejrzenia (flag w archive)
- Timeout → auto-acceptance brakujących decyzji
👤 Akcje operatora
- Otworzyć link review
- Filtrować DO_POPRAWY
- Per produkt: zaakceptować lub zaznaczyć do retłumaczenia
- Kliknąć 'Zatwierdź audyt'
🔔 Slack: DM + przypomnienia co 30 min (max 2h timeout)
💾 Archiwum:
03_operator_review_log.json03_retranslate_scope.csv4
Retłumaczenie flagowanych produktów
🤖 auto
⏱ ~10-30 min
📥 3 input(ów) · 📤 2 output(ów) · 📝 5 sub-kroków
▼
📝 Sub-kroki
- 4.1 Filtracja: tylko produkty zaznaczone do retry
- 4.2 JSONL: jak w trybie Tłumaczenia (base_rules + lang_prompt + dane)
- 4.3 Vertex AI Batch (gemini-2.5-flash)
- 4.4 Auto-retry 2x dla missing
- 4.5 Opcjonalnie: ponowna weryfikacja (jak step 2)
📥 Input
- `03_retranslate_scope.csv` z operator review
- Oryginały polskie (z step 0)
- Prompty `config/translation_prompts/`
📤 Output
- `04_retranslations.csv` — nowe tłumaczenia
- `04_batch_job_log.json`
⚠️ Ryzyka
- Słaby prompt → retłumaczenie nie naprawi → edycja prompta + retry
- Wiele flagów per produkt (polish_leak + broken_html) → jedno retłumaczenie może nie naprawić wszystkiego
🔔 Slack: Start + zakończenie
💾 Archiwum:
04_retranslations.csv04_batch_job_log.json5
Upload naprawionych tłumaczeń do IdoSell
🤖 auto
⏱ ~5-15 min
📥 2 input(ów) · 📤 2 output(ów) · 📝 5 sub-kroków
▼
📝 Sub-kroki
- 5.1 Per tłumaczenie: PUT `/api/admin/v8/products/products/{ean}`
- 5.2 Payload: `productLongDescriptions.productLongDescriptionsLangData` z lang_code
- 5.3 Batch 30/request, rate limit 10 concurrent
- 5.4 Verify: random sample 50-100, refetch z IdoSell, compare HTML (normalize: StartFragment, quotes)
- 5.5 Final report per język
📥 Input
- `04_retranslations.csv`
- IdoSell API key
📤 Output
- `05_idosell_upload_log.csv` — HTTP statusy per produkt × lang
- `05_verify_report.csv` — sample verification (50-100 produktów)
⚠️ Ryzyka
- Operator override blokuje → cleanup lub PUT na obie warstwy
- Timeout → exponential backoff
🔔 Slack: Progress + final success ratio
💾 Archiwum:
05_idosell_upload_log.csv05_verify_report.csv✓
Raport + archiwizacja
🤖 auto
⏱ ~2 min
📥 1 input(ów) · 📤 4 output(ów) · 📝 7 sub-kroków
▼
📝 Sub-kroki
- ✓.1 Agregacja z 01_summary + 05_upload_log
- ✓.2 % per kategoria PRZED i PO retłumaczeniu
- ✓.3 XLSX sheets: overview, audit_auto, verifier, retranslations_log, upload_log
- ✓.4 ZIP wszystkich plików
- ✓.5 Drive: `Bioshi/Audyty/{run_id}/`
- ✓.6 Sheets tab `weryfikacja` (jeśli ten sam arkusz co Tłumaczenia)
- ✓.7 Firestore timeline event
📥 Input
- Wszystkie pliki z kroków 0-5
📤 Output
- `audit_report.json` — summary, % fixed, rozkład per kategoria
- `audit_report.xlsx` — human-readable (sheets per etap)
- ZIP `audit_{run_id}.zip` na Google Drive
- Wpis w Google Sheets tab `weryfikacja`
🔔 Slack: Final: link do raportu + Drive + summary stats
💾 Archiwum:
audit_report.jsonaudit_report.xlsxaudit_{run_id}.zip
💡
Tryb manualny ma cooldown 1h przed pierwszym przypomnieniem, potem co 1h. W godzinach ciszy (18:00-08:00) bot czeka do rana, chyba że włączony Tryb Boguś Pracoholik w Ustawieniach.
Diagram przepływu danych
DFDflowchart LR
OP([Operator]):::ext
ID[(IdoSell all shops)]:::store
REP[(Raport problemów)]:::store
ID --> P1((GET lang-default))
ID --> P2((GET shop overrides))
P1 --> P3((8 audit checks))
P2 --> P3
P3 -->|polish leak, h3, dup widget| REP
REP --> OP
OP -->|approve| P4((Naprawa pipeline))
P4 --> ID
classDef ext fill:#fef3c7,stroke:#f59e0b,color:#78350f;
classDef store fill:#f1f5f9,stroke:#94a3b8,color:#334155;
⏳
Ładuję diagram...
Legenda:
External
Datastore
Proces
⌨️ scroll = zoom · click&drag = pan · folder Audyty
Materiał wideo
🎬
Brak materiału wideo
Wgraj nagranie YouTube/Loom z instrukcją tego trybu
Historia tego trybu
📦
Jeszcze nie używałeś tego trybu