El runtime de inferencia
Configuración
Todas las variables de entorno, y las opciones de bases de datos de alimentos (FOOD_SOURCE)
Esta página es una traducción automática de la documentación en inglés.
Todo son variables de entorno, validadas al arrancar; un valor incorrecto detiene el proceso en lugar de degradarse en silencio. La lista maestra anotada es .env.example. La documentación de openplate enumera cada variable para este contenedor en una página. Aparecen junto a las de la aplicación y el servicio de sincronización. Las variables más importantes son:
| variable | por defecto | ||||
|---|---|---|---|---|---|
MODEL_PROFILE | lite | lite \ | lite-apache \ | quality \ | external |
API_KEYS | (generado) | Claves bearer separadas por comas. Configura esto. | |||
PORT | 8300 | El único puerto publicado. | |||
CONCURRENCY | 2 | Escaneos en curso; también define las ranuras KV de llama.cpp. No añade hilos de CPU: las ranuras comparten los LLAMA_THREADS hilos. | |||
MAX_QUEUE_DEPTH | 8 | A partir de aquí, las llamadas reciben 429 + Retry-After. | |||
RATE_LIMIT_RPM | 60 | Por clave. | |||
LATENCY_CEILING_MS | 0 | 0 = desactivado. Política de admisión: rechazar el trabajo que no se pueda terminar a tiempo. Consulta Hardware. | |||
RUNTIME_COMPLETION_TIMEOUT_MS | 600000 | Límite total en una llamada de completado; 0 = desactivado. Política de disponibilidad, no de latencia: libera una ranura de worker que un runtime bloqueado nunca devolverá. También se aplica en el modo empaquetado. Consulta Runtimes. | |||
IMAGE_MAX_LONG_EDGE | 896 | Objetivo de reducción de escala. La latencia aumenta con el cuadrado. | |||
MAX_IMAGE_BYTES | 8388608 | El tamaño máximo de foto aceptado tras la descodificación en base64, en bytes (8 MiB). Un archivo más grande se rechaza con un mensaje para cambiar su tamaño. El límite del cuerpo de la solicitud se deriva de este valor. | |||
FOOD_SOURCE | fdc | Consulta Datos de alimentos. | |||
CONTEXT_SIZE | 8192 | Contexto por escaneo en curso. El contenedor lo multiplica por CONCURRENCY antes de pasárselo a llama.cpp, porque el -c de llama.cpp es el total que divide entre las ranuras. | |||
LLAMA_EXTRA_ARGS | (vacío) | Flags adicionales que se añaden al final del comando llama-server, separados por espacios. Solo en modo integrado. | |||
LLAMA_THREADS | nproc - 2 | Hilos de CPU para llama.cpp (su -t). Se reservan dos núcleos para el servicio, la descodificación de imágenes y el SO, de modo que un equipo de 6 núcleos ejecuta 4 hilos y uno de 4 núcleos ejecuta 2, con independencia de lo que indique CONCURRENCY. Asignar cada núcleo a llama.cpp provoca contención en la máquina en lugar de acelerarla. El registro de inicio imprime el valor como -t N. Solo en modo integrado. | |||
MODELS_DIR | /models | El volumen de los pesos. | |||
RUNTIME_PORT | 8080 | El puerto del llama-server integrado, en 127.0.0.1 dentro del contenedor. Solo en modo integrado. | |||
WEIGHTS_MIRROR_BASE | (vacío) | Mirror opcional; Hugging Face es la alternativa de respaldo. | |||
GPU_LAYERS | (automático) | Anula la detección automática de GPU. 0 fuerza la CPU. | |||
NVIDIA_VISIBLE_DEVICES | (establecido por el runtime) | El runtime de contenedores de NVIDIA lo establece cuando pasas --gpus all. La autodetección lo lee. Cualquier valor distinto de void o none descarga todas las capas. No lo configuras tú. | |||
LOG_LEVEL | info | debug \ | info \ | warn \ | error |
PROFILE | (desde MODEL_PROFILE) | El nombre del perfil en el registro de inicio: lite, quality o custom. El contenedor lo establece a partir de MODEL_PROFILE. Modificarlo tú cambia solo esa línea del registro. |
Las variables del modo externo (MODEL_RUNTIME_URL, MODEL_ID, MODEL_RUNTIME_API_KEY) se documentan en Trae tu propio runtime.
llama-server se ejecuta dentro del contenedor vinculado a solo 127.0.0.1 y no es accesible desde el exterior. Esto no es configurable: es un endpoint de visión sin autenticar, y el objetivo es evitar que lo publiques por accidente.
Datos de alimentos (FoodSource)
El modelo identifica alimentos y calcula los gramos. Los macronutrientes se obtienen de una base de datos de alimentos, por nombre, nunca los genera el modelo.
FOOD_SOURCE | lo que hace | red | notas |
|---|---|---|---|
fdc (predeterminado) | Busca los nombres en un extracto incluido de USDA FoodData Central, 8.041 alimentos genéricos, integrado dentro de la imagen en data/fdc-foods.json. | ninguno | Sin conexión, sin clave, sin cuenta, sin peticiones salientes. Dominio público. Es la opción predeterminada porque es la única que no necesita nada de nadie. |
off | Consulta Open Food Facts en directo en tu runtime. | saliente, por escaneo | Eficaz con productos de marca y envasados, más débil con comida casera genérica. La dirección es OFF_API_URL, https://world.openfoodfacts.org por defecto. Lee la nota sobre licencias más abajo antes de habilitarlo. No se incluye nada derivado de OFF en esta imagen. |
lcc | Consulta la API pública de lowcarbcheck. | saliente, por escaneo | Los datos más amplios de los tres (curados + BLS + USDA), y solo remotos de forma permanente, porque BLS 4.0 prohíbe la redistribución. La atribución se traslada a la respuesta para que llegue a la interfaz. Sin LCC_API_KEY, cada petición usa el nivel anónimo gratuito de LowCarbCheck; consulta más abajo. |
none | Sin resolución. Cada elemento devuelve macronutrientes nulos. | ninguno | Para clientes que hacen su propia búsqueda nutricional. |
-e FOOD_SOURCE=fdc # default
-e FDC_DATASET_PATH=./data/fdc-foods.json # relative to the working directory
-e OFF_API_URL=https://world.openfoodfacts.org # only read when FOOD_SOURCE=off
-e LCC_API_URL=https://lowcarbcheck.org # only read when FOOD_SOURCE=lcc
-e LCC_API_KEY=lcc_live_… # optional; only read when FOOD_SOURCE=lcc
-e EMBEDDING_RUNTIME_URL=http://… # optional; enables hybrid re-rankingSin LCC_API_KEY, FOOD_SOURCE=lcc usa el nivel anónimo de LowCarbCheck: 1.000 créditos por día UTC, compartidos entre todas las peticiones desde tu dirección IP. Una búsqueda cuesta 1 crédito. Un escaneo emite hasta 3 consultas de búsqueda por elemento identificado, según el límite de refinamiento en search-foods.ts, para un máximo de 8 elementos. Esto fija el peor caso en 24 créditos por escaneo. La canalización nunca llama al endpoint por alimento, por lo que eso cubre el coste completo. Ese peor caso permite unos 41 escaneos al día. La mayoría de los días permiten más, ya que una búsqueda se detiene en cuanto una consulta supera el umbral de aceptación. Cuando el nivel se agota, cada elemento restante devuelve macronutrientes nulos hasta el siguiente día UTC, y el escaneo sigue devolviendo 200. Una clave gratuita de lowcarbcheck.org/developers sube la cuota a 100.000 créditos al mes a un máximo de 120 peticiones por minuto. Esta cuota pertenece a la clave y no a tu dirección IP. Configúrala como LCC_API_KEY. El servicio la envía como token bearer a LCC_API_URL y a ningún otro sitio, y nunca la registra. Una clave que LowCarbCheck rechace falla igual que una cuota agotada: macronutrientes nulos y un 200. fdc no requiere red ni cuota.
Los macronutrientes resueltos están etiquetados. Los alimentos cotejados con la base de datos incluyen un provenance con "corpus", más una cadena attribution cuando la fuente lo exige. Los alimentos sin coincidencias omiten ambos campos, y macrosPer100g es null. openplate expone estos valores para que los usuarios puedan distinguir las entradas confirmadas de la base de datos de los elementos sin datos de macronutrientes.
La falta de una base de datos de alimentos no detiene los análisis. Si FDC_DATASET_PATH no apunta a nada, el servicio registra una advertencia, desactiva la resolución y sigue identificando platos. Obtienes nombres y gramos con macronutrientes null, degradado pero no roto. Regenera el extracto con pnpm food-data:fdc (requiere red).
EMBEDDING_RUNTIME_URL es opcional. Apúntalo a un segundo runtime compatible con OpenAI que sirva /v1/embeddings (por ejemplo, llama-server --embedding) y la recuperación pasará a ser híbrida: el evaluador léxico busca candidatos y el modelo de embeddings los reordena, de modo que "grilled chicken thigh" dé con la fila correcta aunque la base de datos use otras palabras. Si no lo configuras, que es la opción por omisión, la recuperación será solo léxica, lo cual ofrece una clasificación ligeramente peor pero nunca un error. Si el runtime de embeddings no está accesible, se degrada a solo léxico con una única advertencia; nunca hace fallar un análisis.
FOOD_SOURCE=off y el requisito share-alike de la ODbL
Los datos de Open Food Facts se publican bajo la Open Database Licence (ODbL), que es share-alike. Si activas este conector y luego publicas o redistribuyes una base de datos que incorpore datos de OFF (no las consultas individuales que muestras en pantalla, sino una base de datos derivada), la ODbL te obliga a poner esa base de datos derivada a disposición del público también bajo la ODbL y a atribuir la autoría a Open Food Facts.
En una instancia doméstica que muestra una consulta y la guarda en tu propio diario, esto no aplica. Si estás creando un producto a partir de esto, sí aplica, y por esa razón off no es la opción predeterminada. fdc no conlleva ninguna obligación de tipo share-alike.
Las condiciones de licencia de los modelos y datos se recopilan en Licencia.