diff --git a/.env.example b/.env.example index 7163ef3..c9019b9 100644 --- a/.env.example +++ b/.env.example @@ -15,3 +15,9 @@ BRAVE_API_KEY= # SearXNG-Secret: beliebig lange Zufallskette. Für Prod mit # `openssl rand -hex 32` generieren und in der Pi-.env ablegen. SEARXNG_SECRET=dev-secret-change-me + +# Gemini Vision (Foto-Rezept-Magie). Ohne Key ist die Funktion graceful +# deaktiviert — der Kamera-Button erscheint dann gar nicht erst. +GEMINI_API_KEY= +GEMINI_MODEL=gemini-2.5-flash +GEMINI_TIMEOUT_MS=20000 diff --git a/Dockerfile b/Dockerfile index 49f5d92..ab6af21 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,8 +3,9 @@ FROM node:22-alpine AS builder WORKDIR /app -# Alpine needs build tools for better-sqlite3 native module -RUN apk add --no-cache python3 make g++ libc6-compat +# Alpine needs build tools for better-sqlite3 native module. +# vips-dev provides libvips + libheif for sharp (incl. HEIC input from iOS). +RUN apk add --no-cache python3 make g++ libc6-compat vips-dev COPY package*.json ./ RUN npm ci diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 3bab38f..963bcdf 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -13,6 +13,10 @@ services: - NODE_ENV=production # Im Header als kleine Versionsnummer unter dem Logo angezeigt. - KOCHWAS_TAG=${KOCHWAS_TAG:-dev} + # Gemini (Foto-Rezept-Magie). Leer = Feature deaktiviert. + - GEMINI_API_KEY=${GEMINI_API_KEY:-} + - GEMINI_MODEL=${GEMINI_MODEL:-gemini-2.5-flash} + - GEMINI_TIMEOUT_MS=${GEMINI_TIMEOUT_MS:-20000} depends_on: - searxng restart: unless-stopped diff --git a/package-lock.json b/package-lock.json index d9a5036..7bd9e32 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "kochwas", "version": "1.2.0", "dependencies": { + "@google/generative-ai": "^0.24.1", "@types/archiver": "^7.0.0", "@types/yauzl": "^2.10.3", "archiver": "^7.0.1", @@ -659,6 +660,15 @@ } } }, + "node_modules/@google/generative-ai": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.24.1.tgz", + "integrity": "sha512-MqO+MLfM6kjxcKoy0p1wRzG3b4ZZXtPI+z2IE26UogS2Cm/XHO+7gGRBh6gcJsOiIVoH93UwKvW4HdgiOZCy9Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@img/colour": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", diff --git a/package.json b/package.json index 52ee59a..0bafe4e 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "vitest": "^2.1.4" }, "dependencies": { + "@google/generative-ai": "^0.24.1", "@types/archiver": "^7.0.0", "@types/yauzl": "^2.10.3", "archiver": "^7.0.1",