enhancement
major
minor
defect
critical
major
minor
major
#30158
TL-Chat: Einem Chat-Agenten ermöglichen, die Eingabe eines von ihm ausgeführten Seitenbefehls weiterzugeben
Problem
Seit #30149 führt ein Chat-Agent die Befehle aus, die in seiner <chat-conversation> unter <agent-commands> aufgeführt sind (page-commands.runPageCommand). Das Tool berücksichtigt nur den Namen des Befehls, sodass ein Befehl nur auf Inhalte wirken kann, die bereits auf der Seite vorhanden sind. Ein Agent kann nicht angeben, für welches Objekt ein Befehl bestimmt ist: „Zeige den Chat der Konversation an, die ich gerade übergeben habe“, „Öffne das Formular für eine neue Git-Verbindung für Mandant X“, „Zeige das Projekt an, dessen Anwendung der Benutzer öffnen möchte“.
Die Bausteine sind vorhanden: Ein Befehl bezieht seine Eingaben aus Kanälen, und eine Ansichtsaktion bindet Kanalwerte (<show-views>). Der einzige Schreibvorgang des Agenten in die Seite, „present“, lässt sich nicht mit ihnen kombinieren. Sein Tool-Vertrag endet mit „Beantworte danach in ein oder zwei Sätzen, was der Benutzer nun sieht, und rufe kein weiteres Tool auf.“, und seine Antwort lautet: „Der Benutzer sieht nun das Formular dieses Objekts“. Für einen Kanal, der lediglich die Eingabe eines Befehls ist, sind beide Aussagen falsch.
Änderung
Ein <agent-command> benennt die Eingaben, die ein Agent festlegen darf (standardmäßig verweigert, wie die „present“-Kanäle ). runPageCommand nimmt Werte für diese als Objekt-IDs entgegen. Das Tool liest sie mit den Rechten des Benutzers ein, so wie „present“ dessen IDs ausliest (ein Objekt, das der Benutzer nicht lesen kann, wird abgelehnt), und bindet sie an die entsprechenden Eingabekanäle für den Befehl. Die Ausführbarkeit und die Zugriffsregeln des Befehls entscheiden dann über die gebundenen Werte genau wie bei einem Klick, und ein abgelehnter Befehl gibt den Grund dafür an. „pageCommands“ listet die einstellbaren Eingaben jedes Befehls mit ihren Beschreibungen auf.
Ob ein zugeordneter Wert nach dem Befehl auf dem Kanal verbleibt oder nur für den Befehl sichtbar ist, wird in der Implementierung festgelegt und im Artikel ai/chat-ui dokumentiert.
Verwendung
tl-factory (Gitea TopLogic/tl-factory #36, #41): Der Agent der Startseite öffnet das Git-Verbindungsformular für einen benannten Mandanten, den Chat des Programmieragenten für die von ihm übergebene Konversation und das Projekt, dessen Vorschau der Benutzer öffnen möchte.
Lösung
- Ein <agent-command> akzeptiert die optionale Eigenschaft „input-description“ (englisch, für das Modell): Für welches Objekt der Befehl bestimmt ist. Nur ein Befehl mit dieser Eigenschaft akzeptiert ein Objekt vom Agenten (standardmäßig abgelehnt); ein Objekt für einen Befehl ohne diese Eigenschaft wird abgelehnt.
- runPageCommand(command, input) nimmt die ID dieses Objekts entgegen. Das Tool liest sie mit den Rechten des Benutzers über dieselbe Auflösung wie „present“ (TidResolver mit dem Lesefilter; ein Objekt, das der Benutzer nicht lesen darf, wird abgelehnt) und führt den Befehl mit ihr als Hauptargument über ViewCommandModel.execute(context, input) aus (PageCommand.run(Object)) – so wie eine Tabellenzeile einen Befehl für ihre Zeile ausführt. Die Ausführbarkeit des Befehls und die Zugriffsregeln entscheiden über dieses Objekt genau wie bei einem Klick.
- Eine Ablehnung aufgrund der Befehlsregeln ist eine „ApplicationRefusal“ (#30166) mit dem Befehl, der Eingabe (nur wenn ein Objekt übergeben wurde) und den Gründen der Anwendung in der Sprache des Benutzers. Die tool-eigenen Ablehnungen (Objekt für einen Befehl, der keines erwartet, unbekanntes oder unlesbares Objekt, nicht aufgeführter Name, beschäftigt, keine Seite) sind englische Sätze.
- Der Wert ist nur bei dieser Ausführung des Befehls sichtbar und wird nicht in den Eingabekanal geschrieben, sodass ein Befehl keine Nebenwirkungen auf die Seite hat, die über die Wirkung seiner Kette hinausgehen (z. B. ein <show-views>, das das Argument an die geöffnete Ansicht bindet, oder ein <write-channel>, das es speichert).
- pageCommands listet für jeden Befehl auf, ob er ein Objekt erwartet, zusammen mit der entsprechenden Eingabebeschreibung.
- Ein Objekt pro Befehl. Mehrere Werte werden durch mehrere Befehle gesetzt: Ein Befehl schreibt sein Argument mit <write-channel> in einen Kanal, ein anderer liest diesen Kanal als seine Eingabe. Der Artikel ai/chat-ui beschreibt die Eingabe, das Ablehnungsformat und dieses Muster.
- Tests (TestPageCommandTool): Wenn ein Objekt vorhanden ist, erkennt der Befehl es; ein Objekt, das der Benutzer nicht lesen kann, wird abgelehnt; ein Objekt für einen Befehl ohne Eingabebeschreibung wird abgelehnt; eine Ausführbarkeitsregel, die das Objekt ablehnt, gibt den Grund dafür an.