frutebox-node 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- frutebox/adminheader.py +59 -0
- frutebox/attest.py +43 -0
- frutebox/audiogen.py +364 -0
- frutebox/config.py +367 -0
- frutebox/deltasync.py +211 -0
- frutebox/economics.py +270 -0
- frutebox/engine_guard.py +718 -0
- frutebox/envelope.py +77 -0
- frutebox/envvars.py +167 -0
- frutebox/gpuprices.py +641 -0
- frutebox/gpuproviders.py +4489 -0
- frutebox/gui.py +270 -0
- frutebox/imagegen.py +152 -0
- frutebox/inference.py +624 -0
- frutebox/manifest.py +218 -0
- frutebox/mediaserving.py +603 -0
- frutebox/packaging.py +542 -0
- frutebox/pqctransport.py +660 -0
- frutebox/provider.py +1867 -0
- frutebox/providers.py +942 -0
- frutebox/registry/__init__.py +189 -0
- frutebox/registry/generate.py +311 -0
- frutebox/registry/generate_providers.py +120 -0
- frutebox/registry/models.yaml +1759 -0
- frutebox/registry/providers.yaml +518 -0
- frutebox/registry/registry.gen.json +2043 -0
- frutebox/registry_gen.py +3 -0
- frutebox/runpod_templates.py +143 -0
- frutebox/serving.py +691 -0
- frutebox/signedconfig.py +259 -0
- frutebox/signing.py +208 -0
- frutebox/thinkbudget.py +155 -0
- frutebox/videogen.py +118 -0
- frutebox_node-0.1.0.dist-info/METADATA +100 -0
- frutebox_node-0.1.0.dist-info/RECORD +36 -0
- frutebox_node-0.1.0.dist-info/WHEEL +4 -0
frutebox/registry_gen.py
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"""GENERATED by frutebox/registry/generate.py from registry/models.yaml — DO NOT EDIT."""
|
|
2
|
+
REGISTRY: list[dict] = [{'id': 'mistral-large-3', 'bloc': 'eu', 'tier': 'frontier', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 400, 'source': {'hf_repo': 'mistralai/Mistral-Large-Instruct-2411', 'revision': 'ba78820945ae22361b0274cf0ae6d696c967c1a4'}}, {'id': 'magistral-large', 'bloc': 'eu', 'tier': 'frontier', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 400, 'source_unavailable': 'Magistral Medium/Large is API-only - no mistralai/Magistral-Medium-2509 repo exists on HF. Only Magistral SMALL has open weights (see `magistral`).'}, {'id': 'gpt-oss-120b', 'bloc': 'us', 'tier': 'frontier', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 80, 'speed': {'K': 7, 'spec_decode': 'eagle3'}}, {'id': 'nemotron-3', 'bloc': 'us', 'tier': 'frontier', 'license': 'nvidia-open-model-license', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 300}, {'id': 'llama-4-maverick', 'bloc': 'us', 'tier': 'frontier', 'license': 'llama-4-community', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 250}, {'id': 'deepseek-v4-pro', 'bloc': 'cn', 'tier': 'frontier', 'license': 'mit', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': ['vllm', 'sglang'], 'vram_gb': 700}, {'id': 'qwen3-235b-a22b', 'bloc': 'cn', 'tier': 'frontier', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'S', 'status': 'default', 'runtime': ['llamacpp'], 'vram_gb': 150, 'speed': {'K': 7, 'draft_model': 'Qwen/Qwen3-0.6B', 'spec_decode': 'draft'}, 'source': {'gguf_quant': 'UD-Q4_K_XL', 'gguf_repo': 'unsloth/Qwen3-235B-A22B-GGUF', 'gguf_revision': '09e11417ffdc30c1c63d0296a40fd8fde0abb180', 'hf_repo': 'Qwen/Qwen3-235B-A22B-FP8', 'revision': '39eb2b067ea6b8e3e1dd97d3cd0c7ffeaf3e1a35'}}, {'id': 'glm-5.1', 'bloc': 'cn', 'tier': 'frontier', 'license': 'mit', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': ['vllm', 'sglang'], 'vram_gb': 400}, {'id': 'kimi-k2.6', 'bloc': 'cn', 'tier': 'frontier', 'license': 'modified-mit', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'S', 'status': 'default', 'runtime': ['llamacpp'], 'vram_gb': 600, 'speed': {'spec_decode': 'mtp'}, 'source': {'gguf_quant': 'UD-Q4_K_XL', 'gguf_repo': 'unsloth/Kimi-K2.6-GGUF', 'gguf_revision': '47c7cab1e440dd9fcfc57c469e4737983408a6f2'}}, {'id': 'kimi-k3', 'bloc': 'cn', 'tier': 'frontier', 'license': 'kimi-k3-license', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': [], 'vram_gb': 700, 'source_notes': 'RE-AUDITED 2026-10-10, licence READ. This row said `license: unconfirmed` while shipping as `open_commercial` - free on an assumption. The repo tag on moonshotai/Kimi-K3 is `other`; the file is the "Kimi K3 License", a permissive grant (use, copy, modify, distribute, SELL) with two conditions: (2) a Model-as-a-Service business whose aggregate revenue exceeds USD 20M over any consecutive 12 months needs a separate agreement with Moonshot AI before commercial use, MaaS being defined as "giving a third party access to language model inference or fine-tuning (e.g., via API)"; and (3) a product with more than 100M monthly active users, or more than USD 20M monthly revenue, must display "Kimi K3" prominently in its user interface. Section 4 exempts purely internal use. FRUTEBOX IS A MaaS BUSINESS by that definition, so clause 2 is the one that would apply to us rather than a hypothetical - owner ruling 2026-10-10: not a blocker at launch, recorded here so it is not a surprise at scale. `open_commercial` was the right class and is now right ON THE TEXT rather than on an assumption.'}, {'id': 'cohere-command-a-plus', 'bloc': 'ca', 'tier': 'frontier', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 220}, {'id': 'ministral-3-14b', 'bloc': 'eu', 'tier': 'mid', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['vllm', 'ollama'], 'vram_gb': 10}, {'id': 'mistral-small-4', 'bloc': 'eu', 'tier': 'mid', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['vllm', 'ollama'], 'vram_gb': 16, 'source': {'hf_repo': 'mistralai/Mistral-Small-3.2-24B-Instruct-2506', 'revision': '95a6d26c4bfb886c58daf9d3f7332c857cb27b43'}}, {'id': 'llama-4-scout', 'bloc': 'us', 'tier': 'mid', 'license': 'llama-4-community', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 60}, {'id': 'gemma-4', 'bloc': 'us', 'tier': 'mid', 'license': 'gemma-terms', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['vllm', 'ollama'], 'vram_gb': 20}, {'id': 'qwen-3.6-27b', 'bloc': 'cn', 'tier': 'mid', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'default', 'runtime': ['ollama'], 'vram_gb': 18, 'speed': {'K': 7, 'draft_model': 'Qwen/Qwen3-0.6B', 'spec_decode': 'draft'}, 'source': {'hf_repo': 'Qwen/Qwen3.6-27B-FP8', 'ollama_digest': 'sha256:370b24c023f51e75e7f3b70e1b89d59a38ec2fb5af3289fcf92ff78b3fadd619', 'ollama_tag': 'qwen3.6:27b', 'revision': 'e89b16ebf1988b3d6befa7de50abc2d76f26eb09'}}, {'id': 'glm-5.1-air', 'bloc': 'cn', 'tier': 'mid', 'license': 'mit', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 24}, {'id': 'ai21-jamba', 'bloc': 'il', 'tier': 'mid', 'license': 'jamba-open-model-license', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 90}, {'id': 'falcon-large', 'bloc': 'uae', 'tier': 'mid', 'license': 'tii-falcon-2.0', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 90}, {'id': 'solar-open-2', 'bloc': 'kr', 'tier': 'mid', 'license': 'upstage-solar-license', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 160}, {'id': 'llm-jp-4', 'bloc': 'jp', 'tier': 'mid', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 90}, {'id': 'ministral-3-8b', 'bloc': 'eu', 'tier': 'small', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['ollama'], 'vram_gb': 6, 'source': {'hf_repo': 'mistralai/Ministral-8B-Instruct-2410', 'revision': '2f494a194c5b980dfb9772cb92d26cbb671fce5a'}}, {'id': 'ministral-3-3b', 'bloc': 'eu', 'tier': 'small', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['ollama'], 'vram_gb': 3, 'source_unavailable': 'Mistral has not published open weights for the 3B: the HF API has no mistralai/Ministral-3B-Instruct-2410 repo. It is an API-only model.'}, {'id': 'phi-4', 'bloc': 'us', 'tier': 'small', 'license': 'mit', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['ollama'], 'vram_gb': 10}, {'id': 'phi-4-mini-3.8b', 'bloc': 'us', 'tier': 'small', 'license': 'mit', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'default', 'runtime': ['ollama'], 'vram_gb': 2.5, 'source': {'hf_repo': 'microsoft/Phi-4-mini-instruct', 'ollama_digest': 'sha256:8c2539a423c4df2d9d2609fba56e7bad554696b66ed0e280c56e0ef4a32498fa', 'ollama_tag': 'phi4-mini:3.8b', 'revision': 'cfbefacb99257ffa30c83adab238a50856ac3083'}}, {'id': 'gemma-4-small', 'bloc': 'us', 'tier': 'small', 'license': 'gemma-terms', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['ollama'], 'vram_gb': 4}, {'id': 'llama-3.2-1b', 'bloc': 'us', 'tier': 'small', 'license': 'llama-community', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'L', 'status': 'default', 'runtime': ['ollama'], 'vram_gb': 0.9, 'source': {'gated': True, 'hf_repo': 'meta-llama/Llama-3.2-1B-Instruct', 'ollama_digest': 'sha256:4f659a1e86d7f5a33c389f7991e7224b7ee6ad0358b53437d54c02d2e1b1118d', 'ollama_tag': 'llama3.2:1b', 'revision': '9213176726f574b556790deb65791e0c5aa438b6'}}, {'id': 'llama-3.2-3b', 'bloc': 'us', 'tier': 'small', 'license': 'llama-community', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'L', 'status': 'default', 'runtime': ['ollama'], 'vram_gb': 2.1, 'source': {'gated': True, 'hf_repo': 'meta-llama/Llama-3.2-3B-Instruct', 'ollama_digest': 'sha256:34bb5ab01051a11372a91f95f3fbbc51173eed8e7f13ec395b9ae9b8bd0e242b', 'ollama_tag': 'llama3.2:3b', 'revision': '0cb88a4f764b7a12671c53f0838cd831a0843b95'}}, {'id': 'qwen3-8b', 'bloc': 'cn', 'tier': 'small', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'default', 'runtime': ['ollama'], 'vram_gb': 5, 'source': {'hf_repo': 'Qwen/Qwen3-8B', 'ollama_digest': 'sha256:05a61d37b08453e59290add468e3bb2f688e23a01e967fecb0e2fa41218cea76', 'ollama_tag': 'qwen3:8b', 'revision': 'b968826d9c46dd6066d109eabc6255188de91218'}}, {'id': 'qwen3-4b', 'bloc': 'cn', 'tier': 'small', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'default', 'runtime': ['ollama'], 'vram_gb': 4, 'source': {'hf_repo': 'Qwen/Qwen3-4B-Instruct-2507', 'ollama_digest': 'sha256:e18a783aae5525fd2852fc94c985541a77e791e034abc2d3056474d59de336fc', 'ollama_tag': 'qwen3:4b', 'revision': 'cdbee75f17c01a7cc42f958dc650907174af0554'}}, {'id': 'falcon-3', 'bloc': 'uae', 'tier': 'small', 'license': 'tii-falcon-2.0', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['ollama'], 'vram_gb': 6}, {'id': 'jais', 'bloc': 'uae', 'tier': 'small', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 24}, {'id': 'solar-small', 'bloc': 'kr', 'tier': 'small', 'license': 'unconfirmed', 'license_class': 'non_commercial', 'territory': {}, 'local_class': 'L', 'status': 'verify', 'runtime': [], 'vram_gb': 8}, {'id': 'inkuba-lm', 'bloc': 'za', 'tier': 'small', 'license': 'open', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': [], 'vram_gb': 2}, {'id': 'devstral-small-24b', 'bloc': 'eu', 'tier': 'coding', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'default', 'runtime': ['ollama'], 'vram_gb': 16, 'source': {'hf_repo': 'mistralai/Devstral-Small-2507', 'ollama_digest': 'sha256:3dc762df9951ecae062822bbaa78b01f1252e2e316c911adbedcbe97bbff5b26', 'ollama_tag': 'devstral:24b', 'revision': 'bd165ab26cebbcc2eea2c4ecbfc07f3ac42b3c39'}}, {'id': 'codestral-current', 'bloc': 'eu', 'tier': 'coding', 'license': 'mistral-commercial-open', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['ollama'], 'vram_gb': 14, 'source': {'hf_repo': 'mistralai/Codestral-22B-v0.1', 'revision': '28b1c1a51dabe9d86ca8c41420ada1984632498f'}}, {'id': 'codestral-small', 'bloc': 'eu', 'tier': 'coding', 'license': 'mistral-commercial-open', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['ollama'], 'vram_gb': 8}, {'id': 'granite-code-8b', 'bloc': 'us', 'tier': 'coding', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['ollama'], 'vram_gb': 6}, {'id': 'granite-code-34b', 'bloc': 'us', 'tier': 'coding', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['ollama'], 'vram_gb': 22}, {'id': 'nemotron-coding', 'bloc': 'us', 'tier': 'coding', 'license': 'nvidia-open-model-license', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 80}, {'id': 'nemotron-nano-coding', 'bloc': 'us', 'tier': 'coding', 'license': 'nvidia-open-model-license', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['ollama'], 'vram_gb': 8}, {'id': 'nemotron-3.5-lightning', 'bloc': 'us', 'tier': 'coding', 'license': 'nvidia-open-model-license', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 24}, {'id': 'qwen3-coder', 'bloc': 'cn', 'tier': 'coding', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['ollama', 'vllm'], 'vram_gb': 20, 'speed': {'K': 7, 'spec_decode': 'eagle3'}}, {'id': 'qwen3-coder-7b', 'bloc': 'cn', 'tier': 'coding', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['ollama'], 'vram_gb': 5}, {'id': 'deepseek-coder-v4', 'bloc': 'cn', 'tier': 'coding', 'license': 'mit', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 24}, {'id': 'deepseek-coder-v4-lite', 'bloc': 'cn', 'tier': 'coding', 'license': 'mit', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['ollama'], 'vram_gb': 9}, {'id': 'kimi-k2.7-code', 'bloc': 'cn', 'tier': 'coding', 'license': 'modified-mit', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'S', 'status': 'default', 'runtime': ['llamacpp'], 'vram_gb': 600, 'speed': {'spec_decode': 'mtp'}, 'source': {'gguf_quant': 'UD-Q8_K_XL', 'gguf_repo': 'unsloth/Kimi-K2.7-Code-GGUF', 'gguf_revision': '46352ca8dc32aa60f9754f5bd3fb778deeb9e430'}}, {'id': 'magistral', 'bloc': 'eu', 'tier': 'reasoning', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['vllm', 'ollama'], 'vram_gb': 16, 'source': {'hf_repo': 'mistralai/Magistral-Small-2509', 'revision': 'a31cc96ab10cf19bc42c628fedf1e359e0853c49'}}, {'id': 'phi-4-reasoning', 'bloc': 'us', 'tier': 'reasoning', 'license': 'mit', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['ollama'], 'vram_gb': 10}, {'id': 'deepseek-v4-thinking', 'bloc': 'cn', 'tier': 'reasoning', 'license': 'mit', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': ['vllm', 'sglang'], 'vram_gb': 700}, {'id': 'glm-5.1-thinking', 'bloc': 'cn', 'tier': 'reasoning', 'license': 'mit', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 400}, {'id': 'pixtral', 'bloc': 'eu', 'tier': 'multimodal', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 24, 'source': {'hf_repo': 'mistralai/Pixtral-12B-2409', 'revision': 'a5ca2b7a9421a35ea24411c46e970758b8d3c6a7'}}, {'id': 'ministral-3-vl', 'bloc': 'eu', 'tier': 'multimodal', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['ollama'], 'vram_gb': 8}, {'id': 'gemma-4-vision', 'bloc': 'us', 'tier': 'multimodal', 'license': 'gemma-terms', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 20}, {'id': 'llama-4-vision', 'bloc': 'us', 'tier': 'multimodal', 'license': 'llama-4-community', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 250}, {'id': 'qwen3-vl', 'bloc': 'cn', 'tier': 'multimodal', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'default', 'runtime': ['ollama'], 'vram_gb': 18, 'source': {'hf_repo': 'Qwen/Qwen3-VL-8B-Instruct', 'ollama_digest': 'sha256:17e666fbe4f4c95d19936e9e4089c50c980df275d2937734edbe2a8e7f02eb40', 'ollama_tag': 'qwen3-vl:8b', 'revision': '0c351dd01ed87e9c1b53cbc748cba10e6187ff3b'}}, {'id': 'glm-v', 'bloc': 'cn', 'tier': 'multimodal', 'license': 'mit', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 24}, {'id': 'jais-vl', 'bloc': 'uae', 'tier': 'multimodal', 'license': 'unconfirmed', 'license_class': 'non_commercial', 'territory': {}, 'local_class': None, 'status': 'verify', 'runtime': [], 'vram_gb': 24}, {'id': 'apertus-70b', 'bloc': 'eu', 'tier': 'transparency', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 45, 'source': {'hf_repo': 'swiss-ai/Apertus-70B-Instruct-2509', 'revision': '0f2767662a013c0fb631079cea883155252bc3b6'}}, {'id': 'olmo-3', 'bloc': 'us', 'tier': 'transparency', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['vllm', 'ollama'], 'vram_gb': 24}, {'id': 'flux1-schnell', 'bloc': 'eu', 'tier': 'image', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['comfyui'], 'vram_gb': 12, 'source': {'gated': True, 'hf_repo': 'black-forest-labs/FLUX.1-schnell', 'revision': '741f7c3ce8b383c54771c7003378a50191e9efe9'}}, {'id': 'auraflow', 'bloc': 'us', 'tier': 'image', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['comfyui'], 'vram_gb': 16}, {'id': 'qwen-image-20b', 'bloc': 'cn', 'tier': 'image', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'default', 'runtime': ['comfyui'], 'vram_gb': 24, 'source': {'hf_repo': 'Qwen/Qwen-Image', 'revision': '75e0b4be04f60ec59a75f475837eced720f823b6'}}, {'id': 'lumina-image-2', 'bloc': 'community', 'tier': 'image', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['comfyui'], 'vram_gb': 16}, {'id': 'hidream-i1', 'bloc': 'cn', 'tier': 'image', 'license': 'mit', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['comfyui'], 'vram_gb': 20}, {'id': 'sdxl-1.0', 'bloc': 'uk', 'tier': 'image', 'license': 'openrail++-m', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'W', 'status': 'default', 'runtime': ['comfyui'], 'vram_gb': 10, 'source': {'hf_repo': 'stabilityai/stable-diffusion-xl-base-1.0', 'revision': '462165984030d82259a11f4367a4eed129e94a7b'}}, {'id': 'sd-3.5-large', 'bloc': 'uk', 'tier': 'image', 'license': 'stability-community', 'license_class': 'paid_commercial', 'territory': {}, 'local_class': 'W', 'status': 'backup', 'runtime': ['comfyui'], 'vram_gb': 20, 'vendor': 'STABILITY', 'source': {'gated': True, 'hf_repo': 'stabilityai/stable-diffusion-3.5-large', 'revision': 'ceddf0a7fdf2064ea28e2213e3b84e4afa170a0f'}}, {'id': 'hunyuan-image', 'bloc': 'cn', 'tier': 'image', 'license': 'tencent-hunyuan-community', 'license_class': 'geo_fenced', 'territory': {'deny': ['eu', 'uk', 'kr']}, 'local_class': None, 'status': 'backup', 'runtime': ['comfyui'], 'vram_gb': 30, 'source': {'hf_repo': 'tencent/HunyuanImage-3.0', 'revision': '36f21fe74b65614451cc50ffd8a35a5f662dac70'}}, {'id': 'wan-2.2', 'bloc': 'cn', 'tier': 'video', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'default', 'runtime': ['comfyui'], 'vram_gb': 24, 'source': {'hf_repo': 'Wan-AI/Wan2.2-T2V-A14B', 'revision': 'c8c270b13ee05bfa474194ac9fb07a5868a97cea'}}, {'id': 'mochi-1', 'bloc': 'us', 'tier': 'video', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['comfyui'], 'vram_gb': 24}, {'id': 'open-sora', 'bloc': 'community', 'tier': 'video', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['comfyui'], 'vram_gb': 24}, {'id': 'hunyuan-video-1.5', 'bloc': 'cn', 'tier': 'video', 'license': 'tencent-hunyuan-community', 'license_class': 'geo_fenced', 'territory': {'deny': ['eu', 'uk', 'kr']}, 'local_class': None, 'status': 'backup', 'runtime': ['comfyui'], 'vram_gb': 40, 'source': {'hf_repo': 'tencent/HunyuanVideo-1.5', 'revision': '9b49404b3f5df2a8f0b31df27a0c7ab872e7b038'}}, {'id': 'ltx-2.3', 'bloc': 'il', 'tier': 'video', 'license': 'lightricks-ltx', 'license_class': 'paid_commercial', 'territory': {}, 'local_class': 'W', 'status': 'backup', 'runtime': ['llamacpp', 'comfyui'], 'vram_gb': 40, 'vendor': 'LIGHTRICKS', 'source': {'hf_repo': 'Lightricks/LTX-Video', 'revision': '8984fa25007f376c1a299016d0957a37a2f797bb'}}, {'id': 'stable-video', 'bloc': 'uk', 'tier': 'video', 'license': 'stability-community', 'license_class': 'paid_commercial', 'territory': {}, 'local_class': 'W', 'status': 'backup', 'runtime': ['comfyui'], 'vram_gb': 24, 'vendor': 'STABILITY', 'source': {'hf_repo': 'stabilityai/stable-video-diffusion-img2vid-xt', 'revision': '9e43909513c6714f1bc78bcb44d96e733cd242aa'}}, {'id': 'ace-step-1.5', 'bloc': 'cn', 'tier': 'music', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'default', 'runtime': ['comfyui'], 'vram_gb': 8, 'source': {'hf_repo': 'ACE-Step/ACE-Step-v1-3.5B', 'revision': '82cd0d7b6322bd28cd4e830fe675ddb6180ce36c'}}, {'id': 'yue-7b', 'bloc': 'cn', 'tier': 'music', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'default', 'runtime': ['comfyui'], 'vram_gb': 16, 'source': {'hf_repo': 'm-a-p/YuE-s1-7B-anneal-en-cot', 'revision': '454c20e1748888800f8e4b3da45125f55482d967'}}, {'id': 'moss-soundeffect', 'bloc': 'cn', 'tier': 'music', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': [], 'vram_gb': 6}, {'id': 'stable-audio-open-1.5', 'bloc': 'uk', 'tier': 'music', 'license': 'stability-community', 'license_class': 'paid_commercial', 'territory': {}, 'local_class': 'L', 'status': 'backup', 'runtime': ['comfyui'], 'vram_gb': 6, 'vendor': 'STABILITY', 'source': {'gated': True, 'hf_repo': 'stabilityai/stable-audio-open-1.0', 'revision': 'f21265c1e2710b3bd2386596943f0007f55f802e'}}, {'id': 'kokoro-82m', 'bloc': 'community', 'tier': 'tts', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'default', 'runtime': ['comfyui'], 'vram_gb': 1, 'source': {'hf_repo': 'hexgrad/Kokoro-82M', 'revision': 'f3ff3571791e39611d31c381e3a41a3af07b4987'}}, {'id': 'chatterbox', 'bloc': 'us', 'tier': 'tts', 'license': 'mit', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'default', 'runtime': ['comfyui'], 'vram_gb': 6, 'source': {'hf_repo': 'ResembleAI/chatterbox', 'revision': '5bb1f6ee58e50c3b8d408bc82a6d3740c2db6e18'}}, {'id': 'orpheus', 'bloc': 'us', 'tier': 'tts', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': [], 'vram_gb': 6}, {'id': 'xtts-v2', 'bloc': 'eu', 'tier': 'tts', 'license': 'coqui-cpml', 'license_class': 'non_commercial', 'territory': {}, 'local_class': None, 'status': 'verify', 'runtime': [], 'vram_gb': 6, 'source': {'hf_repo': 'coqui/XTTS-v2', 'revision': '6c2b0d75eae4b7047358e3b6bd9325f857d43f77'}}, {'id': 'whisper-large-v3-turbo', 'bloc': 'us', 'tier': 'stt', 'license': 'mit', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'default', 'runtime': ['llamacpp'], 'vram_gb': 2, 'source': {'hf_repo': 'openai/whisper-large-v3-turbo', 'revision': '41f01f3fe87f28c78e2fbf8b568835947dd65ed9'}}, {'id': 'qwen2.5-omni-7b', 'bloc': 'cn', 'tier': 'voice', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 8, 'source': {'hf_repo': 'Qwen/Qwen2.5-Omni-7B', 'revision': 'ae9e1690543ffd5c0221dc27f79834d0294cba00'}}, {'id': 'qwen3-omni', 'bloc': 'cn', 'tier': 'voice', 'license': 'unconfirmed', 'license_class': 'non_commercial', 'territory': {}, 'local_class': 'W', 'status': 'verify', 'runtime': [], 'vram_gb': 24}, {'id': 'moshi', 'bloc': 'eu', 'tier': 'voice', 'license': 'cc-by-4.0', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': [], 'vram_gb': 8, 'source': {'hf_repo': 'kyutai/moshiko-pytorch-bf16', 'revision': '2bfc9ae6e89079a5cc7ed2a68436010d91a3d289'}}, {'id': 'personaplex-7b', 'bloc': 'us', 'tier': 'voice', 'license': 'nvidia-open-model-license', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': [], 'vram_gb': 16, 'source_notes': "RE-AUDITED 2026-10-10 and the row was already right. nvidia/personaplex-7b-v1 tags `license: other` with `license_name: nvidia-open-model-license` and links NVIDIA's agreement - NOT Apache/MIT, so `open_commercial` is the correct class, which is what this row already said. Two facts worth recording: the repo is GATED (`gated: auto`), a servability obstacle rather than a licence one, which will need accepting before any pull; and several community re-uploads are tagged cc-by-nc-4.0, which a mirror cannot impose and which must not be read as evidence about the model."}, {'id': 'modernbert-router', 'bloc': 'community', 'tier': 'utility', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 1}, {'id': 'qwen3-embedding-4b', 'bloc': 'cn', 'tier': 'utility', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'default', 'runtime': ['ollama'], 'vram_gb': 3, 'source': {'hf_repo': 'Qwen/Qwen3-Embedding-4B', 'ollama_digest': 'sha256:2ca34c70bbf2dc85cb69688daf0b423bdc361504ea29d7f5a35c19f739d8ee0d', 'ollama_tag': 'qwen3-embedding:4b', 'revision': '5cf2132abc99cad020ac570b19d031efec650f2b'}}, {'id': 'qwen3-embedding-8b', 'bloc': 'cn', 'tier': 'utility', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'default', 'runtime': ['ollama'], 'vram_gb': 6, 'source': {'hf_repo': 'Qwen/Qwen3-Embedding-8B', 'ollama_digest': 'sha256:0a3d61b01340ca9dceb4a661e21b3dfe1418ed5206d91291ab933a3762f8bb89', 'ollama_tag': 'qwen3-embedding:8b', 'revision': '1d8ad4ca9b3dd8059ad90a75d4983776a23d44af'}}, {'id': 'nomic-embed-text-1.5', 'bloc': 'us', 'tier': 'utility', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'default', 'runtime': ['ollama'], 'vram_gb': 0.3, 'source': {'hf_repo': 'nomic-ai/nomic-embed-text-v1.5', 'ollama_digest': 'sha256:31df23ea7daa448f9ccdbbcecce6c14689c8552222b80defd3830707c0139d4f', 'ollama_tag': 'nomic-embed-text:v1.5', 'revision': 'e9b6763023c676ca8431644204f50c2b100d9aab'}}, {'id': 'bge-m3', 'bloc': 'cn', 'tier': 'utility', 'license': 'mit', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['ollama'], 'vram_gb': 2}, {'id': 'embeddinggemma', 'bloc': 'us', 'tier': 'utility', 'license': 'gemma-terms', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['ollama'], 'vram_gb': 1}, {'id': 'qwen3-reranker-0.6b', 'bloc': 'cn', 'tier': 'utility', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': [], 'vram_gb': 0.5, 'source': {'hf_repo': 'Qwen/Qwen3-Reranker-0.6B', 'revision': 'e61197ed45024b0ed8a2d74b80b4d909f1255473'}, 'source_notes': 'CATALOGUED, NOT OFFERED (corrected 2026-10-07). The HF source is real and stays pinned. What was wrong was the rest of the row: it declared runtime [ollama] while Ollama has no qwen3-reranker model at all (registry 404 on both :0.6b and :latest, checked 2026-10-01), and it sat at status `default`, which means OFFERED. Nothing in this product serves a cross-encoder either — `web/src/lib/rag/rerank.ts` reranks lexically and downloads no model, and it says so at the top of the file. So this was the one row at default/backup that neither `serving.py` nor `mediaserving.py` could serve and that nothing recorded as unservable. Now `emerging` with no runtime, like `ms-clap` and `moss-soundeffect`: in the catalogue, honest about not being served.'}, {'id': 'ms-clap', 'bloc': 'us', 'tier': 'utility', 'license': 'mit', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': [], 'vram_gb': 1}, {'id': 'laion-clap', 'bloc': 'community', 'tier': 'utility', 'license': 'unconfirmed', 'license_class': 'non_commercial', 'territory': {}, 'local_class': 'L', 'status': 'verify', 'runtime': [], 'vram_gb': 1}, {'id': 'llama-guard', 'bloc': 'us', 'tier': 'utility', 'license': 'llama-community', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 8}, {'id': 'muse-glimmer-30b', 'bloc': 'us', 'tier': 'mid', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['vllm', 'ollama'], 'vram_gb': 20, 'source': {'hf_repo': 'meta-models/Muse-Glimmer-30B', 'revision': 'a4e59da52a7bc87ae7251dd5545c0dd437c44b68'}, 'source_notes': "apache-2.0 on the repo itself and NOT gated (verified 2026-10-10) - Meta's first open-weight release not under the Llama Community License, so none of the 700M-MAU clause applies. 29.78B params measured from the repo's safetensors index."}, {'id': 'molmo-2', 'bloc': 'us', 'tier': 'multimodal', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 8, 'source': {'hf_repo': 'allenai/Molmo2-8B', 'revision': 'e28fa28597e5ec5e0cca2201dd8ab33d48bc4a1b'}, 'source_notes': 'apache-2.0, not gated (verified 2026-10-10). Ai2, so bloc `us` by publisher - note the repo declares `base_model: Qwen/Qwen3-8B`, i.e. a US-published model fine-tuned from a Chinese base. The 4B sibling (allenai/Molmo2-4B, also apache-2.0, revision 042abfa7a38879a376cec03d949eff0aefaa0600) is the edge variant when one is wanted.'}, {'id': 'flux2-klein-4b', 'bloc': 'eu', 'tier': 'image', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['comfyui'], 'vram_gb': 13, 'source': {'hf_repo': 'black-forest-labs/FLUX.2-klein-4B', 'revision': 'e7b7dc27f91deacad38e78976d1f2b499d76a294'}, 'source_notes': 'apache-2.0, not gated (verified 2026-10-10). THE 4B ONLY. Its 9B sibling is a different licence entirely - see `flux2-klein-9b` below, which is blocked - so this pair is the reason the scan brief says "SHIP THE 4B ONLY" and the reason both rows exist rather than one.'}, {'id': 'zonos2', 'bloc': 'us', 'tier': 'tts', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': [], 'vram_gb': 8, 'source': {'hf_repo': 'Zyphra/ZONOS2', 'revision': '65f1e80f94b599d474bb6af9094a803dc52f60bd'}, 'source_notes': "apache-2.0, not gated (verified 2026-10-10). The repo publishes no safetensors index, so the 8B-total / 900M-active figure is the vendor's and `vram_gb` is sized from it rather than measured."}, {'id': 'maya1', 'bloc': 'in', 'tier': 'tts', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': [], 'vram_gb': 6, 'source': {'hf_repo': 'maya-research/maya1', 'revision': '21c682a0afef8c13a89b2512733c8bf5f0c52eb7'}, 'source_notes': 'apache-2.0, not gated (verified 2026-10-10). Maya Research, India - the first `in` row in the roster, which is why `BLOCS` grew to admit it.'}, {'id': 'parakeet-tdt-v3', 'bloc': 'us', 'tier': 'stt', 'license': 'cc-by-4.0', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': [], 'vram_gb': 2, 'source': {'hf_repo': 'nvidia/parakeet-tdt-0.6b-v3', 'revision': '541d1f99c6b0c3cd0b11a95167540bb8edefd82b'}, 'source_notes': 'THE SCAN BRIEF SAID APACHE; THE REPO SAYS cc-by-4.0 (verified 2026-10-10, not gated). CC-BY-4.0 is free for commercial use and requires ATTRIBUTION, which Apache does not - so it ships as `open_commercial`, not `apache_mit`. Shipping it as Apache would have put an attribution obligation in the roster with nothing recording that it exists. 25 languages, 0.6B params.'}, {'id': 'nemotron-voicechat-11b', 'bloc': 'us', 'tier': 'voice', 'license': 'openmdw-1.1', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 80, 'source': {'hf_repo': 'nvidia/NVIDIA-NemotronLabs-VoiceChat-11B', 'revision': '443794ea956ef0065f001967ffd00e77f519cb39'}, 'source_notes': 'openmdw-1.1, not gated (verified 2026-10-10). Press coverage called this "research-only"; the model card does NOT - it names the OpenMDW License Agreement v1.1 and carries no research, non-commercial or evaluation limit, and OpenMDW-1.1 grants commercial use and derivatives with no field-of-use or royalty restriction. So `open_commercial`, on the licence text rather than on the reporting. Needs an 80GB GPU, hence `local_class: S` - `moshi` stays the latency leader.'}, {'id': 'qwen3.8-27b', 'bloc': 'cn', 'tier': 'coding', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['ollama', 'vllm'], 'vram_gb': 18, 'source': {'hf_repo': 'Qwen/Qwen3.8-27B', 'revision': '1d4bf0f2ff6012fd82039f2fa52739d0dd7c60c0'}, 'source_notes': "apache-2.0, not gated (verified 2026-10-10). Coding + vision. It is the candidate to REPLACE `qwen-3.6-27b` / `qwen3-coder` where it wins, and it stays `emerging` until it has a pinned `ollama_tag` + `ollama_digest` - §B's rule, and the reason `qwen3-reranker-0.6b` was offered for six days with nothing able to serve it. Promoting it is a serving change, not a roster edit."}, {'id': 'mimo-v2.6-pro', 'bloc': 'cn', 'tier': 'frontier', 'license': 'mit', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': ['vllm'], 'vram_gb': 600, 'source': {'hf_repo': 'XiaomiMiMo/MiMo-V2.6-Pro-RL', 'revision': 'b61f21852680ee02a29e946e18cf8697f4844061'}, 'source_notes': "mit, not gated (verified 2026-10-10). Xiaomi. 1.024T params measured from the safetensors index, so `vram_gb` is sized like `kimi-k2.6` (the roster's other ~1T MoE) rather than guessed. The official repos are `-Pro-RL` and `-Pro-MOPD`; there is no bare `MiMo-V2.6-Pro`, and the RL one is pinned here."}, {'id': 'deepseek-v4.1-flash', 'bloc': 'cn', 'tier': 'frontier', 'license': 'mit', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': ['vllm', 'sglang'], 'vram_gb': 700, 'source': {'hf_repo': 'deepseek-ai/DeepSeek-V4.1-Flash', 'revision': '2cba9e42aa026125f3ed06c6d98c1db82f7ca027'}, 'source_notes': 'mit, not gated (verified 2026-10-10). 763B params measured. Many community mirrors of this model carry apache-2.0, agpl-3.0 or `other`; the official deepseek-ai repo is the one pinned, which is the whole reason the row names a repo and a revision rather than a model.'}, {'id': 'glm-5.2', 'bloc': 'cn', 'tier': 'frontier', 'license': 'mit', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'S', 'status': 'emerging', 'runtime': ['vllm', 'sglang'], 'vram_gb': 500, 'source': {'hf_repo': 'zai-org/GLM-5.2', 'revision': 'cf457fa734ab149ffef225f80893eb38c6ff5cdc'}, 'source_notes': 'mit, not gated (verified 2026-10-10). 753B params measured. Note the contrast with GLM-5.3, blocked below: 5.2 is MIT and 5.3 full is `other`. Same publisher, one version apart, opposite answers - which is why every version gets its own check.'}, {'id': 'qwen3-asr', 'bloc': 'cn', 'tier': 'stt', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': [], 'vram_gb': 4, 'source': {'hf_repo': 'Qwen/Qwen3-ASR-1.7B', 'revision': '7278e1e70fe206f11671096ffdd38061171dd6e5'}, 'source_notes': 'apache-2.0, not gated (verified 2026-10-10). The 0.6B sibling (Qwen/Qwen3-ASR-0.6B) is also apache-2.0 if a smaller STT is wanted.'}, {'id': 'minicpm-v-4.6', 'bloc': 'cn', 'tier': 'multimodal', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': [], 'vram_gb': 4, 'source': {'hf_repo': 'openbmb/MiniCPM-V-4.6', 'revision': '36f34a661a4bd35d0dc2294cb044d2584646c7d3'}, 'source_notes': "apache-2.0, not gated (verified 2026-10-10). On-device vision. `vram_gb` is sized from the 1.30B params the safetensors index reports, which is far smaller than the 8B of MiniCPM-V 4.5 - the number is recorded here because it is the one figure in this row that would misplace the model if it is wrong, and it came from the index rather than from the family's reputation."}, {'id': 'midashenglm-gen', 'bloc': 'cn', 'tier': 'music', 'license': 'apache-2.0-with-use-restrictions', 'license_class': 'open_commercial', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': [], 'vram_gb': 6, 'source': {'hf_repo': 'mispeech/midashenglm-gen', 'revision': '598b91a0abbdf15b5f979a0f8d8b0ef86533dbc1'}, 'source_notes': 'apache-2.0 WITH A USE RESTRICTIONS SECTION, which is why this is `open_commercial` and not `apache_mit` (verified 2026-10-10 by reading the README, not the tag). The restrictions forbid unlawful/fraudulent/malicious use, IP and privacy infringement, harassment and discrimination, and "any military purpose or application". A field-of-use limit is not Apache 2.0, and the scan brief\'s own asterisk on this model turned out to be real. Second SFX model beside `moss-soundeffect-v2`. 2.89B params measured.'}, {'id': 'moss-soundeffect-v2', 'bloc': 'cn', 'tier': 'music', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': [], 'vram_gb': 4, 'source': {'hf_repo': 'OpenMOSS-Team/MOSS-SoundEffect-v2.0', 'revision': 'e35df4d82fbe87fcd5d14e5d100e349c0c3c076d'}, 'source_notes': 'apache-2.0, not gated (verified 2026-10-10). 1.42B params measured. Supersedes `moss-soundeffect`, which stays in the roster: the older row has no pinned source and this one does, so deleting it would be the only way to lose the record that the upgrade happened.'}, {'id': 'z-image-turbo', 'bloc': 'cn', 'tier': 'image', 'license': 'apache-2.0', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'L', 'status': 'emerging', 'runtime': ['comfyui'], 'vram_gb': 8, 'source': {'hf_repo': 'Tongyi-MAI/Z-Image-Turbo', 'revision': 'f332072aa78be7aecdf3ee76d5c247082da564a6'}, 'source_notes': 'apache-2.0, not gated (verified 2026-10-10). 6.15B params measured. Tongyi-MAI is the official publisher; the ecosystem around this model is unusually large and includes mit, openrail, bsd-3-clause and `other` re-uploads, so the pinned repo matters more than usual here.'}, {'id': 'glm-image', 'bloc': 'cn', 'tier': 'image', 'license': 'mit', 'license_class': 'apache_mit', 'territory': {}, 'local_class': 'W', 'status': 'emerging', 'runtime': ['comfyui'], 'vram_gb': 10, 'source': {'hf_repo': 'zai-org/GLM-Image', 'revision': '2c433cc0cbc293bde2ac8ca9624f279b5d23fcf4'}, 'source_notes': 'mit, not gated (verified 2026-10-10). 6.93B params measured.'}, {'id': 'flux2-klein-9b', 'bloc': 'eu', 'tier': 'image', 'license': 'flux-non-commercial', 'license_class': 'non_commercial', 'territory': {}, 'local_class': 'W', 'status': 'verify', 'runtime': [], 'vram_gb': 24, 'source_unavailable': 'DELIBERATELY NOT PINNED. license `other` and GATED on the repo (verified 2026-10-10), and the FLUX Non-Commercial Licence per Black Forest Labs\' own split of the klein line: the 4B is Apache, the 9B and [dev] are not. The 4B is shipped as `flux2-klein-4b`; this row exists so an upgrade to "the bigger klein" cannot be mistaken for a free one.'}, {'id': 'qwen-image-2.1', 'bloc': 'cn', 'tier': 'image', 'license': 'qwen-research-license', 'license_class': 'non_commercial', 'territory': {}, 'local_class': 'W', 'status': 'verify', 'runtime': [], 'vram_gb': 24, 'source_unavailable': 'NON-COMMERCIAL, READ FROM THE LICENCE FILE (2026-10-10). Qwen/Qwen-Image-2.1 ships the "Qwen RESEARCH LICENSE AGREEMENT", whose section 1(i) defines Non-Commercial as "for research or evaluation purposes only", section 2(a) grants rights "FOR NON-COMMERCIAL PURPOSES ONLY", and section 2(b) says "You shall not use the Materials for any commercial purpose without obtaining a separate commercial license from us". The Apache-licensed `qwen-image-20b` stays the image model; this is the row that stops it being "upgraded".'}, {'id': 'yue2', 'bloc': 'cn', 'tier': 'music', 'license': 'cc-by-nc-4.0', 'license_class': 'non_commercial', 'territory': {}, 'local_class': 'W', 'status': 'verify', 'runtime': [], 'vram_gb': 16, 'source_unavailable': "cc-by-nc-4.0 on the official m-a-p repos (m-a-p/YuE2-3B, -Vae, -Vae-legacy), verified 2026-10-10. Two community mirrors are tagged apache-2.0, which is a mirror's mistake and not a relicence. The Apache YuE1 (`yue-7b`) stays the music model."}, {'id': 'minimax-m3', 'bloc': 'cn', 'tier': 'frontier', 'license': 'minimax-custom', 'license_class': 'non_commercial', 'territory': {}, 'local_class': 'S', 'status': 'verify', 'runtime': [], 'vram_gb': 600, 'source_unavailable': 'license `other` on MiniMaxAI/MiniMax-M3 (verified 2026-10-10). The scan brief reports a revenue cap; what was verified here is that the repo is NOT Apache or MIT. The class is therefore the fail-closed one rather than `paid_commercial`, because a revenue-capped licence read from a summary is not a licence read - if the cap matters commercially, read the text first and change this row then.'}, {'id': 'minimax-music3', 'bloc': 'cn', 'tier': 'music', 'license': 'unstated', 'license_class': 'non_commercial', 'territory': {}, 'local_class': 'W', 'status': 'verify', 'runtime': [], 'vram_gb': 24, 'source_unavailable': 'MiniMaxAI/MiniMax-Music3 carries NO licence tag at all (verified 2026-10-10) - not a permissive one, an absent one, which is worse: there is no grant to rely on. Community re-uploads span apache-2.0, mit, creativeml-openrail-m and `other`, none of which can grant what the publisher did not. Blocked until the publisher states terms.'}, {'id': 'glm-5.3', 'bloc': 'cn', 'tier': 'frontier', 'license': 'zai-custom', 'license_class': 'non_commercial', 'territory': {}, 'local_class': 'S', 'status': 'verify', 'runtime': [], 'vram_gb': 700, 'source_unavailable': 'license `other` on zai-org/GLM-5.3 and GLM-5.3-BF16 (verified 2026-10-10). NOTE THE SPLIT, which is the finding: zai-org/GLM-5.3-Flash and -Flash-BF16 are MIT. So "GLM-5.3" is free or not free depending on which checkpoint, and this row blocks the FULL model only. `glm-5.2` (MIT) is the enabled frontier row.'}, {'id': 'qwen3.8-max', 'bloc': 'cn', 'tier': 'frontier', 'license': 'api-only-no-weights', 'license_class': 'non_commercial', 'territory': {}, 'local_class': 'S', 'status': 'verify', 'runtime': [], 'vram_gb': 700, 'source_unavailable': 'NO OFFICIAL WEIGHTS EXIST. A search of the HF model index for "Qwen3.8-Max" and "Qwen3.8-Flash-Next" returns community distillations, quantisations and name-squats only - not one repo published by Qwen (verified 2026-10-10). These are API-only models, so there is nothing to licence and nothing to serve; the row exists so the next scan does not list them as candidates again. `Qwen3.8-Flash-Next` is the same case.'}, {'id': 'mmaudio', 'bloc': 'community', 'tier': 'music', 'license': 'cc-by-nc-4.0', 'license_class': 'non_commercial', 'territory': {}, 'local_class': 'W', 'status': 'verify', 'runtime': [], 'vram_gb': 16, 'source_unavailable': 'cc-by-nc-4.0 on the official hkchengrex/MMAudio (verified 2026-10-10). Several mirrors claim mit or apache-2.0; they cannot. Non-commercial, so it never serves.'}, {'id': 'sony-woosh', 'bloc': 'jp', 'tier': 'music', 'license': 'unverified', 'license_class': 'non_commercial', 'territory': {}, 'local_class': 'W', 'status': 'verify', 'runtime': [], 'vram_gb': 16, 'source_unavailable': 'COULD NOT BE VERIFIED, AND THAT IS THE RECORD. A search of the HF model index under the `sony` author for "Woosh" returned nothing on 2026-10-10, so neither the repo nor the CC-BY-NC licence the scan brief reports could be confirmed from the publisher. Blocked on the fail-closed class because an unverifiable licence is not a permissive one - if the model is published elsewhere, this row is where the finding goes.'}, {'id': 'kandinsky-5.0', 'bloc': 'ru', 'tier': 'video', 'license': 'unverified', 'license_class': 'non_commercial', 'territory': {}, 'local_class': 'W', 'status': 'verify', 'runtime': [], 'vram_gb': 24, 'source_unavailable': 'THE GOVERNANCE HOLD IS LIFTED; THE LICENCE BLOCK IS NOT, and the two are different things. On 2026-10-10 this row was "catalogued and NOT enabled" because its Russian origin was a governance question this lane does not answer. On 2026-10-13 the owner answered it: carry it on the video roster with an `origin_risk` flag and a mandatory at-your-own-risk disclosure, and "licence-gate it like the rest of the roster". So the hold is gone and `origin_risk` below replaces it. WHAT STILL BLOCKS IT IS THE LICENCE, and licence-gating it like the rest of the roster is precisely what keeps it unservable: its licence was deliberately never verified - verifying it would have implied the 2026-10-10 decision was a licence decision - so it is `status: verify`, which the gate refuses, and `license: unverified` says so without asserting a class nobody checked. TO SERVE IT someone must verify the real licence online and pin an `hf_repo` + `revision`; that is an online act this lane cannot perform, and inventing `apache_mit` to make a flag work would be fabricating the one fact this registry exists to be the authority on.', 'origin_risk': {'name': 'Kandinsky 5.0', 'origin': 'ru', 'reason': 'Russian-origin', 'disclosure': 'Generated with Kandinsky 5.0 (Russian-origin) — use at your own risk'}}, {'id': 'mistral-large-4', 'bloc': 'eu', 'tier': 'frontier', 'license': 'unreleased', 'license_class': 'non_commercial', 'territory': {}, 'local_class': 'S', 'status': 'verify', 'runtime': [], 'vram_gb': 700, 'source_unavailable': 'HELD UNTIL THE WEIGHTS EXIST. The scan brief asks for `status: pending`; the schema has no such status (default/backup/emerging/verify), so this uses `verify`, which is the one that cannot serve, and the reason is recorded here rather than invented as a fifth status value. Checked 2026-10-10: the mistralai author publishes no `Mistral-Large-4` repo - the newest Large is `mistralai/Mistral-Large-3-675B-Instruct-2512-NVFP4` (apache-2.0). Flip to `emerging` with a pinned source the day Mistral publishes.'}]
|
|
3
|
+
BY_ID: dict[str, dict] = {m['id']: m for m in REGISTRY}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"""THE ONE PIECE OF RUNPOD'S API WE OWN BY HAND.
|
|
2
|
+
|
|
3
|
+
Everything else goes through the `runpod` SDK. This module exists because the SDK has exactly one
|
|
4
|
+
gap we cannot work around: it can CREATE a template but cannot FIND one.
|
|
5
|
+
|
|
6
|
+
WHY A TEMPLATE IS NEEDED AT ALL
|
|
7
|
+
The node image is private (owner ruling: every device that shares GPU or CPU authenticates first),
|
|
8
|
+
so a pod must present a registry credential to pull it. `runpod.create_pod` has no parameter for
|
|
9
|
+
one — measured against runpod 1.12.0, which is the latest release. `runpod.create_template` does:
|
|
10
|
+
`registry_auth_id`. So the supported path is template-then-pod.
|
|
11
|
+
|
|
12
|
+
WHY THERE IS NO CACHE ANYWHERE IN THIS
|
|
13
|
+
The template is a PROJECTION of the pod spec, not a second source of truth. Its name is a hash of
|
|
14
|
+
the spec's own contents, so the same spec always resolves to the same name and a changed spec
|
|
15
|
+
produces a different one by itself. We re-find it by asking RunPod rather than by remembering an
|
|
16
|
+
id, because a remembered id is a second place that can drift from the spec. Nothing about the
|
|
17
|
+
template is stored on our side.
|
|
18
|
+
|
|
19
|
+
WHY THE LIST QUERY IS ACCEPTABLE WHERE A HAND-WRITTEN CREATE MUTATION WAS NOT
|
|
20
|
+
This is read-only. If RunPod changes the response shape, `_extract` returns nothing, the caller
|
|
21
|
+
fails to find the template, and the failure is "template not found" — loud, and no machine is
|
|
22
|
+
rented. A hand-written create mutation that drifted would quietly rent the wrong thing. The two
|
|
23
|
+
are not the same risk.
|
|
24
|
+
|
|
25
|
+
MEASURED 2026-09-20, and the behaviour this module is built around:
|
|
26
|
+
* create_template with a name that already exists FAILS: "Template name must be unique."
|
|
27
|
+
It neither returns the existing id nor makes a duplicate. So templates cannot leak, and
|
|
28
|
+
the count is bounded server-side by the number of distinct spec hashes.
|
|
29
|
+
* the error carries no id, and the SDK has no list query, so after the first creation the
|
|
30
|
+
id is unobtainable without the query below.
|
|
31
|
+
"""
|
|
32
|
+
from __future__ import annotations
|
|
33
|
+
|
|
34
|
+
import hashlib
|
|
35
|
+
import json
|
|
36
|
+
import logging
|
|
37
|
+
from typing import Any, Optional
|
|
38
|
+
|
|
39
|
+
log = logging.getLogger("frutebox.runpod_templates")
|
|
40
|
+
|
|
41
|
+
#: RunPod's GraphQL endpoint. The API key rides as a query parameter, which is how the SDK does it.
|
|
42
|
+
_API = "https://api.runpod.io/graphql"
|
|
43
|
+
|
|
44
|
+
#: THE QUERY, written out so the shape we depend on is visible next to the code that parses it.
|
|
45
|
+
#: `myself.podTemplates` is the list of templates on the account. We ask for the two fields we
|
|
46
|
+
#: use and nothing else: a narrower query is less to break.
|
|
47
|
+
LIST_TEMPLATES_QUERY = """
|
|
48
|
+
query myself {
|
|
49
|
+
myself {
|
|
50
|
+
podTemplates {
|
|
51
|
+
id
|
|
52
|
+
name
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def template_name(spec_dict: dict, prefix: str = "frutebox-node") -> str:
|
|
60
|
+
"""A name derived from the SPEC'S CONTENTS, never from a timestamp or a counter.
|
|
61
|
+
|
|
62
|
+
The same spec must always produce the same name — that is what makes the template re-findable
|
|
63
|
+
without storing anything. A changed spec produces a different name, so a new template appears
|
|
64
|
+
by itself and the old one is simply no longer referenced.
|
|
65
|
+
|
|
66
|
+
`sort_keys` matters: dict ordering must not change the hash, or a spec that is semantically
|
|
67
|
+
identical would mint a second template.
|
|
68
|
+
"""
|
|
69
|
+
canonical = json.dumps(spec_dict, sort_keys=True, separators=(",", ":"))
|
|
70
|
+
digest = hashlib.sha256(canonical.encode("utf8")).hexdigest()[:16]
|
|
71
|
+
return f"{prefix}-{digest}"
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _extract(payload: Any) -> "list[dict]":
|
|
75
|
+
"""Pull the template list out of a GraphQL reply, tolerating every shape but the one we want.
|
|
76
|
+
|
|
77
|
+
Returns [] rather than raising, because "RunPod answered something we do not recognise" and
|
|
78
|
+
"the account has no templates" lead to the same next step: create one. The difference is
|
|
79
|
+
logged, so a shape change is visible rather than silent.
|
|
80
|
+
"""
|
|
81
|
+
if not isinstance(payload, dict):
|
|
82
|
+
log.warning("runpod templates: reply was %s, not an object", type(payload).__name__)
|
|
83
|
+
return []
|
|
84
|
+
if payload.get("errors"):
|
|
85
|
+
log.warning("runpod templates: GraphQL errors in reply: %s", str(payload["errors"])[:200])
|
|
86
|
+
return []
|
|
87
|
+
data = payload.get("data")
|
|
88
|
+
if not isinstance(data, dict):
|
|
89
|
+
log.warning("runpod templates: no `data` in reply — RESPONSE SHAPE MAY HAVE CHANGED")
|
|
90
|
+
return []
|
|
91
|
+
myself = data.get("myself")
|
|
92
|
+
if not isinstance(myself, dict):
|
|
93
|
+
log.warning("runpod templates: no `data.myself` — RESPONSE SHAPE MAY HAVE CHANGED")
|
|
94
|
+
return []
|
|
95
|
+
rows = myself.get("podTemplates")
|
|
96
|
+
if not isinstance(rows, list):
|
|
97
|
+
log.warning("runpod templates: `podTemplates` was %s, not a list — "
|
|
98
|
+
"RESPONSE SHAPE MAY HAVE CHANGED", type(rows).__name__)
|
|
99
|
+
return []
|
|
100
|
+
return [r for r in rows if isinstance(r, dict)]
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def list_templates(timeout_s: float = 30.0) -> "list[dict]":
|
|
104
|
+
"""Every template on the account, as [{id, name}, ...]. Read-only."""
|
|
105
|
+
import httpx
|
|
106
|
+
|
|
107
|
+
# Read-only ops helper, and it resolves its credential the same way the launch path does
|
|
108
|
+
# (§A9 / §O: database first, env only behind `FRUTEBOX_PROVIDER_ENV_FALLBACK`). A helper that
|
|
109
|
+
# authenticated from a different source than the door it serves would report "no templates"
|
|
110
|
+
# for an account that has them — and `find_template_id` turns that into "template not found",
|
|
111
|
+
# which stops a bring-up.
|
|
112
|
+
from .gpuproviders import provider_credential
|
|
113
|
+
key = provider_credential("runpod", "RUNPOD_API_KEY")
|
|
114
|
+
if not key:
|
|
115
|
+
# The warning names what actually happened. "RUNPOD_API_KEY is not set" would now be a
|
|
116
|
+
# lie in the common case: the credential lives in the registry, and an operator sent
|
|
117
|
+
# hunting for an unset environment variable is looking in the wrong place.
|
|
118
|
+
log.warning("runpod templates: the RunPod credential could not be RESOLVED "
|
|
119
|
+
"(registry empty/unreachable, and no env fallback); cannot list")
|
|
120
|
+
return []
|
|
121
|
+
try:
|
|
122
|
+
r = httpx.post(f"{_API}?api_key={key}", json={"query": LIST_TEMPLATES_QUERY},
|
|
123
|
+
timeout=timeout_s, headers={"content-type": "application/json"})
|
|
124
|
+
except Exception as e: # network, DNS, TLS — all the same to the caller
|
|
125
|
+
log.warning("runpod templates: list failed (%s)", type(e).__name__)
|
|
126
|
+
return []
|
|
127
|
+
if r.status_code != 200:
|
|
128
|
+
log.warning("runpod templates: list returned HTTP %s", r.status_code)
|
|
129
|
+
return []
|
|
130
|
+
try:
|
|
131
|
+
return _extract(r.json())
|
|
132
|
+
except Exception as e:
|
|
133
|
+
log.warning("runpod templates: reply was not JSON (%s)", type(e).__name__)
|
|
134
|
+
return []
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def find_template_id(name: str) -> Optional[str]:
|
|
138
|
+
"""The id of the template with this exact name, or None. Read-only."""
|
|
139
|
+
for row in list_templates():
|
|
140
|
+
if row.get("name") == name:
|
|
141
|
+
tid = row.get("id")
|
|
142
|
+
return str(tid) if tid else None
|
|
143
|
+
return None
|