Downloads · 30 days
922
8% of all-time downloads
NateRunsA-LIST/alist-food-text-qwen35
alist-food-text-qwen35 is a machine learning model from NateRunsA-LIST. Use it for the machine learning task on the model card, and read the license before you ship it in a product. The card lists the license as apache-2.0.
On-device food-diary nutrition extraction for the A-LIST iOS app (Locomo mode). Runs in llama.cpp (qwen35 arch — needs b10369 or newer).
Downloads · 30 days
922
8% of all-time downloads
All-time downloads
12.2K
Public
Repo size
2.7 GB
Likes
0
Public
Click a slice to open those files.
.gguf2.7 GB · 100%
From the Hugging Face model README
On-device food-diary nutrition extraction for the A-LIST iOS app (Locomo mode).
Runs in llama.cpp (qwen35 arch — needs b10369 or newer).
| file | what | sha256 |
|---|---|---|
Qwen3.5-2B-Q4_K_M.gguf | Base model, Q4_K_M quant (mirror of unsloth/Qwen3.5-2B-GGUF, byte-identical) | aaf42c8b7c3cab2bf3d69c355048d4a0ee9973d48f16c731c0520ee914699223 |
alist-food-lora-v2-f16.gguf | Food-text extraction LoRA (r=64, alpha=64, f16) | 3bd0c6625857bcbaa0c13223e2c177654c798db232dd3257baba924e5e4d2ec3 |
food-text-unified:v1 (66.5k scrubbed food-diary rows, teacher food_text_v1)qlora_r64_sft(3ep), converted from PEFT safetensors with llama.cpp convert_lora_to_gguf.py (--outtype f16)The adapter is conditioned on this exact raw-text prompt — no chat template, no
<think> block (the long food_text_v1 teacher prompt labeled the corpus but is NOT
the inference prompt):
Extract nutrition from this food diary entry. Estimate typical portions when unstated; copy user-stated numbers verbatim and list those fields in user_stated_fields. Output only JSON.
Entry: {entry}
###JSON
It replies with a single JSON object: macros + sugar/saturated_fat, water_ml,
glycemic_index, 15 micronutrients, user_stated_fields, meal_title. Consumers
should apply the dataset's post-processing (stated-calories reconcile, sugar/sat-fat
subset invariant, calories derived 4/4/9 when unstated, GL derivation) — the eval
numbers above are measured on post-processed outputs.
Both the base model and the fine-tune are Apache 2.0.
mmproj-Qwen3.5-2B-Q8_0.gguf (365 MB, sha256 5eda1f66…) is the vision tower requantized to Q8_0 from the original Qwen3.5-2B weights — current for iOS (qwen_mmproj_v2_q8). On the frozen 215-product supplement eval every gated structured field holds within 1 point of the F16 numbers (micros improve, .862 vs .848). mmproj-Qwen3.5-2B-F16.gguf stays for rollback.
| file | what | sha256 |
|---|---|---|
alist-food-lora-v3pos-f16.gguf | Food-text extraction LoRA, positional output contract (r=64, alpha=64, f16, 87,307,648 bytes) | 79b3edaad9f9ad49d3e0807aa95f54dc0aa48e9dbfa044444eee53b80bab1ee6 |
Same prompt as v2, byte for byte. The reply is {"n":[24 numbers],"s":[stated field names],"t":"meal title"}
with n in this order: calories, protein, carbohydrates, fat, fiber, sugar, saturated_fat, water_ml,
glycemic_index, vitaminA, vitaminC, vitaminD, vitaminE, vitaminK, vitaminB6, vitaminB12, folate, calcium, iron,
magnesium, zinc, potassium, selenium, omega3 (integers when integral, else ≤2 decimals). Consumers expand n
back to the keyed fields (lab/teacher/food_text_student_v3pos.py in ProtocolsBackend) and apply the same
post-processing as v2. ~98 output tokens vs ~222 ⇒ 5.9 s vs 9.8 s per entry on an iPhone 16.
lora_r64_bf16(2ep, lr 2e-4, bs 4x8) on the augmented train set (119,718 rows: v1 + 55,457
paraphrases + 4,995 hardcases); converted with llama.cpp convert_lora_to_gguf.py --outtype f16.alist-food-lora-v2-f16.gguf stays: A-LIST 2.51 and 2.52 pin it by sha256. Do not modify or remove it.| file | what | sha256 |
|---|---|---|
alist-med-label-lora-v1-f16.gguf | Medication-label OCR-text extraction LoRA (r=64, alpha=128, f16, 87,307,264 bytes) | 0b345bebf0db54a19680d63333b903d324c434fbb7b0d37f30ba389eda0f6eaf |
The OCR rung for the Medications protocol in signed-out mode: Apple Vision OCR
text of a pharmacy sticker, compounding vial, Drug Facts panel, stock bottle or
Supplement Facts panel in, one structured medication record out. Trained on
medication-label-text:v1 (12k synthetic labels with exact targets, no patient
data; checkpoint 600 of a 1-epoch mlx-lm run, picked on val loss). Same base,
same target modules as the other adapters; never stack with the food or
supplement adapter on one context.
Eval on the shipped stack (Q4_K_M base + this adapter, 1,827 rows whose drugs never appear in training): parse_fail 0 · kind .999 · rx_only 1.000 · serving_desc .993 · frequency_unit .990 · doses_per_day .989 · doses_per_week .999 · serving_strength .973 · strength_unit .951 · name .951 · all core fields .879. Zero-shot base: .000.
Prompt contract (medication_label_student_v1): Qwen3.5 chat template with
thinking disabled, ONE user turn = instruction + OCR text (≤2000 chars), no
prefill, greedy, stop <|im_end|>, max 400 tokens, cut the first balanced JSON
object:
<|im_start|>user
Extract the medication or supplement from this label OCR text as one JSON object. Read amounts exactly as printed; null means not printed. Output only JSON.
{ocr_text}<|im_end|>
<|im_start|>assistant
<think>
</think>
Output keys in order: kind, name, brand, rx_only, form, route, serving_desc,
serving_strength, strength_unit, doses_per_day, doses_per_week, frequency_unit,
ingredients[{name, amount, unit}]. Cadence is the canonical trio
(as_directed → doses_per_day 0; every_other_day → 0.5; weekly → doses_per_week).