From 61336823b3374476b97e466582da114a22b59bd6 Mon Sep 17 00:00:00 2001 From: Alexander Bocken Date: Thu, 2 Apr 2026 20:47:04 +0200 Subject: [PATCH] nutrition: pre-download HuggingFace models at build time The deployment server couldn't fetch transformer models at runtime due to restricted network access and permission errors writing to node_modules. Add a prebuild script to download models during build and document TRANSFORMERS_CACHE env var for configuring a shared writable cache path. --- .env.example | 3 +++ package.json | 2 +- scripts/download-models.ts | 17 +++++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 scripts/download-models.ts diff --git a/.env.example b/.env.example index 9481f6a..2f9cbc2 100644 --- a/.env.example +++ b/.env.example @@ -33,3 +33,6 @@ DEEPL_API_URL="https://api-free.deepl.com/v2/translate" # Use https://api.deepl # AI Vision Service (Ollama for Alt Text Generation) OLLAMA_URL="http://localhost:11434" # Local Ollama server URL + +# HuggingFace Transformers Model Cache (for nutrition embedding models) +TRANSFORMERS_CACHE="/var/cache/transformers" # Must be writable by build and runtime user diff --git a/package.json b/package.json index 89dc636..4af2ea8 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "type": "module", "scripts": { "dev": "vite dev", - "prebuild": "bash scripts/subset-emoji-font.sh && pnpm exec vite-node scripts/generate-mystery-verses.ts", + "prebuild": "bash scripts/subset-emoji-font.sh && pnpm exec vite-node scripts/generate-mystery-verses.ts && pnpm exec vite-node scripts/download-models.ts", "build": "vite build", "preview": "vite preview", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", diff --git a/scripts/download-models.ts b/scripts/download-models.ts new file mode 100644 index 0000000..cc1589c --- /dev/null +++ b/scripts/download-models.ts @@ -0,0 +1,17 @@ +/** + * Pre-downloads HuggingFace transformer models so they're cached for runtime. + * Run with: pnpm exec vite-node scripts/download-models.ts + */ +import { pipeline } from '@huggingface/transformers'; + +const MODELS = [ + 'Xenova/all-MiniLM-L6-v2', + 'Xenova/multilingual-e5-small', +]; + +for (const name of MODELS) { + console.log(`Downloading ${name}...`); + const p = await pipeline('feature-extraction', name, { dtype: 'q8' }); + await p.dispose(); + console.log(` done`); +}