TaskMonkey Handbuch

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-Allowlist
  • assistants.<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
Zuletzt aktualisiert: 2026-05-04