# Model Research Consolidated research behind the model choices in `ocr_arena.py`, `extract_arena.py`, and `svlm_council.py`. **Research dated 2026-08-25/26; licenses reviewed 2026-09-08** — provider availability, leaderboards and license terms go stale fast; re-verify before acting on any table below. ## Contents - [How to refresh this research](#how-to-refresh-this-research) — endpoints, leaderboards, license and compat checks - [Current lineup (as shipped)](#current-lineup-as-shipped) — the 9 models and what each did on the bib photo - [Hosted candidates](#hosted-candidates-hf-inference-router-verified-2026-08-25) — router availability, pricing, Gemma 4 sweep - [Local ≤10B candidates](#local-10b-candidates-transformers-on-apple-silicon-host--m2-max-32gb) — selected council members and the dropped list - [Benchmark snapshots](#benchmark-snapshots-retrieved-2026-08-2526) — Roboflow Data Extraction, OCRBench v2, OmniDocBench - [Transformers integration quirks](#transformers-integration-quirks-the-councils-generic-path) — per-model gotchas, MPS lessons - [Prompting findings](#prompting-findings) — format directives, abstention, schema breadth - [Family lineage](#family-lineage-for-arena-diversity) — Qwen-lineage overlap to avoid - [Model licenses](#model-licenses-reviewed-2026-09-08) — [summary table](#summary), [per-license notes](#per-license-notes), [implications by scenario](#implications-by-scenario), [sources](#sources-fetched-2026-09-08) ## How to refresh this research Verification endpoints (all checked live during the original research): - **Router catalog**: `https://router.huggingface.co/v1/models` — JSON of the *curated* subset of HF Inference Providers models (~130 entries). Image-capable = `architecture.input_modalities` contains `"image"`. Carries per-provider `status`, `pricing`, `context_length`, latency/throughput. It is NOT the full catalog — models can be live on a provider without appearing here. - **Per-model authority**: `https://huggingface.co/api/models/?expand[]=inferenceProviderMapping` — the stricter source. `status: "live"` vs `"error"` per provider. Add `&expand[]=safetensors` for param counts, `&expand[]=gated` for gating. - **Reliability marker**: a model whose ONLY provider is `featherless-ai` is on-demand: it cold-starts (503 `capacity_exhausted`, sometimes for minutes) and its router entries carry no pricing/latency fields. Treat featherless-only as "works, but flaky". `extract_arena.py` retries 503s via `stamina` inside a 60 s total budget (`HF_RETRY_TIMEOUT_S`, 20 s waits -> attempts at ~0/20/40/60 s); a model still cold after that surfaces as a per-model error. - **Router body cap ~5 MiB** (undocumented; measured 2026-08-28 by binary search: 5.23MB body passes, 5.31MB gets 413 `request entity too large`, identical across models/providers). Images ride inline as base64 data URLs (×4/3), so the effective image budget is ~3.7MB encoded — `extract_arena.image_to_data_url` recompresses to fit `MAX_DATA_URL_BYTES`. Trap that triggered this: `app.py`'s `_prepare_image` saves its 3MP downscale as **lossless PNG**, which for photos can be *larger* than the original JPEG (a 3.5MB/15MP JPEG became a 5.1MB PNG → 6.85MB base64 → 413 on every hosted model). - **Leaderboards**: [Roboflow vision evals — Data Extraction](https://playground.roboflow.com/evals/data-extraction) (single-field, exact-match — the closest public proxy for this project's task), [OCRBench v2](https://99franklin.github.io/ocrbench_v2/) (has an Extraction subscore), OmniDocBench v1.6 (doc parsing; see the [PaddleOCR-VL-1.6 report](https://arxiv.org/html/2606.03264v1)), [Nanonets IDP/KIE](https://benchmarking.nanonets.com/). - **License**: `https://huggingface.co/api/models/?expand[]=cardData` gives the tag + `license_link`; then read the repo `LICENSE`/`NOTICE`/`README` and whatever the link points at — the tag alone misleads (Gemma 4 tags `apache-2.0` and *is*, but Google's site links a use policy beside it; Muse ships a `USAGE_POLICY.md` the LICENSE never mentions). Findings live in [Model licenses](#model-licenses-reviewed-2026-09-08). - **Transformers compat**: check `config.json` (`architectures`, `model_type`, MoE fields), the model card's install/usage snippets, and the in-tree model doc at `https://huggingface.co/docs/transformers/main/en/model_doc/`. On Apple Silicon: flash-attn is unavailable, and **MoE models crash on MPS** (`histogram_mps` NotImplementedError). ## Current lineup (as shipped) | Model | Script(s) | Backend | Why | Observed (bib photo `asset/3416666532_59b3c4269f_z.jpg`, GT `16551`) | |---|---|---|---|---| | moondream3 (`moondream/moondream3-preview`) | ocr_arena, extract_arena | Space `GF-John/moondream-pointer` via gradio_client, `/predict`, `mode="query"` | Project requirement; no token needed | Correct; ~5–10s; ZeroGPU Pro quota can exhaust (16h cooldown) | | `Qwen/Qwen3.5-9B` | ocr_arena, extract_arena | Router (together/deepinfra/ovhcloud) | Live on serious providers; strong general VLM | Correct; 2–10s; most reliable remote entry | | `meta-models/Muse-Glimmer-30B` | extract_arena | Router (together/fireworks/deepinfra) | 86.6% Roboflow Data Extraction — best open ≤40B on the closest proxy task; non-Qwen; Apache-2.0 | Correct; 1.8s; abstains correctly | | `google/gemma-4-31B-it` | extract_arena | Router (novita/cerebras/together/deepinfra) | Best hosted availability; extraction unbenchmarked at this size — in arena to generate evidence | Correct; 1.1s (fastest remote); abstains correctly | | `google/gemma-4-26B-A4B-it` | extract_arena | Router (novita/scaleway/deepinfra) | Cheapest hosted option ($0.07→0.34/M); MoE 3.8B-active sibling for dense-vs-MoE comparison | Correct; 3.0s; abstains correctly | | `baidu/Qianfan-OCR` (4.7B) | svlm_council, extract_arena | Local transformers | #1 KIE anywhere tested (87.9 overall; Nanonets KIE F1 86.5); Apache-2.0; zero remote code | Correct; ~20s warm on M2 Max | | `tencent/HunyuanOCR` 1.5 (1.1B) | svlm_council, extract_arena | Local transformers | IE 92.3 cards/receipts, best scene-text <3B; only 2.2GB | **Misread `1651` under terse prompt** but read 16551 correctly in a descriptive answer — prompt-sensitive; ~4s warm | | `ibm-granite/granite-vision-4.1-4b` | svlm_council, extract_arena | Local transformers | VAREX key-value extraction 94.2% exact-match (closest benchmark to this task); Apache-2.0 | Correct (once with trailing `.`); ~10–20s warm | | `Qwen/Qwen3-VL-8B-Instruct` | svlm_council, extract_arena | Local transformers | Best sub-10B OCRBench (0.896); scene-robust (blur/tilt/low light) | Correct; **slow (~8–10 min) on 32GB** — 17.5GB bf16 is memory-pressure-bound; Qwen lineage overlap | | `zai-org/GLM-OCR` (0.9B) | *(removed)* | was local transformers in ocr_arena | OmniDocBench 95.22 — great at *transcription* | Dropped for extraction: prompt-locked (fixed task prompts / strict JSON schema only) and weak KIE (Nanonets 54.9) | ## Hosted candidates (HF Inference router, verified 2026-08-25) "Serious" providers = dedicated (together, deepinfra, novita, fireworks, cerebras, nebius, hyperbolic, ovhcloud, scaleway, nscale, sambanova, groq) or first-party (zai-org, cohere); featherless-ai excluded from counts. Licenses per row are verified in [Model licenses](#model-licenses-reviewed-2026-09-08) (the `Family` column only carries the headline). | Repo | Size | Family | Serious providers | Price ($/M in→out, cheapest) | Notes | |---|---|---|---|---|---| | `google/gemma-4-31B-it` | 31.3B dense | Gemma 4, Apache-2.0, ungated | 4 (novita, cerebras, together, deepinfra) | 0.13→0.38 (deepinfra) | Best availability; extraction quality unbenchmarked | | `google/gemma-4-26B-A4B-it` | 25.8B / 3.8B-active MoE | Gemma 4 | 3 (novita, scaleway, deepinfra) | 0.07→0.34 | Cheap/fast sibling of the 31B | | `meta-models/Muse-Glimmer-30B` | 29.6B dense | Meta **Muse** (not Llama), Apache-2.0 | 3 (together, fireworks, deepinfra) | 0.30→1.20 | **86.6% Roboflow Data Extraction — best open ≤40B**; OCR 92.1% | | `meta-llama/Llama-4-Scout-17B-16E` | 108B / 17B active | Llama 4, gated=manual | 3 (novita, nscale, deepinfra) | 0.09→0.29 | No extraction evidence; gated | | `zai-org/GLM-4.6V-Flash` | 10.3B dense | GLM-V, MIT, ungated | 2 (novita, zai-org) | 0.30→0.90 | Smallest non-Qwen with 2 providers; only ExtractBench 41.76 as evidence | | `Qwen/Qwen3-VL-30B-A3B-Instruct` | 31B / 3B active | Qwen | 2 (novita, deepinfra) | 0.15→0.60 | Qwen overlap | | `google/gemma-3-27b/12b/4b-it` | dense | Gemma 3, gated=manual | 1 (deepinfra) | from 0.05→0.10 | 27B slow (ttft ~1.9s); weak OCR evidence | **Gemma 4 hosted-variant sweep (2026-08-26)**: of the whole family, only `gemma-4-31B-it`, `gemma-4-26B-A4B-it`, and a third-party finetune (`pearl-ai/Gemma-4-31B-it-pearl`, together-only, unknown provenance) have any providers; `gemma-4-12B-it` and the E4B/E2B variants have none. Extraction evidence for the family exists only for the tiny E-series on Nanonets IDP (E4B KIE 55.0, E2B 44.1 — weak); the hosted sizes are unbenchmarked on extraction, which is why both were added to extract_arena (2026-08-26) to generate first-party evidence. **No serious serving at all** (empty or featherless-only mappings, verified): official Mistral vision (Small 3.2), Kimi-VL A3B, InternVL3.5, Phi-4-multimodal, SmolVLM2, Molmo, all small Qwen3-VL (4B/8B/32B), all OCR specialists except those listed, `zai-org/GLM-OCR` (mapping exists but `status: "error"`). ## Local ≤10B candidates (transformers on Apple Silicon; host = M2 Max 32GB) Selected (all in-tree, dense, no flash-attn requirement, open-ended QA — no prompt-lock; license detail for every row is in [Model licenses](#model-licenses-reviewed-2026-09-08)): | Repo | Params / bf16 | Extraction evidence | License | transformers | |---|---|---|---|---| | `baidu/Qianfan-OCR` | 4.7B / 9.5GB | KIE overall 87.9 (beats Qwen3-VL-235B 84.2, Gemini-3.1-Pro 79.2); OCRBench KIE 95.0; Nanonets KIE F1 86.5; OCRBench 880 ([paper](https://arxiv.org/pdf/2603.13398)) | Apache-2.0 | ≥5.6, zero remote code | | `tencent/HunyuanOCR` (1.5) | 1.1B / 2.2GB | IE cards 92.29 / receipts 92.53; OCRBench 860 (SOTA <3B); best scene-text spotting in class ([report](https://arxiv.org/pdf/2607.04884)) | Tencent Hunyuan Community (non-OSI; **no EU/UK/KR**, 100M MAU, end-user disclosure — see [licenses](#model-licenses-reviewed-2026-09-08)) | ≥5.13 (backend="pil" needs ≥5.15) | | `ibm-granite/granite-vision-4.1-4b` | 4.0B / 8GB | VAREX KVP extraction 94.2% exact-match zero-shot ([VAREX](https://arxiv.org/abs/2603.15118)) | Apache-2.0 | ≥5.8; needs `peft>=0.19.1` (ships as LoRA) | | `Qwen/Qwen3-VL-8B-Instruct` | 8.8B / 17.5GB | OCRBench 0.896 (best sub-10B); OCRBench v2 en 0.654; explicitly blur/tilt/low-light robust | Apache-2.0 | ≥4.57 | | `openbmb/MiniCPM-V-4.6` *(bench, not shipped)* | 1.3B / 2.6GB | OCRBench 876, DocVQA 94.7 | Apache-2.0 | ≥5.7 in-tree | Dropped, with reasons (so they aren't re-litigated): | Repo | Reason | |---|---| | `infly/Infinity-Parser2-Flash` | Dropped 2026-08-26 (was in extract_arena): featherless-ai is its only provider and 503-cold-starts unpredictably (one run exhausted all 4×20s retries); Qwen3.5-2B derivative (lineage overlap with the qwen3.5 entry); full-page layout parser used off-label for field QA. Answers themselves were correct. Replaced by Muse-Glimmer-30B (+ two Gemma 4s) | | `zai-org/GLM-OCR` | Prompt-locked (fixed task prompts or strict JSON-schema IE: `请按下列JSON格式输出图中信息:` + schema); empirically weak KIE (Nanonets 54.9). Superb at transcription (OmniDocBench 95.22) — wrong tool for QA-style extraction | | `PaddlePaddle/PaddleOCR-VL-1.6` | Doc-parsing SOTA (96.33 v1.6) but prompt-locked (`"OCR:"` etc.), no free-form questions; transformers path is element-level only | | `numind/NuExtract3` (4B) | Purpose-built schema extraction (best format discipline: 27 vs 229 malformed outputs vs its base) but schema-first interface and Qwen3.5-4B base (family overlap) | | `ATH-MaaS/Ovis2.5-9B` | trust_remote_code pinned to transformers 4.51 — forks the env; Qwen3-8B backbone | | `openbmb/MiniCPM-V-4_5` (8.7B) | Broken on transformers v5 (processor incompatibilities); use 4.6 instead | | `Qwen/Qwen3.5-4B` | MoE → crashes on MPS (`histogram_mps`); family overlap | | `deepseek-ai/DeepSeek-OCR-2` | Pinned `transformers==4.46`, trust_remote_code; OCRBench QA very weak (430 for v1) | | `dots-studio/dots.mocr`, `LightOnOCR-2-1B`, `MinerU2.5`, Nanonets-OCR2 | Page transcribers / layout parsers, not field-QA models; various serving/license gaps | | `tencent/HunyuanOCR` note | (kept) — official toolkit locks prompts to 12 task types, but the *model* handles open-ended QA per its report; transformers path is free-form | ## Benchmark snapshots (retrieved 2026-08-25/26) **[Roboflow Data Extraction](https://playground.roboflow.com/evals/data-extraction)** (single field from an image, exact-match; 31 models, updated 2026-08-20). Top: Gemini 3 Flash 96.9%. Best open weights: Qwen3.8-Max 87.6%, **Muse Glimmer 30B 86.6%**, Qwen3-VL-235B 86.6%, Qwen3.6-27B 85.6%, Qwen3.8-27B 79.4%, Qwen3.5-27B 78.3%. Open models trail the closed frontier by ~10 points on exactly this task. Note the non-monotonic Qwen ordering (3.6 > 3.8 > 3.5 at 27B) — newer ≠ better. **[OCRBench v2 (en)](https://99franklin.github.io/ocrbench_v2/)** (2026.06 cohort, Extraction subscore): Qwen3.6-35B-A3B 58.9 (best confirmed-open), Qwen3.5-35B-A3B 58.6, Nemotron 3 Nano Omni 54.2. Older cohort: Qwen3-VL-8B 0.654, 4B 0.637 — a 4B beating Qwen2.5-VL-72B (0.615). **OmniDocBench v1.6** (doc parsing, not extraction — from the [PaddleOCR-VL-1.6 report](https://arxiv.org/html/2606.03264v1)): PaddleOCR-VL-1.6 96.33 > MinerU2.5-Pro 95.75 > GLM-OCR 95.22 > … dots.ocr 90.77, DeepSeek-OCR-2 90.25. High doc-parsing scores do **not** imply good field extraction (GLM-OCR: 95.22 here, 54.9 Nanonets KIE). ## Transformers integration quirks (the council's generic path) One generic function serves all four council members — `AutoProcessor` + `AutoModelForImageTextToText`, messages `{"type":"image","url":...}` + `{"type":"text",...}`, `apply_chat_template(tokenize=True, add_generation_prompt=True, return_dict=True, return_tensors="pt")`, `inputs.pop("token_type_ids", None)`, generate, slice + `batch_decode`. Binding floors: **transformers ≥5.15** (HunyuanOCR `backend="pil"`), **torch ≥2.10** (MPS kernels). | Model | Quirks | |---|---| | Qianfan-OCR | bf16; config ships `use_cache: false` → pass `use_cache=True`; injects a default Chinese system prompt when none given; optional `enable_thinking` template kwarg | | HunyuanOCR | `attn_implementation="eager"` (doc-recommended); processor `backend="pil"`; card recommends `repetition_penalty=1.08`; non-ChatML delimiters; **no resolution cap in its processor** — a 3200×4800 upload → 60k patches → 60k² eager-attention matrix OOMs even 48GB (seen on ZeroGPU as an `NVML_SUCCESS` internal assert in the CUDA caching allocator, 2026-08-27); `app.py` guards with `MAX_IMAGE_PIXELS` downscaling. Even at 3MP (11.6k patches), eager's float32 softmax needs ~17GB transient — more than the VRAM left beside the resident council — so `app.py` forces **sdpa on CUDA** (output verified identical to eager on the bib image; eager stays only on the local MPS path per the doc recommendation) | | granite-vision-4.1 | Needs `peft>=0.19.1` (LoRA over Granite base — transparent via from_pretrained) and `pillow>=12.2`; task tags (`` …) available | | Qwen3-VL-8B | `dtype="auto"`; generation_config ships `do_sample=true, temperature=0.7` → neutralize explicitly for deterministic runs; doc shows the `token_type_ids` pop; decode with `clean_up_tokenization_spaces=False` | Hard-won MPS lessons: - `device_map="auto"` (accelerate) offloads to disk far too eagerly on Macs → use `device_map="mps"` (qianfan: 190s → ~20s/query). A 17.5GB model on 32GB is slow either way. - torchvision is required by several image processors even on the "pil" path (GLM-OCR, HunyuanOCR both failed without it). - All four council members are dense; avoid MoE checkpoints on MPS. - The four together are ~37GB bf16 — `svlm_council.py` keeps exactly one resident (single-slot cache with eviction). ## Prompting findings - **Format directives** (Roboflow style): every Roboflow extraction prompt is two sentences — question + format directive ("Format the answer as a continuous sequence of uppercase letters and digits (e.g., ABC1234)."), with the inline example only when the shape is ambiguous. Exists to canonicalize for exact-match scoring. Literature: format constraints help extraction/parseability, hurt reasoning ([Tam et al., EMNLP 2024](https://arxiv.org/abs/2408.02442)); Roboflow correspondingly omits them from its Reasoning task. Implemented as `-F/--format` in `extract_arena.py` (verbatim sentence, inserted before the abstention guardrail). - **Abstention**: VLMs rarely abstain unprompted — near-zero abstention on unanswerable instances ([arXiv 2604.14799](https://arxiv.org/pdf/2604.14799), [VLM-DeflectionBench](https://arxiv.org/html/2604.12033v1)). A fixed sentinel works far better than asking for an empty reply: prompt "answer exactly \"N/A\" if not present" (kept LAST in the prompt so a format directive can't pressure fabrication) + code-side normalization of N/A-variants to `""`. Implemented in `extract_arena.py`. - **Schema breadth kills extraction**, not document length: frontier models hit 0% valid output on a 369-field schema ([ExtractBench](https://arxiv.org/html/2602.12247v2)). One-field-per-request is the safe regime; valid JSON ≠ correct values ([arXiv 2604.25359](https://arxiv.org/abs/2604.25359): 67.2% value accuracy on images). - **Model output shapes vary**: Infinity-Parser2 (since dropped) answered multi-field requests in its native layout-JSON (`[{bbox, category, value}]`); moondream rewrites field names with underscores; some models omit absent keys instead of emitting `""`. `_parse_json_reply` in `extract_arena.py` flattens/tolerates these. ## Family lineage (for arena diversity) Qwen-lineage models to avoid stacking: Qwen3.5-9B (in arena), Infinity-Parser2-Flash/Pro (fact-checked: `Qwen3_5ForConditionalGeneration`; tech report "trained based on Qwen3.5-2B" / "-35B-A3B"), NuExtract3 (Qwen3.5-4B base), Ovis2.5 (Qwen3-8B backbone), Qwen3-VL-8B (in council), InternVL3.5 (Qwen backbone). Non-Qwen families in play: Moondream, Baidu (Qianfan), Tencent (Hunyuan), IBM (Granite), Google (Gemma), Meta (Muse), Z.ai (GLM), OpenBMB (MiniCPM). ## Model licenses (reviewed 2026-09-08) Weights licenses only, as published on each HF model card and `LICENSE` file at HEAD on 2026-09-08. Not covered: HF Inference Providers' own terms, the `GF-John/moondream-pointer` Space's terms, ZeroGPU terms. Not legal advice — licenses change; re-verify against the Sources before relying on any row. Method: `/api/models/?expand[]=cardData` for the tag + `license_link`, then the repo `LICENSE`/`NOTICE`/`README` and any external page the link names (the tag alone is not enough — see Gemma 4 and Muse below). Companion analysis: the Moondream rows condense `hfs-moondream-pointer/MOONDREAM_LICENSES.md` (sibling repo), which compares moondream2 / 3-preview / 3.1 in depth. ### Summary | Model | Where | License | OSI | Paid API / MaaS | Territory / scale caps | Use policy | Notes | |---|---|---|---|---|---|---|---| | `moondream/moondream3-preview` | hosted (own Space) | BSL 1.1 + Additional Use Grant | No (source-available) | **Prohibited** if it competes with M87's paid versions | None | None | Becomes Apache-2.0 two years after first public release (treat as 2027-09-18); no patent grant | | `Qwen/Qwen3.5-9B` | hosted (router) | Apache-2.0 (verbatim, © 2026 Alibaba Cloud) | Yes | OK | None | None | `LICENSE` in repo | | `meta-models/Muse-Glimmer-30B` | hosted (router) | Apache-2.0 (verbatim) | Yes | OK | None | `USAGE_POLICY.md` alongside (not referenced by the LICENSE) | Policy: no under-18 users, prohibited-use list, trade-compliance language | | `google/gemma-4-31B-it` | hosted (router) | Apache-2.0 (verbatim) | Yes | OK | None | Gemma Prohibited Use Policy is *linked*, not incorporated (see below) | No `LICENSE` file in repo; `license_link` → Google page hosting plain Apache-2.0 | | `google/gemma-4-26B-A4B-it` | hosted (router) | Apache-2.0 (verbatim) | Yes | OK | None | same as 31B | same as 31B | | `baidu/Qianfan-OCR` | local council | Apache-2.0 (verbatim) | Yes | OK | None | None | `NOTICE`: 4 files derived from InternVL (OpenGVLab, MIT) — keep the NOTICE if redistributing | | `tencent/HunyuanOCR` 1.5 | local council | Tencent Hunyuan Community License | No | OK inside Territory | **Excludes EU, UK, South Korea**; 100M MAU cap | Exhibit A AUP (20 items, incl. "use outside the Territory", military, high-stakes automated decisions) | Must disclose real provider + Tencent non-affiliation to end users; outputs may not train other models; HK law; no patent grant | | `ibm-granite/granite-vision-4.1-4b` | local council | Apache-2.0 | Yes | OK | None | None | No `LICENSE` file; card links apache.org; base `granite-4.1-3b` also Apache-2.0 | | `Qwen/Qwen3-VL-8B-Instruct` | local council | Apache-2.0 (tag only) | Yes | OK | None | None | No `LICENSE` file or License section in card | | `meta-llama/Llama-4-Scout-17B-16E` | benched | Llama 4 Community License (2025-04-05) | No | OK | **No rights for EU-domiciled licensees** (multimodal clause, in the AUP); 700M MAU cap | Llama 4 AUP | Gated (manual); "Built with Llama" display + "Llama" prefix on derivative names + notice text; California law | | `zai-org/GLM-4.6V-Flash` | benched | MIT (tag only) | Yes | OK | None | None | No `LICENSE` file or License section in card | | `Qwen/Qwen3-VL-30B-A3B-Instruct` | benched | Apache-2.0 (tag only) | Yes | OK | None | None | No `LICENSE` file | | `google/gemma-3-27b/12b/4b-it` | benched | Gemma Terms of Use (rev. 2026-04-01) | No | OK | None | Gemma Prohibited Use Policy, **incorporated** | Gated (manual, must accept terms); notice text on non-hosted distribution; Google may update terms and restrict use remotely; outputs are yours | | `openbmb/MiniCPM-V-4.6` | benched | Apache-2.0 (verbatim, © OpenBMB, on GitHub) | Yes | OK | None | None | Card: "weights and code are open-sourced under the Apache-2.0 license"; no registration step | ### Per-license notes **Apache-2.0** — 7 of the 9 shipped models (`Qwen3.5-9B`, `Muse-Glimmer-30B`, both Gemma 4s, `Qianfan-OCR`, `granite-vision-4.1-4b`, `Qwen3-VL-8B`) plus `Qwen3-VL-30B-A3B` and `MiniCPM-V-4.6`. Internal, commercial, hosted-API and fine-tuning use are unrestricted; the only obligations bite when you *redistribute* weights or derivatives (license copy, change notices, carry any `NOTICE` — Qianfan-OCR's lists InternVL-derived files). Includes a patent grant. Three of these repos (`Qwen3-VL-8B`, `Qwen3-VL-30B-A3B`, `GLM-4.6V-Flash`'s MIT) declare the license only in the HF card metadata with no license file in the tree — legally the card is the publisher's statement, but pin the commit hash if you need to prove what was declared. **Gemma 4 vs. Gemma 3** — the HF tag `apache-2.0` on Gemma 4 is accurate: `license_link` resolves to a Google page containing the standard Apache-2.0 text with no preamble. Google's site still links a Gemma Prohibited Use Policy (last modified 2024-02-21) and an Intended Use Statement (2026-04-01) next to it, but the only instrument that *incorporates* the policy is the Gemma Terms of Use, and those Terms say "For Gemma 4 terms, see the Gemma 4 license" and list only Gemma 1–3/3n and siblings in their appendix. So for Gemma 4 the policy is guidance; for the benched Gemma 3 it is a binding condition, along with gating, a required notice on non-hosted distribution, and Google's reserved right to update terms and remotely restrict use. Net: Gemma 3 is the *more* restrictive family here, not Gemma 4. **Muse-Glimmer (Meta)** — `LICENSE` is verbatim Apache-2.0 and the card says "All artifacts are released under Apache 2.0". The repo also ships `USAGE_POLICY.md` ("applies to your access or use of Muse Glimmer": no under-18 users, the usual prohibited-use list, ITAR/bio-chem language). The Apache text does not reference it, so its contractual force is unclear; treat it as a compliance expectation rather than a license term. Not a Llama model — none of the Llama branding/MAU terms apply. **Business Source License 1.1 (moondream3-preview)** — Licensor M87 Labs; Additional Use Grant = production use allowed "provided the work is not offered to third parties on a hosted or embedded basis to compete with M87 Labs's paid versions"; internal use and free products are explicitly non-competitive. Change License Apache-2.0 at "two years after the first public release of this version" (no calendar date; conservative anchor = 2025-09-18 blog post → **2027-09-18**). No patent grant; any violation terminates all rights. Details, and why moondream3.1 is a different (non-sunsetting) license, in the sibling doc. **Tencent Hunyuan Community License (HunyuanOCR 1.5)** — release-date anchor 2025-11-25. - *Territory*: "THIS LICENSE AGREEMENT DOES NOT APPLY IN THE EUROPEAN UNION, UNITED KINGDOM AND SOUTH KOREA"; AUP item 1 prohibits "use outside the Territory". The text does not say whether this keys on the licensee's domicile or the end user's location — a worldwide-open Space is at least arguably "available" in the EU. - *Scale*: >100M MAU across all your products in the month before the release date → must request a license. - *Output reuse*: "You must not use the Tencent Hunyuan Works or any Output … to improve any other AI model" (distillation/synthetic-data clause; outputs themselves are fine to keep). - *Deploying to third parties* (hosted included): must "clearly, accurately, and prominently disclose to all end users the full legal name and entity of the actual provider" and that "Tencent is not affiliated with, associated with, sponsoring, or endorsing" the service. "Powered by Tencent Hunyuan" marking is encouraged, not required. - *Non-hosted redistribution*: copy of the Agreement + change notices + a `Notice` file with the prescribed copyright/trademark text. - No patent grant; Hong Kong law and courts; termination requires deletion. **Llama 4 Community License (Scout, benched)** — commercial use OK below 700M MAU; "Built with Llama" must be displayed, derivative model names must start with "Llama", distributions carry a notice. The EU exclusion is **not** in the license body — it is in the Acceptable Use Policy: "With respect to any multimodal models included in Llama 4, the rights granted under Section 1(a) … are not being granted to you if you are an individual domiciled in, or a company with a principal place of business in, the European Union." Scout is multimodal. The fetched license text contains no "improve any other LLM" clause (earlier Llama licenses had one). Gated. **MIT (GLM-4.6V-Flash, benched)** — permissive; card metadata only, no license file. ### Implications by scenario | Scenario | Apache-2.0 / MIT models | moondream3-preview (BSL) | HunyuanOCR (Tencent) | Gemma 3 (benched) | Llama 4 Scout (benched) | |---|---|---|---|---|---| | **This free public Space + MCP** | OK. No redistribution happens (weights pulled at runtime), so no notice duty | OK — free demo is expressly non-competitive | OK **with obligations**: add the provider-disclosure + Tencent non-affiliation line to the Space; territory ambiguity for EU/UK visitors | OK; hosted use needs no notice; PUP applies | OK if the operator isn't EU-domiciled; display "Built with Llama" | | **Greenfly internal production** | Unrestricted | Explicitly allowed ("internal use within your organization") | Allowed inside the Territory and under 100M MAU; don't use its outputs to train/distill other models | Allowed; PUP binds; Google may change terms | Allowed unless Greenfly's principal place of business is in the EU | | **Embedded in a paid Greenfly product** | OK; ship LICENSE (+ Qianfan NOTICE) only if weights are shipped | OK as an integrated feature; **not** OK as a general VLM API / per-customer endpoint / hosted fine-tuning until 2027-09-18 (or a deal with M87) | OK with end-user disclosure of provider + non-affiliation; Notice file if weights ship; HK governing law; customers in EU/UK/KR are outside the license | OK with notice on non-hosted distribution; PUP flows down to users | OK with "Built with Llama", naming rule, notice; EU-domicile exclusion | | **Territory exposure** | None | None | **EU, UK, South Korea excluded** | None | EU (licensee domicile, multimodal models) | Key takeaways: - **Seven of the nine shipped models are plain Apache-2.0.** The two exceptions are `moondream3-preview` (BSL 1.1) and `HunyuanOCR` (Tencent Community License). - **HunyuanOCR is the only shipped model with strings attached to *deployment*:** territory (no EU/UK/KR), an end-user disclosure duty, an output-reuse ban, and HK governing law. If Greenfly serves EU/UK customers or wants to distill from arena outputs, swap it — Qianfan-OCR is the Apache-2.0 model in the same OCR/KIE niche and already outscores it on KIE. - **moondream3 only forbids selling Moondream-as-a-service.** The Space and an extraction feature inside a Greenfly product are both fine; it sunsets to Apache-2.0 around 2027-09-18. - **Gemma 4 is genuinely Apache-2.0; Gemma 3 is not.** Don't "downgrade" to a Gemma 3 size on the assumption the terms are the same. - **Among benched candidates, Llama 4 Scout carries the most conditions** (EU exclusion via AUP, branding, gating); GLM-4.6V-Flash and MiniCPM-V-4.6 are permissive. - **Follow-up for this Space (not done here):** add a one-line HunyuanOCR disclosure to the Space README/UI ("served by ; Tencent is not affiliated with or endorsing this service"). ### Sources (fetched 2026-09-08) - HF card metadata (`license`, `license_link`, `gated`, file list): `https://huggingface.co/api/models/?expand[]=cardData&expand[]=gated&expand[]=siblings` for every repo in the summary table - https://huggingface.co/moondream/moondream3-preview/raw/main/LICENSE.md and `/raw/main/README.md`; https://moondream.ai/blog/moondream-3-preview (2025-09-18) - https://huggingface.co/Qwen/Qwen3.5-9B/raw/main/LICENSE - https://huggingface.co/meta-models/Muse-Glimmer-30B/raw/main/LICENSE, `/raw/main/README.md`, `/raw/main/USAGE_POLICY.md` - https://ai.google.dev/gemma/docs/gemma_4_license → https://ai.google.dev/gemma/apache_2 ; https://ai.google.dev/gemma/terms (rev. 2026-04-01); https://ai.google.dev/gemma/prohibited_use_policy (2024-02-21); https://ai.google.dev/gemma/intended_use_statement ; https://huggingface.co/google/gemma-4-31B-it/raw/main/README.md (no `LICENSE` file — 404) - https://huggingface.co/baidu/Qianfan-OCR/raw/main/LICENSE and `/raw/main/NOTICE` - https://huggingface.co/tencent/HunyuanOCR/raw/main/LICENSE and `/raw/main/README.md` - https://huggingface.co/ibm-granite/granite-vision-4.1-4b/raw/main/README.md - https://huggingface.co/Qwen/Qwen3-VL-8B-Instruct/raw/main/README.md - https://developer.meta.com/ai/llama4/license/ (redirect target of llama.com/llama4/license) and https://developer.meta.com/ai/llama4/use-policy/ - https://huggingface.co/zai-org/GLM-4.6V-Flash/raw/main/README.md - https://huggingface.co/openbmb/MiniCPM-V-4.6/raw/main/README.md and https://raw.githubusercontent.com/OpenBMB/MiniCPM-V/main/LICENSE