Kostenlos testen
Handbuch

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)

  1. Key anlegen: im mStudio unter AI Hosting einen API-Key erzeugen.
  2. Key in die .env des Workspaces (tenants_untracked/<code>/.env, auf Prod shared/tenants_untracked/<code>/.env):
    MITTWALD_AI_KEY=sk-...
    
  3. Profil in llm.php eintragen 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_url wird wie ein Webhook-Ziel geprüft: kein http://, 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_key ist ein {{secret:…}}-Verweis, der Wert wird erst beim Aufbau des Providers aus der .env gelesen und nicht geloggt.
  • Kein Key-Leck an fremde Server. Ein Profil mit eigener base_url bekommt nie den zentralen OpenAI-Key von TaskMonkey — auch nicht, wenn provider => 'openai' gesetzt ist (das wird dann automatisch als openai_compatible behandelt). Den globalen OPENAI_COMPATIBLE_API_KEY bekommt nur, wer genau die globale OPENAI_COMPATIBLE_BASE_URL nutzt.
  • Änderungen brauchen Freigabe. base_url, api_key* und provider sind sicherheitsrelevante Schlüssel: ändert der Builder-Chat sie per writeTenantConfig, 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 nur openai/claude/gemini, keine Profile.
  • PDFs direkt lesen können nur Claude und Gemini; OpenAI-kompatible Modelle bekommen einen Hinweis statt des PDFs.
Zuletzt aktualisiert: 2026-09-26