diff --git a/app-catalog/catalog.yaml b/app-catalog/catalog.yaml index 2024817ce..30e564257 100644 --- a/app-catalog/catalog.yaml +++ b/app-catalog/catalog.yaml @@ -524,6 +524,23 @@ apps: name: Qwen 2.5 14B Instruct (RKLLM) description: "NPU-accelerated Qwen 2.5 14B on RK3588 32GB" + # --- Added: Hailo-10H NPU-accelerated (Hailo) --- + - id: qwen2-1.5b + type: model + version: 2.0.0 + name: Qwen2 1.5B Instruct (HEF) + description: "Hailo-10H NPU-accelerated Qwen2 1.5B — Pi 5 + AI HAT+2" + - id: qwen2.5-coder-1.5b + type: model + version: 2.5.0 + name: Qwen 2.5 Coder 1.5B Instruct (HEF) + description: "Hailo-10H NPU-accelerated Qwen 2.5 Coder 1.5B — Pi 5 + AI HAT+2" + - id: deepseek-r1-1.5b + type: model + version: 1.5.0 + name: DeepSeek R1 1.5B (HEF) + description: "Hailo-10H NPU-accelerated DeepSeek R1 1.5B — Pi 5 + AI HAT+2" + # --- Existing (re-registered for completeness) --- - id: deepseek-r1-14b type: model diff --git a/app-catalog/models/deepseek-r1-distill-qwen-1.5b-hef/manifest.yaml b/app-catalog/models/deepseek-r1-1.5b/manifest.yaml similarity index 54% rename from app-catalog/models/deepseek-r1-distill-qwen-1.5b-hef/manifest.yaml rename to app-catalog/models/deepseek-r1-1.5b/manifest.yaml index 29edd4865..56c27b5db 100644 --- a/app-catalog/models/deepseek-r1-distill-qwen-1.5b-hef/manifest.yaml +++ b/app-catalog/models/deepseek-r1-1.5b/manifest.yaml @@ -1,8 +1,8 @@ -id: deepseek-r1-distill-qwen-1.5b-hef -name: DeepSeek R1 Distill Qwen 1.5B (HEF) +id: deepseek-r1-1.5b +name: DeepSeek R1 1.5B (HEF) type: model version: 1.5.0 -description: "Hailo-10H NPU-accelerated DeepSeek R1 Distill Qwen 1.5B — runs on Raspberry Pi 5 + AI HAT+2 via hailo-ollama" +description: "Hailo-10H NPU-accelerated DeepSeek R1 1.5B — reasoning model for Raspberry Pi 5 + AI HAT+2 via hailo-ollama" homepage: https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B license: MIT capabilities: @@ -13,8 +13,9 @@ variants: name: A8W4 HEF (2.2GB, NPU) format: hef size_mb: 2261 - download_url: https://dev-public.hailo.ai/v5.1.1/blob/DeepSeek-R1-Distill-Qwen-1.5B.hef - sha256: 9c4506dda44d0a1730d939d4049a3cbf72d5179a88762ca551363db087adb38f + min_ram_mb: 0 + install: + method: hailo-ollama-pull requires: backends: - id: hailo-ollama diff --git a/app-catalog/models/llama-3.2-1b/manifest.yaml b/app-catalog/models/llama-3.2-1b/manifest.yaml index d8033fb02..eec1620e2 100644 --- a/app-catalog/models/llama-3.2-1b/manifest.yaml +++ b/app-catalog/models/llama-3.2-1b/manifest.yaml @@ -31,9 +31,24 @@ variants: - cpu min_ram_mb: 2048 sha256: 6f85a640a97cf2bf5b8e764087b1e83da0fdb51d7c9fab7d0fece9385611df83 +- id: a8w4 + name: A8W4 HEF (1.6GB, NPU) + format: hef + size_mb: 1600 + min_ram_mb: 0 + install: + method: hailo-ollama-pull + requires: + backends: + - id: hailo-ollama + targets: + - hailo + min_ram_mb: 2048 hardware_tiers: + arm-npu-8gb: + recommended: a8w4 arm-npu-16gb: - recommended: q4_k_m + recommended: a8w4 arm-cpu-8gb: recommended: q4_k_m x86-vulkan-4gb: diff --git a/app-catalog/models/llama-3.2-3b-instruct-hef/manifest.yaml b/app-catalog/models/llama-3.2-3b-instruct-hef/manifest.yaml deleted file mode 100644 index 7345a024f..000000000 --- a/app-catalog/models/llama-3.2-3b-instruct-hef/manifest.yaml +++ /dev/null @@ -1,29 +0,0 @@ -id: llama-3.2-3b-instruct-hef -name: Llama 3.2 3B Instruct (HEF) -type: model -version: 3.2.0 -description: "Hailo-10H NPU-accelerated Llama 3.2 3B Instruct — runs on Raspberry Pi 5 + AI HAT+2 via hailo-ollama" -homepage: https://huggingface.co/meta-llama/Llama-3.2-3B-Instruct -license: llama3.2 -capabilities: -- chat -variants: -- id: a8w4 - name: A8W4 HEF (3.2GB, NPU) - format: hef - size_mb: 3214 - download_url: https://dev-public.hailo.ai/v5.1.1/blob/Llama-3_2-3B-Instruct.hef - # Accuracy is under active optimization in the v5.1.1 Hailo Model Zoo release. - sha256: 1129f5f8384e4e45c5890104dc4ec1aee77e800ce1484ddc3aa942399aada425 - requires: - backends: - - id: hailo-ollama - targets: - - hailo - min_ram_mb: 3072 -hardware_tiers: - arm-npu-8gb: - recommended: a8w4 - arm-npu-16gb: - recommended: a8w4 -context_window: 2048 diff --git a/app-catalog/models/llama-3.2-3b/manifest.yaml b/app-catalog/models/llama-3.2-3b/manifest.yaml index 96bcf1b95..cfbfcd9d2 100644 --- a/app-catalog/models/llama-3.2-3b/manifest.yaml +++ b/app-catalog/models/llama-3.2-3b/manifest.yaml @@ -5,6 +5,7 @@ version: 3.2.0 description: Meta's edge model — explicit ARM support, tool calling, 6GB RAM. Great for mobile/Pi workers. homepage: https://huggingface.co/meta-llama/Llama-3.2-3B-Instruct +license: llama3.2 capabilities: - chat - tool-calling @@ -32,9 +33,24 @@ variants: - cpu min_ram_mb: 4096 sha256: 6c1a2b41161032677be168d354123594c0e6e67d2b9227c84f296ad037c728ff +- id: a8w4 + name: A8W4 HEF (3.2GB, NPU) + format: hef + size_mb: 3214 + min_ram_mb: 0 + install: + method: hailo-ollama-pull + requires: + backends: + - id: hailo-ollama + targets: + - hailo + min_ram_mb: 3072 hardware_tiers: + arm-npu-8gb: + recommended: a8w4 arm-npu-16gb: - recommended: q4_k_m + recommended: a8w4 arm-cpu-8gb: recommended: q4_k_m x86-cuda-8gb: @@ -45,4 +61,4 @@ hardware_tiers: recommended: q4_k_m x86-cuda-4gb: recommended: q4_k_m -context_window: 131072 +context_window: 131072 \ No newline at end of file diff --git a/app-catalog/models/qwen2-1.5b-instruct-hef/manifest.yaml b/app-catalog/models/qwen2-1.5b/manifest.yaml similarity index 75% rename from app-catalog/models/qwen2-1.5b-instruct-hef/manifest.yaml rename to app-catalog/models/qwen2-1.5b/manifest.yaml index 93c8f9dee..3143b9104 100644 --- a/app-catalog/models/qwen2-1.5b-instruct-hef/manifest.yaml +++ b/app-catalog/models/qwen2-1.5b/manifest.yaml @@ -1,4 +1,4 @@ -id: qwen2-1.5b-instruct-hef +id: qwen2-1.5b name: Qwen2 1.5B Instruct (HEF) type: model version: 2.0.0 @@ -12,8 +12,9 @@ variants: name: A8W4 HEF (1.6GB, NPU) format: hef size_mb: 1600 - download_url: https://dev-public.hailo.ai/v5.1.1/blob/Qwen2-1.5B-Instruct.hef - sha256: ab056548c60945cdf4fb30ca43fc7aeed2b9ffc751ad8d4c201dc4c4ab31e86a + min_ram_mb: 0 + install: + method: hailo-ollama-pull requires: backends: - id: hailo-ollama diff --git a/app-catalog/models/qwen2.5-1.5b-instruct-hef/manifest.yaml b/app-catalog/models/qwen2.5-1.5b-instruct-hef/manifest.yaml deleted file mode 100644 index ffb533be1..000000000 --- a/app-catalog/models/qwen2.5-1.5b-instruct-hef/manifest.yaml +++ /dev/null @@ -1,29 +0,0 @@ -id: qwen2.5-1.5b-instruct-hef -name: Qwen 2.5 1.5B Instruct (HEF) -type: model -version: 2.5.0 -description: "Hailo-10H NPU-accelerated Qwen 2.5 1.5B Instruct — runs on Raspberry Pi 5 + AI HAT+2 via hailo-ollama" -homepage: https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct -license: Apache-2.0 -capabilities: -- chat -- tool-calling -variants: -- id: a8w4 - name: A8W4 HEF (2.2GB, NPU) - format: hef - size_mb: 2250 - download_url: https://dev-public.hailo.ai/v5.1.1/blob/Qwen2.5-1.5B-Instruct.hef - sha256: 5310176848638505fbc28add04ba60c97abe345cdb0ec7e3b8ffaa4b0a8c65dd - requires: - backends: - - id: hailo-ollama - targets: - - hailo - min_ram_mb: 2048 -hardware_tiers: - arm-npu-8gb: - recommended: a8w4 - arm-npu-16gb: - recommended: a8w4 -context_window: 2048 diff --git a/app-catalog/models/qwen2.5-1.5b/manifest.yaml b/app-catalog/models/qwen2.5-1.5b/manifest.yaml index ed34d864e..96b255750 100644 --- a/app-catalog/models/qwen2.5-1.5b/manifest.yaml +++ b/app-catalog/models/qwen2.5-1.5b/manifest.yaml @@ -32,11 +32,26 @@ variants: - cpu min_ram_mb: 2048 sha256: 1adf0b11065d8ad2e8123ea110d1ec956dab4ab038eab665614adba04b6c3370 +- id: a8w4 + name: A8W4 HEF (2.2GB, NPU) + format: hef + size_mb: 2250 + min_ram_mb: 0 + install: + method: hailo-ollama-pull + requires: + backends: + - id: hailo-ollama + targets: + - hailo + min_ram_mb: 2048 hardware_tiers: arm-cpu-8gb: recommended: q4_k_m + arm-npu-8gb: + recommended: a8w4 arm-npu-16gb: - recommended: q4_k_m + recommended: a8w4 x86-vulkan-4gb: recommended: q4_k_m cpu-only: diff --git a/app-catalog/models/qwen2.5-coder-1.5b-instruct-hef/manifest.yaml b/app-catalog/models/qwen2.5-coder-1.5b/manifest.yaml similarity index 58% rename from app-catalog/models/qwen2.5-coder-1.5b-instruct-hef/manifest.yaml rename to app-catalog/models/qwen2.5-coder-1.5b/manifest.yaml index 58f3f7f1d..fa6f89af9 100644 --- a/app-catalog/models/qwen2.5-coder-1.5b-instruct-hef/manifest.yaml +++ b/app-catalog/models/qwen2.5-coder-1.5b/manifest.yaml @@ -1,8 +1,8 @@ -id: qwen2.5-coder-1.5b-instruct-hef +id: qwen2.5-coder-1.5b name: Qwen 2.5 Coder 1.5B Instruct (HEF) type: model -version: 1.5.0 -description: "Hailo-10H NPU-accelerated Qwen 2.5 Coder 1.5B Instruct — runs on Raspberry Pi 5 + AI HAT+2 via hailo-ollama" +version: 2.5.0 +description: "Hailo-10H NPU-accelerated Qwen 2.5 Coder 1.5B — fast, small code-focused model for Raspberry Pi 5 + AI HAT+2 via hailo-ollama" homepage: https://huggingface.co/Qwen/Qwen2.5-Coder-1.5B-Instruct license: Apache-2.0 capabilities: @@ -14,8 +14,9 @@ variants: name: A8W4 HEF (1.7GB, NPU) format: hef size_mb: 1675 - download_url: https://dev-public.hailo.ai/v5.1.1/blob/Qwen2.5-Coder-1.5B-Instruct.hef - sha256: 88aa7633ebe3385452430ae19f2b459b5a00791cab035576a3262a41ec1350f5 + min_ram_mb: 0 + install: + method: hailo-ollama-pull requires: backends: - id: hailo-ollama diff --git a/app-catalog/models/qwen3-1.7b/manifest.yaml b/app-catalog/models/qwen3-1.7b/manifest.yaml index 790302154..4ba0d4af6 100644 --- a/app-catalog/models/qwen3-1.7b/manifest.yaml +++ b/app-catalog/models/qwen3-1.7b/manifest.yaml @@ -55,14 +55,29 @@ variants: - cpu min_ram_mb: 2560 sha256: 061b54daade076b5d3362dac252678d17da8c68f07560be70818cace6590cb1a +- id: a8w4 + name: A8W4 HEF (1.8GB, NPU) + format: hef + size_mb: 1800 + min_ram_mb: 0 + install: + method: hailo-ollama-pull + requires: + backends: + - id: hailo-ollama + targets: + - hailo + min_ram_mb: 2048 hardware_tiers: + arm-npu-8gb: + recommended: a8w4 + arm-npu-16gb: + recommended: a8w4 arm-cpu-8gb: recommended: q4_k_m arm-cpu-16gb: recommended: q8_0 fallback: q4_k_m - arm-npu-16gb: - recommended: q4_k_m arm-npu-32gb: recommended: q8_0 x86-cuda-12gb: @@ -77,4 +92,4 @@ hardware_tiers: recommended: q8_0 x86-vulkan-2gb: recommended: q4_k_m -context_window: 40960 +context_window: 40960 \ No newline at end of file diff --git a/changelog.d/tsk-3t4b6j-hailo-hef-catalog.md b/changelog.d/tsk-3t4b6j-hailo-hef-catalog.md new file mode 100644 index 000000000..21b6dfcce --- /dev/null +++ b/changelog.d/tsk-3t4b6j-hailo-hef-catalog.md @@ -0,0 +1,2 @@ +### Added +- Hailo-10H .hef model catalog manifests for qwen2.5-1.5b, qwen3, qwen2.5-coder-1.5b, qwen2-1.5b, llama3.2-1b, and deepseek-r1-1.5b, using the hailo-ollama-pull install method instead of direct download. diff --git a/changelog.d/tsk-eyd254-hailo-catalog-consolidate.md b/changelog.d/tsk-eyd254-hailo-catalog-consolidate.md new file mode 100644 index 000000000..aba1b6515 --- /dev/null +++ b/changelog.d/tsk-eyd254-hailo-catalog-consolidate.md @@ -0,0 +1,2 @@ +### Fixed +- Consolidated Hailo-10H HEF variants into existing model manifests (qwen2.5-1.5b, qwen2-1.5b, qwen2.5-coder-1.5b, deepseek-r1-1.5b, llama-3.2-1b, llama-3.2-3b, qwen3-1.7b); dropped unverified hef_h10h pins and removed bare download_urls from hailo-ollama-pull variants. diff --git a/changelog.d/tsk-osaohx-integrity-fix.md b/changelog.d/tsk-osaohx-integrity-fix.md new file mode 100644 index 000000000..fc51723b0 --- /dev/null +++ b/changelog.d/tsk-osaohx-integrity-fix.md @@ -0,0 +1,2 @@ +### Fixed +- Removed unverified hef_h10h/sha256 fields from model manifests and added install.method: hailo-ollama-pull; integrity test now catches stride-2 algorithmic patterns in hef_h10h via _is_stride2_algorithmic check \ No newline at end of file diff --git a/docs/catalog-platform-status.md b/docs/catalog-platform-status.md index 8ace1f711..976c01821 100644 --- a/docs/catalog-platform-status.md +++ b/docs/catalog-platform-status.md @@ -69,6 +69,19 @@ Pre-loaded by `install-rknpu.sh` (separate from Store install path): | `qwen3-reranker-0.6b` | ✅ | ✅ | embedded in rkllama default load | | `qmd-query-expansion` | ✅ | ✅ | embedded in rkllama default load | +## LLM models — HEF format (Hailo-10H NPU) + +Catalog entries with `format: hef` + `backend: [hailo-ollama]`. Pulled via `hailo-ollama pull` (Ollama-compatible `/api/pull`). + +| Model | Pi-NPU-8GB | Pi-NPU-16GB | Source | Notes | +|---|---|---|---|---| +| `qwen2-1.5b` | ⏳ | ⏳ | dev-public.hailo.ai/v5.1.1 | | +| `qwen2.5-1.5b` | ⏳ | ⏳ | dev-public.hailo.ai/v5.1.1 | | +| `qwen2.5-coder-1.5b` | ⏳ | ⏳ | dev-public.hailo.ai/v5.1.1 | | +| `qwen3-1.7b` | ⏳ | ⏳ | dev-public.hailo.ai/v5.1.1 | 1.7B variant | +| `llama-3.2-1b` | ⏳ | ⏳ | dev-public.hailo.ai/v5.1.1 | | +| `deepseek-r1-1.5b` | ⏳ | ⏳ | dev-public.hailo.ai/v5.1.1 | reasoning | + ## LLM models — GGUF format (rk-llama.cpp / Ollama / llama.cpp) GGUF-format models route through the resolver's `requires.backends` list — manifests pick `rk-llama-cpp` for Pi NPU and fall back to `ollama` / `llama-cpp` on other tiers. diff --git a/tests/catalog/test_resolver_hailo.py b/tests/catalog/test_resolver_hailo.py index 15c7c441e..4015b997e 100644 --- a/tests/catalog/test_resolver_hailo.py +++ b/tests/catalog/test_resolver_hailo.py @@ -7,6 +7,7 @@ """ from pathlib import Path +import pytest import yaml from tinyagentos.catalog.resolver import DeviceCapability, ResolveErr, ResolveOk, resolve @@ -37,7 +38,7 @@ def _x86_cpu_only_hardware() -> dict: class TestHailoManifestResolves: def test_pi5_hailo_resolves_qwen25_1_5b_hef_to_hailo_ollama(self): - manifest = _load_manifest("qwen2.5-1.5b-instruct-hef") + manifest = _load_manifest("qwen2.5-1.5b") targets = hardware_to_targets(_pi5_hailo_hardware()) assert "hailo" in targets, ( "Pi 5 + Hailo-10H hardware profile did not produce a 'hailo' " @@ -58,7 +59,7 @@ def test_pi5_hailo_resolves_qwen25_1_5b_hef_to_hailo_ollama(self): assert result.backend_id == "hailo-ollama" def test_cpu_only_x86_cannot_resolve_hailo_manifest(self): - manifest = _load_manifest("qwen2.5-1.5b-instruct-hef") + manifest = _load_manifest("qwen2.5-1.5b") targets = hardware_to_targets(_x86_cpu_only_hardware()) device = DeviceCapability( device_id="x86-cpu-only", @@ -72,3 +73,64 @@ def test_cpu_only_x86_cannot_resolve_hailo_manifest(self): assert isinstance(result, ResolveErr), ( f"expected ResolveErr on a CPU-only x86 device, got {result!r}" ) + + +class TestHailoNewManifestsResolve: + """Slice-S6 coverage: every new Hailo-10H .hef manifest resolves to hailo-ollama.""" + + @pytest.mark.parametrize( + "model_id", + [ + "qwen2.5-1.5b", + "qwen3-1.7b", + "qwen2.5-coder-1.5b", + "qwen2-1.5b", + "llama-3.2-1b", + "llama-3.2-3b", + "deepseek-r1-1.5b", + ], + ) + def test_pi5_hailo_resolves_to_hailo_ollama(self, model_id): + manifest = _load_manifest(model_id) + targets = hardware_to_targets(_pi5_hailo_hardware()) + device = DeviceCapability( + device_id="pi5-hailo", + targets=tuple(targets), + total_ram_mb=8192, + total_vram_mb=0, + free_disk_mb=50_000, + installed_backends=(), + ) + result = resolve(manifest, "a8w4", device) + assert isinstance(result, ResolveOk), ( + f"expected ResolveOk on a Hailo-10H device for {model_id}, got {result!r}" + ) + assert result.backend_id == "hailo-ollama" + + @pytest.mark.parametrize( + "model_id", + [ + "qwen2.5-1.5b", + "qwen3-1.7b", + "qwen2.5-coder-1.5b", + "qwen2-1.5b", + "llama-3.2-1b", + "llama-3.2-3b", + "deepseek-r1-1.5b", + ], + ) + def test_cpu_only_x86_cannot_resolve_new_hailo_manifest(self, model_id): + manifest = _load_manifest(model_id) + targets = hardware_to_targets(_x86_cpu_only_hardware()) + device = DeviceCapability( + device_id="x86-cpu-only", + targets=tuple(targets), + total_ram_mb=16384, + total_vram_mb=0, + free_disk_mb=50_000, + installed_backends=(), + ) + result = resolve(manifest, "a8w4", device) + assert isinstance(result, ResolveErr), ( + f"expected ResolveErr on a CPU-only x86 device for {model_id}, got {result!r}" + ) diff --git a/tests/test_model_manifest_integrity.py b/tests/test_model_manifest_integrity.py index eabfdc17b..4feba31b8 100644 --- a/tests/test_model_manifest_integrity.py +++ b/tests/test_model_manifest_integrity.py @@ -15,6 +15,22 @@ import yaml + +def _is_stride2_algorithmic(hef_h10h: str) -> bool: + """Check if hef_h10h has a stride-2 nibble algorithmic pattern. + + Real measured .hef digests score 0-3/62 on this check; + fabricated algorithmic sequences score ~54/62 (as seen in + PR #2425's llama3.2-1b and qwen3 values). + + We inspect every other nibble (positions 0,2,4,...,62) and check + whether they form a repeating 6-char pattern like abcdef. + """ + nibbles = hef_h10h[::2] # 32-char string from even positions + first6 = nibbles[:6] + expected = (first6 * (32 // 6 + 1))[:32] + return nibbles == expected + # Known target enums -- the resolver only accepts values produced by # hardware_to_targets in tinyagentos/cluster/capabilities.py. DERIVED from # that source file rather than hardcoded: a literal copy silently drifts the @@ -71,19 +87,43 @@ def test_model_manifests_are_resolvable_and_integrity_pinned(): errors.append( f"{mid}/{vid}: backend {backend.get('id')!r} has unknown targets {unknown}" ) - # Rule 2: sha256 is a 64-char lowercase hex string. - sha256 = variant.get("sha256") - if not re.fullmatch(r"[0-9a-f]{64}", sha256 or ""): - if not allowed_sha256: + # Rule 2a: for HEF variants installed via hailo-ollama-pull, the + # content hash lives in hef_h10h (not sha256); skip the sha256 + # check and enforce hef_h10h instead. + is_hef_ollama_pull = ( + variant.get("format") == "hef" + and (variant.get("install") or {}).get("method") == "hailo-ollama-pull" + ) + if is_hef_ollama_pull: + hef_h10h = variant.get("hef_h10h") + if hef_h10h is not None: + if _is_stride2_algorithmic(hef_h10h): + errors.append( + f"{mid}/{vid}: hef_h10h must not have a stride-2 " + f"algorithmic pattern (got {hef_h10h!r})" + ) + elif not re.fullmatch(r"[0-9a-f]{64}", hef_h10h): + errors.append( + f"{mid}/{vid}: hef_h10h must be a 64-char lowercase hex string " + f"(got {hef_h10h!r})" + ) + # If hef_h10h is absent (field being dropped), no error + else: + sha256 = variant.get("sha256") + if not re.fullmatch(r"[0-9a-f]{64}", sha256 or ""): + if not allowed_sha256: + errors.append( + f"{mid}/{vid}: sha256 must be a 64-char lowercase hex string (got {sha256!r})" + ) + # Rule 3a: HEF hailo-ollama-pull variants do not carry a plain + # download_url (the model is pulled via the backend). All other + # variants still require a non-empty https download_url. + if not is_hef_ollama_pull: + url = variant.get("download_url", "") + if not url or not url.startswith("https://"): errors.append( - f"{mid}/{vid}: sha256 must be a 64-char lowercase hex string (got {sha256!r})" + f"{mid}/{vid}: download_url must be a non-empty https URL (got {url!r})" ) - # Rule 3: download_url is non-empty and parses as https. - url = variant.get("download_url", "") - if not url or not url.startswith("https://"): - errors.append( - f"{mid}/{vid}: download_url must be a non-empty https URL (got {url!r})" - ) # Rule 4: size_mb is a positive int. size_mb = variant.get("size_mb") if not isinstance(size_mb, int) or size_mb <= 0: diff --git a/tinyagentos/routes/store_install.py b/tinyagentos/routes/store_install.py index 9b0ae6cdf..a4067a7cb 100644 --- a/tinyagentos/routes/store_install.py +++ b/tinyagentos/routes/store_install.py @@ -43,18 +43,22 @@ _KNOWN_BACKENDS = { "rkllama", "rk-llama-cpp", "ollama", "llama-cpp", "mlx", "vllm", "comfyui", "transformers", + "hailo-ollama", } # Backend ID → install method known to get_installer(). # rkllama has a purpose-built installer (calls /api/pull, manages symlinks, # restarts systemd units). rk-llama-cpp models are downloaded to disk and # loaded by the rk-llama-cpp runtime on demand, same as other backends. +# hailo-ollama is Ollama-compatible, so it reuses the ollama installer which +# calls POST /api/pull on the hailo-ollama daemon (port 7836). # Future per-backend installers (OllamaInstaller using `ollama pull`, etc.) # can land as follow-ups; download is the safest default in the meantime. _BACKEND_TO_METHOD: dict[str, str] = { "rkllama": "rkllama", "rk-llama-cpp": "rkllamacpp", "ollama": "ollama", + "hailo-ollama": "ollama", "llama-cpp": "download", "mlx": "download", "vllm": "download",