From 9e648ff45314f61cdf0717c447bd825cdbab60fd Mon Sep 17 00:00:00 2001 From: lachtan Date: Sun, 13 Sep 2026 14:37:42 +0200 Subject: [PATCH] nanobot: 2026-09-13 14:37:42 - Ollama model capabilities: log + skript do ai projektu --- .../ai/artifacts/ollama-model-capabilities.py | 31 +++++++++++++++++++ projects/ai/memory.md | 11 +++++++ 2 files changed, 42 insertions(+) create mode 100644 projects/ai/artifacts/ollama-model-capabilities.py diff --git a/projects/ai/artifacts/ollama-model-capabilities.py b/projects/ai/artifacts/ollama-model-capabilities.py new file mode 100644 index 0000000..7e32c89 --- /dev/null +++ b/projects/ai/artifacts/ollama-model-capabilities.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +"""List Ollama models on nvidia.hell:11434 with size + capabilities.""" +import json +import urllib.request + +BASE = "http://nvidia.hell:11434" + +with urllib.request.urlopen(f"{BASE}/api/tags", timeout=10) as r: + tags = json.load(r) + +models = [] +for m in tags.get("models", []): + name = m.get("name") + size = m.get("size", 0) + # fetch capabilities via /api/show + req = urllib.request.Request( + f"{BASE}/api/show", + data=json.dumps({"model": name}).encode(), + headers={"Content-Type": "application/json"}, + ) + try: + with urllib.request.urlopen(req, timeout=10) as r: + show = json.load(r) + caps = show.get("capabilities", []) + except Exception as e: + caps = [f"ERR: {e}"] + models.append({"name": name, "size_gb": round(size / 1e9, 1), "capabilities": caps}) + +models.sort(key=lambda x: x["size_gb"]) +for m in models: + print(f"{m['size_gb']:>6.1f} GB {','.join(m['capabilities']):<40} {m['name']}") \ No newline at end of file diff --git a/projects/ai/memory.md b/projects/ai/memory.md index 2bcb8bf..4563f08 100644 --- a/projects/ai/memory.md +++ b/projects/ai/memory.md @@ -52,3 +52,14 @@ Klíčová designová rozhodnutí: (1) brief je psaný pro čtenáře-agenta se https://www.librechat.ai/docs/local/docker - 2026-09-11: LibreChat research done — navrh postupu spusteni pres rootless podman + systemd Quadlet, artefakt: projects/ai/artifacts/librechat-podman/ (README + librechat.network + librechat.container + librechat-mongodb.container + librechat-meilisearch.container). Minimal stack api+mongo (RAG/vectordb/admin-panel vynechany kvuli RAM — duvod odstraneni OpenWebUI). MONGO_URI/MEILI_HOST nutno prepsat na DNS jmena kontejneru (quadlet sit), trvale CREDS_KEY/CREDS_IV/JWT secrets. Quadlet zvolen nad generate systemd (deprecated) a nad podman-compose-oneshot (systemd nevidi kontejnery). Rootless + linger, port 3080. Naseptany plan: nasadit na server (ktery?), pripojit Ollama/litellm endpointy pres librechat.yaml. +- 2026-09-13: - Zjišťování tool-calling schopností Ollama modelů na `nvidia.hell:11434` — jak ověřovat a co metadata neříkají: + +**Metoda:** `GET /api/tags` (seznam modelů + `size`) a pro každý model `POST /api/show` → pole `capabilities` (např. `["completion","tools","thinking","vision","embedding","insert","audio"]`). Kombinace těchto dvou endpointů dá kompletní tabulku model × velikost × schopnosti (skript: `workspace/tmp/list_ollama_models.py`, lze přesunout do artifacts). + +**Co `capabilities` je a není:** je to deklarace odvozená z Modelfile/manifestu modelu — Ollama tak *inzeruje* model jako tool-capable. Není to funkční test: neznamená to, že model vrátí validní `tool_calls` v odpovědi na `POST /api/chat` se `tools` v requestu. Metadata ⇒ kandidáti; funkční test ⇒ skutečná podpora. + +**Zásek: `qwen3-embedding` hlásí `tools` v capabilities, ale je to embedding model** — capabilities u něj nelze brát doslova, vždy křižovat s rodinou modelu. + +**Zjištěné výsledky (2026-09-12):** 57 modelů na instanci; lokálních s `tools` pod 10 GB cca 24 (nejmenší `lfm2.5-thinking` 0.7 GB, největší `gemma4`/`gemma4:e4b` 9.6 GB). `:cloud` modely mají size 0 GB (pointer na Ollama Cloud, neběží lokálně — do kritéria velikosti na disku nepatří). `gemini-3-flash-preview:cloud` vrací `POST /api/show` HTTP 410 Gone — mrtvý pointer, Ollama Cloud model stáhla. + +**Otevřené:** funkční test tool callingu (reálný `tools` request na každý kandidát a ověření validního `tool_calls` v odpovědi) ještě neproveden — nabídka visí.