Assistenten anlegen
Vordefinierte Chat-Kontexte mit eigenem Prompt und Tool-Set.
Ein Assistant ist ein fokussierter Chat-Modus. Das Modell bekommt einen klaren Auftrag und darf nur die Tools nutzen, die zu diesem Auftrag gehören. Das macht Antworten verlässlicher und hält den Token-Verbrauch niedrig.
Datei-Struktur
In deinem Workspace:
assistants/
├── bestellungen.php
├── inventur.php
└── support.php
Eine Datei pro Assistant. Der Dateiname ohne .php ist der Slug — der erscheint in der URL und in CLI-Befehlen.
Minimal-Beispiel
<?php
return [
'assistants.bestellungen' => [
'name' => 'Bestellungen',
'description' => 'Bestellungen prüfen, bearbeiten, stornieren.',
'icon' => '📦',
'tools' => [
'getOrder',
'listOrders',
'cancelOrder',
'setSuggestions',
],
],
'assistants.bestellungen.prompt' => <<<PROMPT
Du bist der Bestellungs-Assistent. Hilf dem Benutzer,
Bestellungen zu finden, ihren Status zu prüfen und
gegebenenfalls zu stornieren.
Nutze getOrder mit der Bestellnummer, wenn sie genannt wird.
Frage sonst zuerst nach der Bestellnummer.
PROMPT,
];
Zwei Einträge:
assistants.<slug>: Metadaten und Tool-Allowlistassistants.<slug>.prompt: der System-Prompt
Felder
| Feld | Pflicht | Bedeutung |
|---|---|---|
name |
ja | Anzeigename im Dashboard |
description |
empfohlen | Kurzbeschreibung unter der Kachel |
icon |
nein | Emoji fürs Dashboard |
tools |
ja | Liste von Tool-Namen, die dieses Modell aufrufen darf |
greeting |
nein | Erste Nachricht des Assistenten beim Chat-Start |
suggestions |
nein | Klick-Pills, Tap = sofort senden |
toggles |
nein | Multi-Select-Pills mit Checkbox-Optik, beim Send als Suffix |
inputs |
nein | Inline-Textfelder (Placeholder-Strings), beim Send als Prefix |
widget |
nein | Per-Assistant UI-Override (qr_scanner, voice_input, image_input) |
scanResolver |
nein | false zum Deaktivieren des Tenant-globalen Scan-Resolvers |
sheetView |
nein | Datenansicht in der Mobile-App |
reminder |
nein | Periodisch eingeblendeter Zusatz-Prompt |
conversation_tests |
nein | Automatische Tests (siehe tm test-conversations) |
Reicher Assistant
<?php
return [
'assistants.inventur' => [
'name' => 'Inventur',
'description' => 'Bestände aktualisieren und neue Produkte anlegen.',
'icon' => '📋',
'tools' => [
'getProducts',
'getStock',
'updateStock',
'createProduct',
'setSuggestions',
],
'greeting' => 'Hi! Welches Produkt willst du inventieren?',
'suggestions' => [
'Tomaten Rispen',
'Neue Sorte anlegen',
'Fehlbestände prüfen',
],
'reminder' => 'Frage immer nach der SKU, wenn keine genannt wird.',
],
'assistants.inventur.prompt' => <<<PROMPT
Du bist der Inventur-Assistent für einen Obst- und Gemüseladen.
Ablauf:
1. Produkt identifizieren (SKU bevorzugt, sonst nach Name suchen)
2. Aktuellen Bestand mit getStock abfragen
3. Neuen Wert mit updateStock setzen
4. Bestätigung mit Produktname und neuem Bestand ausgeben
Frage nur nach, was du wirklich brauchst.
Halte Antworten kurz.
PROMPT,
];
Tool-Allowlist
Die tools-Liste ist strikt. Tools, die nicht in der Liste stehen, sieht das Modell nicht — selbst wenn sie im Workspace definiert sind.
Vorteile:
- Modell kann nicht versehentlich aus dem Rollen-Scope ausbrechen
- Weniger Tool-Definitionen im Kontext → mehr Platz für Nutz-Tokens
- Klare Erwartungen an das, was der Assistant tut
setSuggestions ist oft nützlich
Ein eingebautes Tool, mit dem das Modell nach jeder Antwort Klick-Vorschläge, Toggles und Inline-Eingabefelder unterbreiten kann. Einfach in die tools-Liste aufnehmen, wenn du im Chat Pills sehen willst. Details in Vorschläge anbieten.
Scan-lastige Assistants (UI minimieren)
Für Workflows mit vielen Scans hintereinander (z.B. Tracking-Codes, Etiketten) lohnt es, Foto/Galerie und Voice auszublenden — sonst ist jeder Scan ein extra Klick durchs Bottom-Sheet. Per-Assistant-Override:
'assistants.carrier_wechsel' => [
'name' => 'Carrier-Wechsel',
'tools' => ['submitRelabeling', 'setSuggestions'],
'widget' => [
'qr_scanner' => true,
'voice_input' => false,
'image_input' => false,
],
// Tracking-Codes sind keine SKUs — den Tenant-globalen
// scanResolver hier deaktivieren, sonst macht jeder Scan
// einen unnötigen Backend-Roundtrip.
'scanResolver' => false,
'suggestions' => ['DHL → DPD', 'DPD → DHL', 'fertig'],
],
Wenn nur eine Anhang-Option übrig bleibt (hier: nur Scanner), ruft der Plus-Button die direkt auf — ohne Bottom-Sheet — und zeigt das passende Icon (QR statt generischem +).
Assistant testen
# Slug finden
tm tasks
# Manuell chatten
tm chat --task bestellungen
# Single-shot testen
tm test-chat "wo ist meine Bestellung #1001" --task bestellungen
# Regression-Tests
tm test-conversations --task bestellungen
Versteckte / interne Assistants
Assistants mit Namen, die mit _ beginnen (_internal, _debug), werden im Dashboard nicht angezeigt, sind aber über Slug erreichbar. Gut für Wartungs-Assistants, die nur du manuell startest.
Nach dem Anlegen
tm sync # Datei hochladen
tm tasks # prüfen, dass er auftaucht
tm chat --task <slug> # erster manueller Test