{"_id":"@adatechnology/product-vision-provider","_rev":"7-8007ca922a195d510be1e9276f038a3c","name":"@adatechnology/product-vision-provider","dist-tags":{"rc":"0.1.0-rc.4","latest":"0.1.0"},"versions":{"0.1.0-rc.2":{"name":"@adatechnology/product-vision-provider","version":"0.1.0-rc.2","keywords":["product-vision","barcode","ean","gtin","clip","embedding","visual-search","self-hosted"],"author":{"name":"Ada Technology"},"license":"MIT","_id":"@adatechnology/product-vision-provider@0.1.0-rc.2","maintainers":[{"name":"miyazaki","email":"andersonfrfilho@gmail.com"}],"dist":{"shasum":"9ce8867f308e0917eccadf81bdbac80b6fed5b74","tarball":"https://registry.npmjs.org/@adatechnology/product-vision-provider/-/product-vision-provider-0.1.0-rc.2.tgz","fileCount":10,"integrity":"sha512-/05C9N1xpkXSzUfFSENP6ymTVmuM+xVEJiChxncXaV+QujeZXnTVL4rE7QNm0Kc1FPlwK1IAry/xc15D5syyYg==","signatures":[{"sig":"MEYCIQCuFN8qAm2NJbzsrmHB1nQMMbb+zGYU1oIpFR93le482gIhAO8KoqOspjTEsk2gDa3C/CAQzqWBNVWxnwDizWjSbPA7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":23542},"main":"dist/index.js","type":"module","_from":"file:adatechnology-product-vision-provider-0.1.0-rc.2.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./barcode":{"types":"./dist/barcode/index.d.ts","import":"./dist/barcode/index.js","default":"./dist/barcode/index.js"},"./clip-local":{"types":"./dist/clip-local/index.d.ts","import":"./dist/clip-local/index.js","default":"./dist/clip-local/index.js"}},"scripts":{"test":"bun test","build":"tsup","check":"tsc --noEmit","format":"prettier --write package.json src tsconfig.json tsup.config.ts","format:check":"prettier --check package.json src tsconfig.json tsup.config.ts"},"_npmUser":{"name":"miyazaki","email":"andersonfrfilho@gmail.com"},"_resolved":"/tmp/080f0892070396e8ce757882d2235fed/adatechnology-product-vision-provider-0.1.0-rc.2.tgz","_integrity":"sha512-/05C9N1xpkXSzUfFSENP6ymTVmuM+xVEJiChxncXaV+QujeZXnTVL4rE7QNm0Kc1FPlwK1IAry/xc15D5syyYg==","deprecated":"Versao com defeito: o leitor de codigo de barras usava nomes de formato que o zbar nao devolve, entao nenhuma foto era lida — a leitura voltava sempre vazia, sem erro. Use 0.1.0-rc.4 ou maior.","_npmVersion":"10.9.8","description":"Identifica produto a partir de uma foto: leitor de codigo de barras e embedding CLIP, ambos locais e gratuitos, encadeaveis","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","@types/bun":"1.3.14","typescript":"^5.9.3","@adatechnology/catalog-contracts":"0.1.0-rc.4"},"peerDependencies":{"@undecaf/zbar-wasm":">=0.11 <1","@huggingface/transformers":">=3 <5"},"peerDependenciesMeta":{"@undecaf/zbar-wasm":{"optional":true},"@huggingface/transformers":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/product-vision-provider_0.1.0-rc.2_1788287004507_0.10760400478323917","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-rc.3":{"name":"@adatechnology/product-vision-provider","version":"0.1.0-rc.3","keywords":["product-vision","barcode","ean","gtin","clip","embedding","visual-search","self-hosted"],"author":{"name":"Ada Technology"},"license":"MIT","_id":"@adatechnology/product-vision-provider@0.1.0-rc.3","maintainers":[{"name":"miyazaki","email":"andersonfrfilho@gmail.com"}],"dist":{"shasum":"ece973764fc5a1d8f00d42459a406da5cbd889bd","tarball":"https://registry.npmjs.org/@adatechnology/product-vision-provider/-/product-vision-provider-0.1.0-rc.3.tgz","fileCount":10,"integrity":"sha512-cJJQV0pF38b1+tBwjBcpqvJVcnXssecKmzNeqdPsZc0yHTQK+v20FXckGtJ78csLAjVG/6sY5cs9nPperMFbQQ==","signatures":[{"sig":"MEYCIQCFiA/wLcutUEAKG/pr9YZr+TOX4I83wprGnepRk/EpSQIhAMuTeyZGkHOO6Tzqhd7Dqs/uitVSJdjhajfktEWx5E+6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDiTUVVLsk8NWck0IgrsNtncmrsFX/DuBJzYePQFqrNDgIhAPTPQ3vnCYwjKyFWk/WCe9nqGx2xpr+rvbBy8IuuoYKy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24246},"main":"dist/index.js","type":"module","_from":"file:adatechnology-product-vision-provider-0.1.0-rc.3.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./barcode":{"types":"./dist/barcode/index.d.ts","import":"./dist/barcode/index.js","default":"./dist/barcode/index.js"},"./clip-local":{"types":"./dist/clip-local/index.d.ts","import":"./dist/clip-local/index.js","default":"./dist/clip-local/index.js"}},"scripts":{"test":"bun test","build":"tsup","check":"tsc --noEmit","format":"prettier --write package.json src tsconfig.json tsup.config.ts","format:check":"prettier --check package.json src tsconfig.json tsup.config.ts"},"_npmUser":{"name":"miyazaki","email":"andersonfrfilho@gmail.com"},"_resolved":"/tmp/b27d48b725d625164f468d33719c85b1/adatechnology-product-vision-provider-0.1.0-rc.3.tgz","_integrity":"sha512-cJJQV0pF38b1+tBwjBcpqvJVcnXssecKmzNeqdPsZc0yHTQK+v20FXckGtJ78csLAjVG/6sY5cs9nPperMFbQQ==","deprecated":"Versao com o engine CLIP quebrado: a imagem era passada como data URL e o transformers.js tenta buscar a URL, entao toda foto falhava com 404. O leitor de codigo de barras funciona nesta versao. Use 0.1.0-rc.4 ou maior.","_npmVersion":"10.9.8","description":"Identifica produto a partir de uma foto: leitor de codigo de barras e embedding CLIP, ambos locais e gratuitos, encadeaveis","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","@types/bun":"1.3.14","typescript":"^5.9.3","@undecaf/zbar-wasm":"^0.11.0","@adatechnology/catalog-contracts":"0.1.0-rc.4"},"peerDependencies":{"@undecaf/zbar-wasm":">=0.11 <1","@huggingface/transformers":">=3 <5"},"peerDependenciesMeta":{"@undecaf/zbar-wasm":{"optional":true},"@huggingface/transformers":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/product-vision-provider_0.1.0-rc.3_1788289355654_0.2473775665974709","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-rc.4":{"name":"@adatechnology/product-vision-provider","version":"0.1.0-rc.4","keywords":["product-vision","barcode","ean","gtin","clip","embedding","visual-search","self-hosted"],"author":{"name":"Ada Technology"},"license":"MIT","_id":"@adatechnology/product-vision-provider@0.1.0-rc.4","maintainers":[{"name":"miyazaki","email":"andersonfrfilho@gmail.com"}],"dist":{"shasum":"c98b9991a7df49ffa4baf8f1c555688632fc4c08","tarball":"https://registry.npmjs.org/@adatechnology/product-vision-provider/-/product-vision-provider-0.1.0-rc.4.tgz","fileCount":10,"integrity":"sha512-ln2UYBV3d9AT7PdQbZzPoQiCH4W6Gwv6nqfd7UMNGQ+ODuQPzYbJ/ZuXwXlyJD2w9v+J+iOmllUeaqL+h9mE/A==","signatures":[{"sig":"MEUCIEMji+1I02Klex/mPCOYKC8N8pbA5jBUIOamemDb9LbvAiEAl7CLQKTR/y/iVxwZ2zw0wNCJHjc/5mLsbUghsTTBDAM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHsUh5oq5CpOnjKTKS5f73uOw1k3FKx0vPpNbd+IL9ItAiEAhoNnYzcW8CMZGNjJ9nJ5iiDO/6bcBq1+MO049+EQQU4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25402},"main":"dist/index.js","type":"module","_from":"file:adatechnology-product-vision-provider-0.1.0-rc.4.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./barcode":{"types":"./dist/barcode/index.d.ts","import":"./dist/barcode/index.js","default":"./dist/barcode/index.js"},"./clip-local":{"types":"./dist/clip-local/index.d.ts","import":"./dist/clip-local/index.js","default":"./dist/clip-local/index.js"}},"scripts":{"test":"bun test","build":"tsup","check":"tsc --noEmit","format":"prettier --write package.json src tsconfig.json tsup.config.ts","format:check":"prettier --check package.json src tsconfig.json tsup.config.ts"},"_npmUser":{"name":"miyazaki","email":"andersonfrfilho@gmail.com"},"_resolved":"/tmp/a512b79501f68f6e703c4aa7b8d48f80/adatechnology-product-vision-provider-0.1.0-rc.4.tgz","_integrity":"sha512-ln2UYBV3d9AT7PdQbZzPoQiCH4W6Gwv6nqfd7UMNGQ+ODuQPzYbJ/ZuXwXlyJD2w9v+J+iOmllUeaqL+h9mE/A==","_npmVersion":"10.9.8","description":"Identifica produto a partir de uma foto: leitor de codigo de barras e embedding CLIP, ambos locais e gratuitos, encadeaveis","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","sharp":"^0.35.4","@types/bun":"1.3.14","typescript":"^5.9.3","@undecaf/zbar-wasm":"^0.11.0","@huggingface/transformers":"^4.2.0","@adatechnology/catalog-contracts":"0.1.0-rc.4"},"peerDependencies":{"@undecaf/zbar-wasm":">=0.11 <1","@huggingface/transformers":">=3 <5"},"peerDependenciesMeta":{"@undecaf/zbar-wasm":{"optional":true},"@huggingface/transformers":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/product-vision-provider_0.1.0-rc.4_1788291372937_0.48650022226670564","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"_id":"@adatechnology/product-vision-provider@0.1.0","dist":{"shasum":"67cce3fb733eb0bfa6f657e3dc5051f7a8a13682","tarball":"https://registry.npmjs.org/@adatechnology/product-vision-provider/-/product-vision-provider-0.1.0.tgz","fileCount":10,"integrity":"sha512-jJlT9cQkV/yUg6Tj/Bg6ijDmIZN+/yv5cxnShbEHM8eFYq0ws/ueOEA7E78lEDYjhM27oQtcgfki0lemulVOzQ==","signatures":[{"sig":"MEUCIHaIVq930Q2npRgMR0ahZCy9/O0hZvzuKW/j9lxsZ/6QAiEA1e0DgPH/x5AaMFUPXk+H4a9wYpZ2Kt3bUehQlS1QNWA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEKhXH6gztdONkd0rSq0UO5MLD9Rf6C4z5YYrthPy1R/AiEAzlwri3XDixgsvT8VTZlfEtcArC3hVnSEYoSZhGtBlII="}],"unpackedSize":25392},"main":"dist/index.js","name":"@adatechnology/product-vision-provider","type":"module","_from":"file:adatechnology-product-vision-provider-0.1.0.tgz","types":"dist/index.d.ts","author":{"name":"Ada Technology"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./barcode":{"types":"./dist/barcode/index.d.ts","import":"./dist/barcode/index.js","default":"./dist/barcode/index.js"},"./clip-local":{"types":"./dist/clip-local/index.d.ts","import":"./dist/clip-local/index.js","default":"./dist/clip-local/index.js"}},"license":"MIT","scripts":{"test":"bun test","build":"tsup","check":"tsc --noEmit","format":"prettier --write package.json src tsconfig.json tsup.config.ts","format:check":"prettier --check package.json src tsconfig.json tsup.config.ts"},"version":"0.1.0","_npmUser":{"name":"miyazaki","email":"andersonfrfilho@gmail.com"},"keywords":["product-vision","barcode","ean","gtin","clip","embedding","visual-search","self-hosted"],"_resolved":"/tmp/1b290a92d91a4073d9188be5cb08d162/adatechnology-product-vision-provider-0.1.0.tgz","_integrity":"sha512-jJlT9cQkV/yUg6Tj/Bg6ijDmIZN+/yv5cxnShbEHM8eFYq0ws/ueOEA7E78lEDYjhM27oQtcgfki0lemulVOzQ==","_npmVersion":"10.9.8","description":"Identifica produto a partir de uma foto: leitor de codigo de barras e embedding CLIP, ambos locais e gratuitos, encadeaveis","directories":{},"maintainers":[{"name":"miyazaki","email":"andersonfrfilho@gmail.com"}],"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","sharp":"^0.35.4","@types/bun":"1.3.14","typescript":"^5.9.3","@undecaf/zbar-wasm":"^0.11.0","@huggingface/transformers":"^4.2.0","@adatechnology/catalog-contracts":"0.1.0"},"peerDependencies":{"@undecaf/zbar-wasm":">=0.11 <1","@huggingface/transformers":">=3 <5"},"peerDependenciesMeta":{"@undecaf/zbar-wasm":{"optional":true},"@huggingface/transformers":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/product-vision-provider_0.1.0_1788318300421_0.03281436389397885"}}},"time":{"created":"2026-09-01T18:23:24.285Z","modified":"2026-09-02T03:05:00.831Z","0.1.0-rc.2":"2026-09-01T18:23:24.625Z","0.1.0-rc.3":"2026-09-01T19:02:35.744Z","0.1.0-rc.4":"2026-09-01T19:36:13.039Z","0.1.0":"2026-09-02T03:05:00.518Z"},"author":{"name":"Ada Technology"},"license":"MIT","keywords":["product-vision","barcode","ean","gtin","clip","embedding","visual-search","self-hosted"],"description":"Identifica produto a partir de uma foto: leitor de codigo de barras e embedding CLIP, ambos locais e gratuitos, encadeaveis","maintainers":[{"name":"miyazaki","email":"andersonfrfilho@gmail.com"}],"readme":"# @adatechnology/product-vision-provider\n\nIdentifica produto a partir de uma foto. Dois engines, ambos **locais e gratuitos**: leitor de\ncódigo de barras em WebAssembly e embedding CLIP em ONNX. Nenhum serviço a subir, nenhuma chave a\npagar.\n\nSatisfaz a `ProductVisionPort` do `@adatechnology/catalog-module` sem importá-lo — o provider não\nconhece quem o consome.\n\n## Instalação\n\n```bash\nbun add @adatechnology/product-vision-provider\nbun add @undecaf/zbar-wasm          # só se usar o leitor de código de barras\nbun add @huggingface/transformers   # só se usar o embedding\n```\n\nAs duas são `peerDependencies` **opcionais**: a raiz do pacote não carrega engine nenhum, e quem só\nquer ler código de barras não baixa runtime de ONNX junto.\n\n## Uso\n\n```ts\nimport { createVisionChain } from '@adatechnology/product-vision-provider'\nimport { createBarcodeReader } from '@adatechnology/product-vision-provider/barcode'\nimport { createClipEmbedder } from '@adatechnology/product-vision-provider/clip-local'\n\nconst vision = createVisionChain([createBarcodeReader(), createClipEmbedder()])\n\ncreateCatalogModule({ db, config, providers: { vision } })\n```\n\n## A cadeia funde, não escolhe\n\nÉ a diferença em relação ao `createTranscriberChain` do `audio-transcription-provider`. Lá os\nengines são **alternativas** para a mesma pergunta e o primeiro que responde ganha. Aqui eles\nrespondem **perguntas diferentes** — um lê o código de barras, o outro produz o vetor — e a leitura\né a soma das duas.\n\nParar no primeiro que devolvesse `barcode` economizaria a inferência do CLIP e quebraria o caminho\nque mais importa: **código lido cujo GTIN ninguém cadastrou**. O consumidor cai para a busca\nvetorial exatamente ali, e cairia num vetor que nunca foi gerado.\n\nUm engine vivo basta — leitura parcial é útil. Falha é quando nenhum responde; engolir isso\ndevolveria \"nada encontrado\" ao cliente enquanto a causa é infraestrutura fora do ar. Passe\n`onEngineFailure` para enxergar a degradação: sem ele, o engine de vetor cair é invisível.\n\n## Decisões que não são configuráveis\n\n**QR Code fica de fora dos formatos aceitos.** Gôndola tem QR de promoção colado ao lado do preço, e\no cliente fotografa a prateleira inteira — decodificar esse QR viraria \"código do produto\" com a\nconfiança de um GTIN.\n\n**Símbolo sem dígito não passa por código de barras.** CODE-128 carrega texto livre; entregar\n`LOTE-ABC-2026` a uma busca por chave exata gastaria a consulta e responderia \"não encontrado\" em\nvez de deixar a cascata seguir para o vetor.\n\n**Vetor de dimensão inesperada é erro, não aviso.** A coluna do consumidor tem tamanho fixo: deixar\npassar adiaria a falha para o `INSERT`, no meio de uma conversa, e um vetor de outro modelo responde\nproduto errado com toda a confiança.\n\n**O modelo carrega uma vez, não por foto.** Instanciar o pipeline a cada imagem releria os pesos do\ndisco a cada mensagem — a diferença entre dezenas de milissegundos e vários segundos por chamada.\n\n## Runtime sem decodificador de imagem\n\nO zbar recebe pixels, não um JPEG. O engine usa `createImageBitmap` + `OffscreenCanvas` quando o\nruntime os tem; fora deles, injete o seu decoder:\n\n```ts\ncreateBarcodeReader({}, { decodeImage: async (input, maxPixels) => /* sharp, jimp… */ })\n```\n\n## Desempate por modelo de visão\n\nAinda não incluído. A `ProductVisionPort` prevê `rank`, e a cascata do `catalog-module` funciona sem\nele — sem `rank`, os candidatos voltam para a pessoa escolher na conversa. É o único degrau com\ncusto real de infraestrutura (RAM e latência de CPU), e entra quando a métrica de acerto do vetorial\nmostrar que vale a máquina.\n\n## Licença\n\nMIT — Ada Technology.\n","readmeFilename":"README.md"}