{"schema_version":"1","site":"https://decosa.ai","id":"gpsr-listing-pack","num":"72","name":"GPSR listing pack","tool_name":"Build an EU GPSR listing","short":"GPSR listing pack","blurb":"Turns a supplier's product sheet and the product label (text or a photo) into the listing information Article 19 of the EU General Product Safety Regulation (EU) 2023/988 asks every online offer to show: manufacturer, EU responsible person when the maker is outside the Union, product identification, and the warnings in the buyer's language. Every value is looked up in the documents, each Article 19 element is marked found or missing, a label that disagrees with the sheet is flagged, and the warnings come back in up to five languages with every number, unit, negation and name checked. A preparation aid with a signed record, never a statement that an offer meets the Regulation.","status":"live","labels":{"industry":["compliance-trust","sales-marketing"],"job":["review","translate"],"input":["text","files"],"deploy":["hosted","selfhost"],"status":"live","output":["data","record"],"data":["confidential"],"hardware":"gpu-96","licence":"permissive"},"industries":["compliance-trust","sales-marketing"],"runs_in":["hosted","selfhost"],"part_of":[],"built_from":["language-pack","signed-record"],"models":"Qwen3.8-27B (label reading, field extraction; translation into 15 EU languages) · Hy-MT2-7B (translation into 8, language-pack block)","where":"Hosted or self-host","hardware":"1x RTX PRO 6000 (96 GB): Qwen3.8-27B NVFP4 plus Hy-MT2-7B (about 18 GB); the checks run on CPU","final_artifact":"The listing fields per language (CSV/JSON), the Article 19 checklist with articles, the label-vs-sheet flags, the checked translations and a signed record.","self_host_first":false,"verification":{"receipt_coverage":"partial","summary":"Gateway receipts for Qwen3.8 calls; model-call attestation per translation call; signed record of the fields, elements, flags and translations","manual_qa":{"hosted":{"date":"2026-09-30","result":"pass","p50_ms":11961,"p95_ms":18088,"runs":8,"receipts_per_run":37,"cost_per_run_usd":0.004069},"selfhost":null,"known_limits":["Synthetic products only in the eval; no real supplier sheets or label photos were measured.","Harmonisation legislation (toys, electrical, cosmetics) adds label rules this pack does not check.","Translations are checked for numbers, units, dates, codes, negations and locked terms, not for wording; a native speaker should read them.","Scanned PDF sheets need the document reader block's service, which is not in the hosted demo; label photos are read by Qwen3.8."],"nightly_covers":null},"nightly":"https://api.decosa.ai/verify/status"},"eval_summary":{"metrics":[{"name":"Missing Article 19 elements found, frozen","value":"15 / 19","unit":null,"n":19,"split":"test","note":"0 false. The 4 misses were products with a model number but no batch or GTIN; the pack now says 'check' there (Art. 9(5) accepts a type)."},{"name":"Missing elements found after that fix","value":"18 / 18","unit":null,"n":18,"split":"test","note":"Same test products, so no longer held out; 2 of 24 hit a gateway outage."},{"name":"Label-vs-sheet mismatches found","value":"5 / 5","unit":null,"n":5,"split":"test","note":"0 false flags on the other 19 products."},{"name":"Extracted fields right","value":"87 / 88","unit":null,"n":88,"split":"test","note":null},{"name":"Translations with no high flag (5 languages x 23 products)","value":"115 / 115","unit":null,"n":115,"split":"test","note":null},{"name":"Planted translation errors caught (6 languages)","value":"1,314 / 1,328 (98.9%)","unit":null,"n":1328,"split":"test","note":"The language pack's held-out drift set; 1,320 after later fixes."},{"name":"Planted meaning errors caught by the meaning check (negation, dropped clause, roles, entity, hedge; 6 languages)","value":"556 / 562 (98.9%); 522 as error","unit":null,"n":562,"split":"test","note":"Language pack meaning check, synthetic sentences. It also flags 52 of 192 correct translations for a look (4 as error); grammar is not checked."},{"name":"Planted translation errors caught, 5 added languages (fi, hu, el, bg, ro)","value":"1,064 / 1,078 (98.7%)","unit":null,"n":1078,"split":"test","note":"The language pack's drift set through the Qwen3.8-27B route, checker frozen; 1,068 after post-test fixes. 20 of 300 clean translations flagged when frozen (1 real), 9 after."},{"name":"Added EU languages at or above the language pack's FLORES bar","value":"13 / 15","unit":null,"n":15,"split":"test","note":"FLORES-200 devtest (1,012 sentences per language). COMET-22 89.1-91.7 on Qwen3.8-27B; Irish (73.4) and Maltese (69.0, and COMET cannot judge Maltese) are served as drafts that need a reviewer."}],"dataset":"32 synthetic products (8 dev, 24 test): a supplier sheet and a label each, with planted problems (a missing manufacturer e-mail or address, no EU responsible person for a non-EU maker, no model or identifier, a label number or model that differs from the sheet, no warnings).","held_out":true,"caveats":["The products, sheets, labels and planted problems are ours; no real supplier documents.","One fix was made after the test run (type-only identifiers); the after-fix numbers are on the same products.","The translations are checked in code for facts, and by a model for meaning (flipped negations, dropped clauses, swapped roles, wrong names); grammar is not checked and no native speaker has reviewed them.","Label photos were tested on one rendered label, not on phone photos of real labels.","The fifteen languages added on 27 Sep were checked on FLORES and on planted number errors in five of them, not on GPSR products; no native speaker has read them."],"date":"2026-09-27","doc_url":"https://decosa.ai/metrics/evals/gpsr-listing-pack"},"stack":{"summary":"For marketplace sellers shipping to the EU and the responsible-person services that support them. It reads the supplier's product sheet and the label (text or a photo), extracts the manufacturer, the EU responsible person, the product identifiers and the warnings, looks every value up in the documents, marks each Article 19 element of Regulation (EU) 2023/988 found or missing, flags a label that disagrees with the sheet, and translates the warnings into up to five of the 23 other EU official languages with the language pack's number lock and its term bank (the GPSR's defined terms in each language, such as 'Bevollmächtigter' for authorised representative, the MDR or IVDR definitions on request when the product is a device, plus your own reviewed terms). It is a preparation aid with a signed record, never a statement that an offer meets the Regulation.","tagline":"A product sheet and its label in, the EU listing fields out: Article 19 elements found or missing, label checked against the sheet, warnings in up to five of the 23 EU languages with every number checked.","deployment":"hosted-or-self-host","regulatory_note":"Checked 27 Sep 2026 against the text of Regulation (EU) 2023/988 (GPSR), OJ L 135, 23.5.2023, p. 1 (CELEX 32023R0988, read from the EU Publications Office). It applies from 13 December 2024 (Article 52). Article 19: an offer made online or at a distance must clearly and visibly indicate (a) the manufacturer's name, registered trade name or trade mark and postal and electronic address; (b) where the manufacturer is not established in the Union, the name, postal and electronic address of the responsible person under Article 16(1) or Article 4(1) of Regulation (EU) 2019/1020; (c) information allowing the product to be identified, including a picture, its type and any other product identifier; and (d) any warning or safety information to be affixed to the product or packaging or included in an accompanying document, in a language consumers can easily understand, as determined by the Member State where the product is made available. Article 9(5)-(7) sets the manufacturer's labelling (type, batch or serial number; name and addresses; instructions and safety information in the consumer's language), and Article 22(9) asks online marketplaces to let traders provide the Article 19 information. The pack checks for these elements and compares the label with the sheet; it does not judge whether a product is safe, it does not check harmonisation legislation (toys, electrical equipment, cosmetics and others add their own rules), which language a Member State requires is for that Member State, and Decosa is not a responsible person. Not legal advice. Model licences: Apache-2.0 (Qwen3.8-27B, Hy-MT2-7B).","components":[{"id":"gpsr","role":"Article 19 checklist, value lookup against the documents, label-vs-sheet comparison, listing export and signed record (no model; CPU)","name":"decosa-api GPSR pack (decosa_api/verticals/gpsr), on the language-pack block (decosa_api/lang) and the signed record (07)","hf_repo":null,"license":"AGPL-3.0-or-later","params":null,"quant":null,"vram_gb":0,"memory_gb_estimate":null,"engine":"Python 3.12; Article 19 verbatim from the Official Journal text (read 27 Sep 2026)","receipt_coverage":"partial","in_hosted_demo":null,"tiers":["standard","best"],"alternative_to":null},{"id":"model","role":"Label reading (image input) and field extraction as JSON","name":"Qwen3.8-27B (NVFP4, vision tower on)","hf_repo":"nvidia/Qwen3.8-27B-NVFP4","license":"Apache-2.0","params":"27B","quant":"NVFP4","vram_gb":20,"memory_gb_estimate":null,"engine":"vLLM 0.29.0 (hosted model qwen3.8-27b), images up to 4 per request","receipt_coverage":"strong","in_hosted_demo":null,"tiers":["standard","best"],"alternative_to":null},{"id":"mt","role":"Translation of warnings and safety information (the language-pack block): German, French, Spanish, Italian, Dutch, Polish, Portuguese, Czech","name":"Hy-MT2-7B","hf_repo":"tencent/Hy-MT2-7B","license":"Apache-2.0","params":"7.5B","quant":"BF16","vram_gb":18,"memory_gb_estimate":null,"engine":"vLLM 0.29.0 (Transformers backend, --enforce-eager), gpu-memory-utilization 0.18","receipt_coverage":"partial","in_hosted_demo":null,"tiers":["standard"],"alternative_to":null},{"id":"mt-llm","role":"Translation of warnings and safety information: the fifteen other EU languages (Swedish, Danish, Finnish, Greek, Romanian, Hungarian, Bulgarian, Croatian, Slovak, Slovenian, Lithuanian, Latvian, Estonian; Irish and Maltese as drafts)","name":"Qwen3.8-27B (the language-pack block's route for these languages)","hf_repo":"Qwen/Qwen3.8-27B","license":"Apache-2.0","params":"27B","quant":"NVFP4","vram_gb":0,"memory_gb_estimate":null,"engine":"The already-served hosted model qwen3.8-27b, through the gateway; no new GPU","receipt_coverage":"strong","in_hosted_demo":null,"tiers":["standard"],"alternative_to":null},{"id":"mt-30b","role":"Translation, larger model","name":"Hy-MT2-30B-A3B-FP8","hf_repo":"tencent/Hy-MT2-30B-A3B-FP8","license":"Apache-2.0","params":"30B","quant":"FP8","vram_gb":null,"memory_gb_estimate":31,"engine":"vLLM (not run here)","receipt_coverage":"none","in_hosted_demo":null,"tiers":["best"],"alternative_to":null}],"tiers":[{"id":"standard","label":"Standard · Qwen3.8-27B plus Hy-MT2-7B (hosted demo)","summary":"What the hosted demo runs: Qwen3.8-27B extracts, Hy-MT2-7B translates, code checks and signs.","components":["gpsr","model","mt"],"hardware":"2x RTX PRO 6000 96 GB shared (measured); 1x 96 GB should fit (not measured)","quality_evidence":[{"metric":"Missing Article 19 elements found (24 held-out synthetic products)","value":"15 of 19 found, 0 false (frozen); 18 of 18 after one fix (22 products)","source":"docs/evals/gpsr-listing-pack.md, test split, 27 Sep 2026"},{"metric":"Label-vs-sheet mismatches found","value":"5 / 5, 0 false flags","source":"docs/evals/gpsr-listing-pack.md, test split"},{"metric":"Extracted fields right (model, GTIN, manufacturer name and e-mail)","value":"87 / 88","source":"docs/evals/gpsr-listing-pack.md, test split"},{"metric":"Planted translation errors caught (numbers, units, negations, codes, dates; 6 languages)","value":"1,314 / 1,328 (98.9%) frozen; 1,320 / 1,328 after fixes","source":"docs/evals/language-pack.md, drift test split"}],"latency_note":"measured end to end with the meaning check on (the default), on the shared gateway; the figures are in the latency table and come from docs/evals/gpsr-listing-pack/measure-default.json","in_hosted_demo":true,"receipt_coverage":"partial","receipt_note":"Qwen3.8 calls: gateway receipts. Translation calls: model-call attestations signed by decosa-api, not countersigned by the gateway yet.","hosting":null},{"id":"best","label":"Best · the 30B translation model (not measured)","summary":"Hy-MT2-30B-A3B-FP8 for translation; not run by us.","components":["gpsr","model","mt-30b"],"hardware":"1x RTX PRO 6000 96 GB (estimate: 20 GB Qwen3.8 NVFP4 weights plus 31 GB MT)","quality_evidence":[{"metric":"FLORES-200 XCOMET-XXL (vendor)","value":"not measured yet","source":"Hy-MT2 report, arXiv 2605.22064 (vendor figure 89.83)"}],"latency_note":"not measured","in_hosted_demo":false,"receipt_coverage":"partial","receipt_note":null,"hosting":null}],"alternates":[],"services":[{"name":"decosa-api","port":8445,"image":"${DECOSA_REGISTRY}/decosa-api:0.1.0","purpose":"GET /gpsr/info, /gpsr/samples; POST /gpsr/pack (SSE or JSON). No GPU."},{"name":"decosa-llm","port":8000,"image":"${DECOSA_REGISTRY}/decosa-llm:0.1.0","purpose":"vLLM OpenAI endpoint for Qwen3.8-27B with image input."},{"name":"decosa-lang-mt","port":8491,"image":"vllm/vllm-openai@sha256:c2914767605584b6d8f45686b82de173ecc99e781897aa3d0a66dacd72c51ae1","purpose":"Hy-MT2-7B, the language pack's translation model (deploy/systemd/decosa-lang-mt.service)."}],"tools":[{"name":"Regulation (EU) 2023/988 (GPSR)","url":"https://eur-lex.europa.eu/eli/reg/2023/988/oj","license":"EU legislation (public)","purpose":"Articles 9(5)-(7), 16(1), 19 and 22(9), read 27 Sep 2026; applies from 13 December 2024."},{"name":"Language pack (decosa_api/lang)","url":null,"license":"AGPL-3.0-or-later","purpose":"The number, unit, date, code, negation and glossary lock on every translated line."}],"hardware":[{"tier":"2x RTX PRO 6000 Blackwell 96 GB (shared)","fits":true,"notes":"Measured: Qwen3.8-27B on one card; Hy-MT2-7B (18.3 GB) on the other beside other services."},{"tier":"1x RTX PRO 6000 96 GB","fits":null,"notes":"Not measured: Qwen3.8-27B NVFP4 (about 20 GB of weights) and Hy-MT2-7B (18 GB with its KV cache) should fit together with a reduced LLM KV cache."},{"tier":"CPU only","fits":false,"notes":"The checklist and the record are CPU; extraction and translation need the two models."}],"latency":[{"lane":"one pack, 5 languages, default run (meaning check on), shared gateway","typical_ms":18673,"source":"measured on our server 2026-09-30: median over 24 held-out test products through the HTTP API, every translated line back-translated and its meaning checked; production (api.decosa.ai) (docs/evals/gpsr-listing-pack/measure-default.json)"},{"lane":"one pack with a label photo, 5 languages, default run","typical_ms":18088,"source":"measured on our server 2026-09-30: the candle sample (label read from the photo), the slower middle of 2 runs; production (api.decosa.ai) (docs/evals/gpsr-listing-pack/measure-default.json)"}],"benchmark":null,"notes":[]},"buyer_facts":[{"label":"Data retention","value":"Nothing stored: the sheet, the label and the result live in memory for the request, and logs carry counts only. The signed record holds hashes, statuses, flags, the extracted fields and the translations."},{"label":"What leaves the box","value":"Hosted: the Qwen3.8 calls go through our gateway to the GPU serving the model; translation runs on Decosa's hosted service, and the meaning check sends each English line with its translation and back-translation to Qwen3.8 through the gateway. Self-hosted on the direct route: nothing leaves the box."},{"label":"What it will not say","value":"That an offer or a product complies with Regulation (EU) 2023/988. It lists the Article 19 elements found or missing and what disagrees; Decosa is not a responsible person."},{"label":"Languages","value":"Any EU official language as a target (23 besides English, up to five per pack). Thirteen of the fifteen added on 27 Sep met the language pack's FLORES bar; Irish and Maltese are returned marked \"draft, needs a reviewer\"."},{"label":"Typical run","value":"One Qwen3.8-27B call to read the sheet (two with a label photo), a few translation calls per language, and for every translated line a back-translation and one Qwen3.8 judgment (the meaning check, on by default). The meaning check is most of the time and model cost of a run; the measured figures are shown on this page. Send \"meaning\": false to skip it: numbers, units, negations and names are still checked in code."}],"hosted_now":{"needs":["qwen3.8-27b","translation"],"off":["translation"],"live_by_default":false,"live_status":"https://api.decosa.ai/status"},"data_handling":{"page":"/data#gpsr-listing-pack","self_host":{"level":"confidential","leaves":"nothing","summary":"Runs on your machine; nothing is sent to Decosa or a third party by default."},"hosted":{"level":"operator-processed","demo_only":false,"summary":"TLS to Decosa's server, then decrypted and processed by Decosa's API server, with the open models run by NEAR AI through OpenRouter, with Reka AI as the only fallback under Decosa's account.","gpus":"operator-contracted","third_parties":[],"retention":"Nothing stored: the sheet, the label and the result live in memory for the request, and logs carry counts only. The signed record holds hashes, statuses, flags, the extracted fields and the translations.","used_for_training":false,"encrypted_while_processed":false},"sealed_tier":{"applies":false,"note":"The sealed tier (raw chat only, never use-case pipelines) is paused at launch (/docs/sealed-tier)."},"external_calls":[]},"console":{"href":"/tools/finance/gpsr-listing-pack","input":"gpsr","lanes":[{"id":"elements","title":"Article 19 elements","kind":"list"},{"id":"fields","title":"Listing fields found in the documents","kind":"json"},{"id":"translations","title":"Warnings per language, numbers checked","kind":"list"},{"id":"record","title":"Listing export and signed record","kind":"json"}],"samples":[{"n":1,"id":"toy-with-rp","title":"Toy with rp","deep_link":"/tools/finance/gpsr-listing-pack?sample=1&autorun=0"},{"n":2,"id":"charger-no-rp","title":"Charger no rp","deep_link":"/tools/finance/gpsr-listing-pack?sample=2&autorun=0"},{"n":3,"id":"kettle-label-mismatch","title":"Kettle label mismatch","deep_link":"/tools/finance/gpsr-listing-pack?sample=3&autorun=0"},{"n":4,"id":"candle-label-photo","title":"Candle label photo","deep_link":"/tools/finance/gpsr-listing-pack?sample=4&autorun=0"}],"deep_link_params":{"sample":"1-based index into samples, or a sample id","autorun":"1 = start the run once the sample is loaded; 0 (default) = only preselect","reduce-motion":"1 = turn off animations"}},"api":{"base":"https://api.decosa.ai","contract":"/api/contract.json","contract_markdown":"/api/contract.md","reference":"/docs/api","keys":"/account/keys"},"prompts":{"hosted":"/prompts/gpsr-listing-pack-hosted.md","selfhost":"/prompts/gpsr-listing-pack-selfhost.md","assemble":"/prompts/gpsr-listing-pack-assemble.md","mac":null},"rehearsal":{"bundle":"/samples/gpsr-listing-pack.zip","bundle_url":"https://decosa.ai/samples/gpsr-listing-pack.zip","folder":"/samples/gpsr-listing-pack/","expected":"/samples/gpsr-listing-pack/expected.json","files":["/samples/gpsr-listing-pack/expected.json","/samples/gpsr-listing-pack/inputs/label.txt","/samples/gpsr-listing-pack/inputs/sheet.txt"],"bytes":2041,"checks":["only the elements this product has are found (manufacturer name and addresses, picture, type, identifier, warnings, language); the EU responsible person is not","the three responsible-person elements are missing (Art. 19(b), 16(1))","the overall status is fail","German and Polish safety text come back with no high flag","the Polish text has no high flag either","the signed record verifies"],"licence":"Sheet and label written for this bundle (CC0); every company, address and number is invented. Part of decosa-api, which will be released under AGPL-3.0-or-later; until then the source is on request.","about":"A synthetic product sheet and label for an e-bike charger made by a UK company, with no EU responsible person named. The pack must find the manufacturer's name, postal and electronic address, flag the three responsible-person elements of Article 19(b) as missing, translate the warnings into German and Polish with no high-severity number, unit or negation flag, attach a receipt to every model call and sign a record that verifies.","run":{"containers":"docker compose exec api python scripts/rehearse.py gpsr-listing-pack","checkout":"python scripts/rehearse.py gpsr-listing-pack --bundle gpsr-listing-pack.zip --base-url http://127.0.0.1:8445","mac":".venv/bin/python scripts/rehearse.py gpsr-listing-pack"},"guidance":"Set up with a coding agent (we recommend Claude Code with Claude Opus 5.5; any capable coding agent works) on mock data only, run the rehearsal until every check passes, then run your own data locally yourself. Never give the agent real data during setup."},"hardware_fit":{"check":"/self-host/hardware?use=gpsr-listing-pack","data":"/api/hardware.json","tiers":[{"id":"standard","gpu_gb":75.6,"basis":"stack","unknown":[]},{"id":"best","gpu_gb":94.6,"basis":"estimate","unknown":[]}],"mac":null},"links":{"page":"/tools/finance/gpsr-listing-pack","json":"/use-cases/gpsr-listing-pack.json","metrics":"/metrics/gpsr-listing-pack","console":"/tools/finance/gpsr-listing-pack","console_sample":"/tools/finance/gpsr-listing-pack?sample=1&autorun=0","stack":"/tools/finance/gpsr-listing-pack#stack","try_live":"/tools/finance/gpsr-listing-pack","watch":"/tools/finance/gpsr-listing-pack","build":"/tools/finance/gpsr-listing-pack#build","self_host":"/tools/finance/gpsr-listing-pack#self-host","prompts":{"hosted":"/prompts/gpsr-listing-pack-hosted.md","selfhost":"/prompts/gpsr-listing-pack-selfhost.md","assemble":"/prompts/gpsr-listing-pack-assemble.md","mac":null}}}