# Noris Provider: Available Models As of 2026-06-27, the noris provider at `https://ai.noris.de/v1` exposes these models for the Schön Consulting virtual key: ## Anthropic Models (vision-capable) - `anthropic/claude-fable-5` - `anthropic/claude-haiku-4-5-20251001` — ✅ fast, vision-capable, good for auxiliary.vision - `anthropic/claude-opus-4-1-20250805` - `anthropic/claude-opus-4-5-20251101` - `anthropic/claude-opus-4-6` - `anthropic/claude-opus-4-7` - `anthropic/claude-opus-4-8` - `anthropic/claude-sonnet-4-5-20250929` - `anthropic/claude-sonnet-4-6` ## Self-hosted vLLM Models - `vllm/gemma-4-31b-it` — usable (nutrition-coach uses this) - `vllm/gemma-4-31b-it-dynamo` - `vllm/glm-5-2-nvfp4` — ✅ verified working (2026-06-27). Current CEO/default model. - `vllm/gpt-oss-120b` — usable - `vllm/harrier-oss-v1-0.6b` - `vllm/moonshotai/kimi-k2.6` — usable (infra-sre uses this) - `vllm/qwen3.5-122b-a10b` - `vllm/qwen3.6-27b-nvfp4` — ✅ verified working (2026-06-18). Returns reasoning-only format: `content: null`, `reasoning: "..."` - `vllm/qwen3.6-35b-a3b` ## Vision / Multimodal Capability (tested 2026-06-27) Tested by sending image+text to `/v1/chat/completions`: | Model | Vision? | Notes | |-------|---------|-------| | `vllm/gemma-4-31b-it` | ✅ Yes | Good descriptions, recommended for `auxiliary.vision` | | `vllm/qwen3.5-122b-a10b` | ✅ Yes | Works but terse output | | `vllm/glm-5-2-nvfp4` | ❌ No | Returns `"glm-5-2-nvfp4 is not a multimodal model"` | | `vllm/qwen3.6-27b-nvfp4` | ❌ No | HTTP 400 | | All `anthropic/*` models | ✅ Yes | `claude-haiku-4-5` fastest option | **User preference: prefer `vllm/` models over `anthropic/` for auxiliary tasks.** Current `auxiliary.vision` config: ```bash hermes config set auxiliary.vision.provider noris hermes config set auxiliary.vision.model vllm/gemma-4-31b-it hermes config set auxiliary.vision.base_url '' hermes config set auxiliary.vision.api_key '' ``` ### Testing vision capability programmatically ```python import yaml, urllib.request, json, base64 with open("/home/debian/.hermes/config.yaml") as f: cfg = yaml.safe_load(f) key = cfg["providers"]["noris"]["api_key"] with open("test_image.jpg", "rb") as f: img_b64 = base64.b64encode(f.read()).decode() payload = { "model": "", "messages": [{"role": "user", "content": [ {"type": "text", "text": "Describe this image briefly."}, {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{img_b64}"}} ]}], "max_tokens": 50 } req = urllib.request.Request( "https://ai.noris.de/v1/chat/completions", data=json.dumps(payload).encode(), headers={"Authorization": f"Bearer {key}", "Content-Type": "application/json"} ) try: with urllib.request.urlopen(req, timeout=30) as resp: print(json.loads(resp.read())["choices"][0]["message"]["content"]) except Exception as e: print(f"Not multimodal: {e}") ``` ## Embedding / Reranker Models (non-chat) - `vllm/bge-reranker-v2-m3` - `vllm/jina-reranker-v2-base-multilingual` ## Blocked Models - `vllm/gemma-4-27b-it` — returns 403: `{"type":"model_blocked","error":{"message":"Model 'gemma-4-27b-it' is not allowed for this virtual key"}}` ## Verification ```python import yaml, urllib.request, json with open("/home/debian/.hermes/config.yaml") as f: cfg = yaml.safe_load(f) key = cfg["providers"]["noris"]["api_key"] req = urllib.request.Request( "https://ai.noris.de/v1/models", headers={"Authorization": f"Bearer {key}"} ) with urllib.request.urlopen(req) as resp: models = json.loads(resp.read()) for m in sorted(models["data"], key=lambda x: x["id"]): print(m["id"]) ``` Always verify model availability via the `/v1/models` endpoint before assigning to an agent profile. A blocked model will cause silent 403 errors on first user interaction. **Vision pitfall:** Not all chat models support image input. `vllm/glm-5-2-nvfp4` (the default CEO model) is NOT multimodal — `vision_analyze` will fail with `"is not a multimodal model"`. Set `auxiliary.vision.model` to a vision-capable model like `vllm/gemma-4-31b-it`. See the "Vision / Multimodal Capability" section above for the full tested matrix.