LLM-Profile (llm.php)
Welches Sprachmodell ein Assistent nutzt — Claude, OpenAI, Gemini oder ein OpenAI-kompatibler EU-/lokaler Server (Mittwald, IONOS, StackIT, Ollama).
LLM-Profile (llm.php)
Ein LLM-Profil ist ein benanntes Modell mit Anbieter, Zugang und Fähigkeiten. Assistenten verweisen per Name darauf:
// assistants/support.php
'llm' => 'mittwald', // fester Default
'llms' => ['mittwald', 'sonnet'], // Auswahl im Composer, erster = Default
Profile liegen in config/tenants/<code>/llm.php. Gemeinsame Profile (sonnet, haiku, gpt-4o, gemini …) kommen aus _shared/llm.php, ein Tenant kann sie überschreiben.
Felder
| Feld | Pflicht | Bedeutung |
|---|---|---|
provider |
ja | claude, openai, gemini oder openai_compatible |
model |
ja | Modellname genau so, wie der Server ihn erwartet |
base_url |
nur openai_compatible |
Basis-URL der API, z.B. https://…/v1. /chat/completions hängt TaskMonkey selbst an |
api_key |
meist | Immer als '{{secret:NAME}}' — der Wert steht in der Tenant-.env (siehe Secrets & .env). Alternativ 'api_key_secret' => 'NAME' |
capabilities |
empfohlen | Was das Modell kann, siehe unten |
display_name, display_hint |
nein | Anzeige im Modell-Chip des Composers |
Fähigkeiten (capabilities)
'capabilities' => [
'tools' => true, // Tool-Calls (Function Calling)
'vision' => false, // Bilder lesen
'streaming' => true, // SSE-Streaming
'max_context' => 131072, // Kontextfenster in Tokens
],
Alle Werte sind optional, Default: alles true, kein Limit. Fehlt einem Modell eine Fähigkeit, degradiert TaskMonkey statt abzustürzen:
tools => false: Tools werden nicht mitgeschickt, frühere Tool-Aufrufe landen als Text im Verlauf. Der Assistent antwortet dann nur mit Text. Verlangt ein Aufruf zwingend ein Tool, kommt eine klare Fehlermeldung („Profil unterstützt keine Tool-Calls“).vision => false: Bilder werden durch den Hinweis „Bild-Anhang — dieses Modell kann keine Bilder lesen“ ersetzt.max_context: Wird der Verlauf zu lang, fallen die ältesten Nachrichten weg (System-Prompt und letzte Nachricht bleiben).streaming => false: Die Antwort kommt am Stück statt Wort für Wort.
OpenAI-kompatible Server (EU / lokal)
Viele Anbieter sprechen dasselbe API-Format wie OpenAI. Mit provider => 'openai_compatible' bindest du sie ohne Code an.
Beispiel: Mittwald AI Hosting (Rechenzentrum Deutschland)
- Key anlegen: im mStudio unter AI Hosting einen API-Key erzeugen.
- Key in die
.envdes Workspaces (tenants_untracked/<code>/.env, auf Prodshared/tenants_untracked/<code>/.env):MITTWALD_AI_KEY=sk-... - Profil in
llm.phpeintragen und im Assistenten per'llm' => 'mittwald'nutzen:'mittwald' => [ 'provider' => 'openai_compatible', 'model' => 'gpt-oss-120b', 'base_url' => 'https://llm.aihosting.mittwald.de/v1', 'api_key' => '{{secret:MITTWALD_AI_KEY}}', 'capabilities' => ['tools' => true, 'vision' => false, 'max_context' => 131072], 'display_name' => 'gpt-oss 120B (Mittwald)', 'display_hint' => 'DE-Hosting', ],
Base-URL und Modelle laut mittwald Developer Portal (Stand 09/2026). Weitere Modelle dort, u.a. Qwen3.5-122B-A10B-FP8 (Tools + Vision, 245 760 Tokens) und Ministral-3-14B-Instruct-2512 (Tools + Vision, 262 144 Tokens). Modellnamen ändern sich — vor dem Eintragen in der Modell-Liste prüfen. Bilder nimmt Mittwald nur als Base64 an, nicht als URL. response_format: json_object wird dort ignoriert.
Beispiel: IONOS AI Model Hub
'ionos' => [
'provider' => 'openai_compatible',
'model' => 'meta-llama/Llama-3.3-70B-Instruct', // Platzhalter — Liste: GET …/v1/models
'base_url' => 'https://openai.inference.de-txl.ionos.com/v1',
'api_key' => '{{secret:IONOS_AI_TOKEN}}', // IONOS-Auth-Token
'capabilities' => ['tools' => true, 'vision' => false],
],
Beispiel: STACKIT AI Model Serving
'stackit' => [
'provider' => 'openai_compatible',
'model' => 'Llama-3.3-70B', // Platzhalter — Modellname aus der STACKIT-Konsole
'base_url' => 'https://api.openai-compat.model-serving.eu01.onstackit.cloud/v1',
'api_key' => '{{secret:STACKIT_AI_TOKEN}}',
],
Beispiel: Ollama / vLLM (lokal oder im eigenen Netz)
'lokal' => [
'provider' => 'openai_compatible',
'model' => 'llama3.1:8b',
'base_url' => 'http://localhost:11434/v1', // Ollama; vLLM meist :8000/v1
// kein api_key nötig → kein Authorization-Header
'capabilities' => ['tools' => true, 'vision' => false, 'max_context' => 8192],
],
Wichtig: http://, localhost und private IP-Adressen sind aus Sicherheitsgründen gesperrt (siehe unten). Der Betreiber muss den Host freigeben — in config/.env:
LLM_PRIVATE_HOSTS=localhost,127.0.0.1,ollama.internal
Ein Workspace kann sich diese Freigabe nicht selbst geben. Ist ein Server nur über einen Connector erreichbar, dessen Host hier eintragen.
Sicherheit
- Nur https und öffentliche Adressen. Die
base_urlwird wie ein Webhook-Ziel geprüft: keinhttp://, keine Zugangsdaten in der URL, keine internen/reservierten IPs (auch nicht über DNS), nicht TaskMonkey selbst. Die geprüfte IP wird für die Verbindung festgenagelt (DNS-Rebinding), Weiterleitungen werden nicht verfolgt. Eine abgelehnte URL führt nicht zum Absturz: der Chat zeigt „LLM-Profil "…": base_url abgelehnt: …“. - Keys nie in die Config.
api_keyist ein{{secret:…}}-Verweis, der Wert wird erst beim Aufbau des Providers aus der.envgelesen und nicht geloggt. - Kein Key-Leck an fremde Server. Ein Profil mit eigener
base_urlbekommt nie den zentralen OpenAI-Key von TaskMonkey — auch nicht, wennprovider => 'openai'gesetzt ist (das wird dann automatisch alsopenai_compatiblebehandelt). Den globalenOPENAI_COMPATIBLE_API_KEYbekommt nur, wer genau die globaleOPENAI_COMPATIBLE_BASE_URLnutzt. - Änderungen brauchen Freigabe.
base_url,api_key*undprovidersind sicherheitsrelevante Schlüssel: ändert der Builder-Chat sie perwriteTenantConfig, gibt es immer eine Vorschau mit Bestätigung (keine Auto-Freigabe). Ein Provider-Wechsel schickt Chat-Verläufe an einen anderen Auftragsverarbeiter — AV-Vertrag prüfen.
Global für alle Workspaces (Betreiber)
In config/.env (liest config/llm_providers.php):
OPENAI_COMPATIBLE_BASE_URL=https://llm.aihosting.mittwald.de/v1
OPENAI_COMPATIBLE_API_KEY=sk-...
OPENAI_COMPATIBLE_MODEL=gpt-oss-120b
Profile mit provider => 'openai_compatible' ohne eigene base_url nutzen dann diesen Zugang. OPENAI_BASE_URL biegt nur den offiziellen OpenAI-Provider um (z.B. auf ein Firmen-Gateway).
Grenzen
askLlm(Tool) kennt nuropenai/claude/gemini, keine Profile.- PDFs direkt lesen können nur Claude und Gemini; OpenAI-kompatible Modelle bekommen einen Hinweis statt des PDFs.