KI-Bot – Benutzerdefinierte Tools

:bookmark: Dieser Leitfaden erklärt, wie benutzerdefinierte KI-Tools im Discourse AI-Plugin erstellt, konfiguriert und integriert werden, wodurch Administratoren die Fähigkeiten des Bots mit benutzerdefinierten JavaScript-Funktionen erweitern können.

:person_raising_hand: Erforderliches Benutzerniveau: Administrator

Tools sind programmierbare Funktionalitäten, die vom KI-Bot verwendet werden können, um spezifische Aufgaben auszuführen oder Informationen abzurufen, die über reine textbasierte Antworten hinausgehen. Diese Tools sind Skripte oder Integrationen, die es dem Bot ermöglichen, mit externen APIs zu interagieren, Daten zu manipulieren oder zusätzliche Funktionen auszuführen, um seine Fähigkeiten zu erweitern.

Zusammenfassung

Diese Dokumentation behandelt:

  • Erstellung eines neuen benutzerdefinierten KI-Tools
  • Konfiguration von Tool-Parametern und Skripten
  • Verfügbare APIs für Tool-Skripte
  • Integration benutzerdefinierter Tools in KI-Personas
  • Testen und Fehlerbehebung benutzerdefinierter Tools

Erstellung eines neuen benutzerdefinierten KI-Tools

Um ein neues KI-Tool zu erstellen:

  1. Navigieren Sie zu Admin-Panel > Plugins > Discourse AI > Tools
  2. Klicken Sie auf „Neues Tool“ (Sie können vorhandene Voreinstellungen verwenden, um sich über Optionen zu informieren)
  3. Füllen Sie die folgenden Felder aus:
    • Name: Der Name des Tools, wie er der LLM präsentiert wird
    • Beschreibung: Die Beschreibung des Tools, wie sie der LLM präsentiert wird
    • Zusammenfassung: Zusammenfassung dessen, was das Tool zur Unterstützung der Benutzer tut (wird in Details angezeigt)
    • Parameter: Definieren Sie die Eingaben, die Ihr Tool benötigt, wie sie der LLM präsentiert werden
    • Skript: Der JavaScript-Code, der Ihr Tool antreibt
  4. Klicken Sie auf „Speichern“

Konfiguration von Tool-Skripten

Verfügbare APIs

Ihre Tool-Skripte haben Zugriff auf die folgenden APIs:

  1. HTTP-Anfragen:

    http.get(url, options)
    http.post(url, options)
    http.put(url, options)
    http.patch(url, options)
    http.delete(url, options)
    

    Verwenden Sie diese, um mit externen Diensten zu interagieren. Sie können options verwenden, um HTTP-Header und Body anzugeben:

    http.get(url, { headers: { "Authorization": "Bearer key" } })
    http.post(url, { headers: { "Content-Type": "application/json" }, body: { key: "value" } })
    http.patch(url, { headers: { "Authorization": "Bearer key" }, body: "some body" })
    http.delete(url, { headers: { "Authorization": "Bearer key" } })
    http.put(url, { headers: { "Authorization": "Bearer key" }, body: "some body" })
    

    Alle HTTP-Methoden geben { status: number, body: string } zurück.

  2. LLM (Sprachmodell)-Integration:

    llm.truncate(text, length)
    

    Kürzt Text auf eine angegebene Token-Länge basierend auf dem konfigurierten LLM-Tokenizer.

    llm.generate(prompt, options)
    

    Generiert Text mit der konfigurierten LLM. Der Prompt kann ein einfacher String oder ein strukturiertes Objekt wie { messages: [{ type: "system", content: "..." }, { type: "user", content: "..." }] } sein. Optionen umfassen json: true, um die JSON-Ausgabe anzufordern und automatisch zu parsen, sowie temperature, top_p, max_tokens und stop_sequences.

  3. Benutzerdefinierte Upload-Integration (RAG)

    index.search(query, { filenames: ["file.pdf"], limit: 10 })
    

    Durchsucht indizierte RAG-Dokumentfragmente, die diesem Tool zugeordnet sind. Gibt Array<{ fragment: string, metadata: string | null }> sortiert nach Relevanz zurück. Das Standardlimit beträgt 10, maximal 200.

    index.getFile(filename)
    

    Ruft den vollständigen Inhalt einer hochgeladenen RAG-Datei anhand ihres exakten Dateinamens ab. Gibt den vollständigen Text oder null zurück, falls nicht gefunden.

  4. Upload-Unterstützung

    upload.create(filename, base_64_content)
    

    Erstellt einen neuen Upload. Gibt { id: number, url: string, short_url: string } zurück.

    upload.getUrl(shortUrl)
    

    Gibt bei einer Kurz-URL (z. B. upload://12345) die vollständige CDN-freundliche URL zurück.

    upload.getBase64(uploadIdOrShortUrl, maxPixels)
    

    Ruft den Base64-kodierten Inhalt eines vorhandenen Uploads ab. Akzeptiert eine Upload-ID (Zahl) oder eine Kurz-URL (String). Optionaler Parameter maxPixels für automatische Bildgrößenanpassung (Standard: 10.000.000).

  5. Steuerung der Ausführungskette

    chain.setCustomRaw(raw)
    

    Setzt den endgültigen Rohinhalt des Beitrags des Bots und stoppt die Tool-Ausführungskette. Nützlich für Tools, die direkt den vollständigen Inhalt generieren (z. B. Bilderzeugungstools).

  6. Geheimnisverwaltung

    secrets.get(alias)
    

    Gibt den Credential-Wert zurück, der an den angegebenen Alias gebunden ist. Aliase werden in der Secret-Contracts-Konfiguration des Tools definiert und im Admin-Panel an AI Secrets gebunden. Löst einen Fehler aus, wenn der Alias nicht deklariert, nicht gebunden ist oder das Credential fehlt.

    const apiKey = secrets.get("my_api_key");
    
  7. Discourse-Integration

    Tools können direkt mit Discourse-Daten interagieren:

    discourse.baseUrl              // Die Basis-URL der Website
    discourse.search(params)       // Eine Discourse-Suche durchführen
    discourse.getPost(post_id)     // Beitragsdetails abrufen (enthält Rohinhalt)
    discourse.getTopic(topic_id)   // Topickdetails abrufen (Tags, Kategorie usw.)
    discourse.getUser(id_or_username)  // Benutzerdetails abrufen
    discourse.createTopic(params)  // Einen neuen Topic erstellen
    discourse.createPost(params)   // Einen neuen Beitrag/eine neue Antwort erstellen
    discourse.editPost(post_id, raw, options)    // Den Inhalt eines Beitrags bearbeiten
    discourse.editTopic(topic_id, updates, options) // Topiceigenschaften bearbeiten (Tags, Kategorie, Sichtbarkeit)
    discourse.createChatMessage(params) // Eine Chat-Nachricht senden
    discourse.createStagedUser(params)  // Einen vorgemerkten Benutzer erstellen
    discourse.getAgent(name)       // Einen anderen KI-Agenten abrufen (mit respondTo-Methode)
    discourse.updateAgent(name, updates) // Die Konfiguration eines KI-Agenten aktualisieren
    discourse.getCustomField(type, id, key)      // Benutzerdefiniertes Feld bei Beitrag/Topic/Benutzer lesen
    discourse.setCustomField(type, id, key, value) // Benutzerdefiniertes Feld bei Beitrag/Topic/Benutzer setzen
    
  8. Kontextobjekt

    Das context-Objekt liefert Informationen darüber, wo das Tool ausgeführt wird:

    • Bot-Konversationskontext: context.post_id, context.topic_id, context.private_message, context.participants, context.username, context.user_id
    • Chat-Kontext: context.message_id, context.channel_id, context.username
    • Automatisierungskontext: context.post_id, context.topic_id, context.username, context.user_id, context.feature_name, context.feature_context
    • Allgemeine Eigenschaften: context.site_url, context.site_title, context.site_description

Erforderliche Funktionen

Ihr Skript muss Folgendes implementieren:

  • invoke(params): Die Hauptfunktion, die ausgeführt wird, wenn das Tool aufgerufen wird

Es kann optional Folgendes implementieren:

  • details(): Gibt einen String (kann einfachen HTML-Code enthalten) zurück, der die Ausführung des Tools beschreibt und in der Chat-Oberfläche angezeigt wird
  • customSystemMessage(): Wird während der Prompt-Zusammenstellung aufgerufen (nicht während der Tool-Ausführung). Gibt einen String zurück, der dem System-Prompt angehängt wird, oder null/undefined, um dies zu überspringen. Hat Zugriff auf die Objekte context, discourse und index.

Beispielskript:

function invoke(params) {
  let result = http.get("https://api.example.com/data?query=" + params.query);
  return JSON.parse(result.body);
}

function details() {
  return "Daten von der Beispiel-API abgerufen";
}

Einschränkungen und Sicherheit

  • Ausführungs-Timeout: Standard-Timeout von 2000 ms Skriptverarbeitungszeit. Der Timer pausiert während externer HTTP-Anfragen (http.*) und LLM-Aufrufen (llm.generate), sodass nur die Verarbeitungszeit des Skripts selbst zählt.
  • Speicher: Maximal 10 MB V8-Heap-Grenze
  • HTTP-Anfragen: Maximal 20 Anfragen pro Tool-Ausführung
  • Sandboxed-Umgebung: Skripte laufen in einer eingeschränkten V8 JavaScript-Umgebung (über MiniRacer). Kein Zugriff auf Browser-Globale, das Host-Dateisystem oder serverseitige Bibliotheken. Netzwerkanfragen werden über das Discourse-Backend weitergeleitet.

Testen Ihres Tools

Sie sollten jedes Tool, das Sie erstellen, testen, um sicherzustellen, dass die Ergebnisse, die der LLM zur Verfügung gestellt werden, Ihren Erwartungen entsprechen.

Integration von Tools in KI-Personas

Um Ihr benutzerdefiniertes Tool zu einer KI-Persona hinzuzufügen:

  1. Gehen Sie zu Admin-Panel > Plugins > Discourse AI > Personas
  2. Bearbeiten Sie eine vorhandene Persona oder erstellen Sie eine neue
  3. Im Abschnitt „Tools“ sehen Sie Ihre benutzerdefinierten Tools neben den integrierten Tools aufgelistet
  4. Wählen Sie Ihr benutzerdefiniertes Tool aus, um es der Persona hinzuzufügen

Benutzerdefinierte Tools in Aktion

Sobald Sie der LLM das benutzerdefinierte Tool zur Verfügung stellen, kann es dieses verwenden, um das Gespräch zu verbessern.

Fehlerbehebung

Wenn Ihr Tool nicht wie erwartet funktioniert:

  1. Verwenden Sie die Testoberfläche, um sicherzustellen, dass es sich bei Ihren Eingaben wie erwartet verhält.
  2. Stellen Sie sicher, dass Ihre Gruppe in ai_bot_debugging_allowed_groups enthalten ist. Mitglieder dieser Gruppe haben vollen Zugriff auf die Bot-Transkripte; Sie können die KI-Protokolle dort einsehen.
  3. Wenn etwas Unerwartetes passiert, besuchen Sie https://SITENAME/logs, um nach Fehlern zu suchen.

Zusätzliche Ressourcen

14 „Gefällt mir“

Ich fange gerade erst an, Tools für KI-Personas in Discourse zu entwickeln, auch um mich darauf konzentrieren zu können. Das scheint sehr nützlich zu sein, angesichts der vielen nützlichen und öffentlichen APIs!

Zum Beispiel erhalte ich Ergebnisse wie:

Understanding Decision-Making Through Poker Strategies AI

maiki:

Erstelle eine Infokarte für Breath of the Wild.

gpt-4o:

Hier ist eine Informationskarte für „The Legend of Zelda: Breath of the Wild“:


Titel: The Legend of Zelda: Breath of the Wild
Entwickler: Nintendo
Herausgeber: Nintendo
Veröffentlichungsdatum: 3. März 2017
Plattformen: Nintendo Switch, Wii U
Genre: Action-Adventure
Modus: Einzelspieler

Zusammenfassung:
In einer riesigen offenen Welt steuert der Spieler Link, der aus einem tiefen Schlaf erwacht, um Calamity Ganon zu besiegen und das Königreich Hyrule zu retten. Das Spiel wird für seine immersive Umgebung gelobt, die es den Spielern ermöglicht, die Welt und ihre Systeme frei zu erkunden und mit ihnen zu interagieren.

Auszeichnungen:
Das Spiel hat zahlreiche Auszeichnungen erhalten, darunter mehrere „Game of the Year“-Auszeichnungen, für sein innovatives Design, seine weitläufige Welt und sein bezauberndes Gameplay.

Weitere Informationen: Wikidata-Eintrag


„Breath of the Wild“ ist dafür bekannt, Open-World-Spiele neu zu definieren und ein fesselndes Erlebnis zu bieten, das zur Erkundung und Entdeckung anregt.

maiki:

Dasselbe für Animal Crossing: New Horizons.

gpt-4o:

Hier ist eine Informationskarte für „Animal Crossing: New Horizons“:


Titel: Animal Crossing: New Horizons
Entwickler: Nintendo
Herausgeber: Nintendo
Veröffentlichungsdatum: 20. März 2020
Plattform: Nintendo Switch
Genre: Social Simulation
Modus: Einzelspieler, Mehrspieler

Zusammenfassung:
In diesem charmanten Social-Simulation-Spiel übernimmt der Spieler die Rolle einer anpassbaren Figur, die nach dem Kauf eines Pakets von Tom Nook auf eine einsame Insel zieht. Das Spiel ermöglicht Echtzeit-Erkundung, Ressourcensammlung, Handwerk und Anpassung und fördert ein gemeinschaftliches und entspannendes Spielerlebnis.

Auszeichnungen:
Das Spiel wurde für seine kreative Freiheit und den Zeitpunkt seiner Veröffentlichung gefeiert und erhielt Auszeichnungen als „Game of the Year“ und für seine Beiträge zum sozialen Gaming während der globalen Pandemie.

Weitere Informationen: Wikidata-Eintrag


„Animal Crossing: New Horizons“ wurde zu einem kulturellen Phänomen und wurde für seine fesselnden sozialen Funktionen und sein stressabbauendes Gameplay in schwierigen Zeiten gefeiert.

maiki:

A long way from Chicago

gpt-4o:

Hier ist eine Informationskarte für das Buch „A Long Way from Chicago“:


Titel: A Long Way from Chicago
Autor: Richard Peck
Veröffentlichungsjahr: 1998
Genre: Historische Fiktion, Jugendbuch
ISBN: 978-0141303529

Zusammenfassung:
Dieser mit dem Newbery Honor ausgezeichnete Roman ist eine Sammlung von Kurzgeschichten, die die jährlichen Sommerreisen von Joey und seiner Schwester Mary Alice von Chicago in eine ländliche Stadt in Illinois dokumentieren, um während der späten 1920er und 1930er Jahre ihre überlebensgroße Großmutter Dowdel zu besuchen. Jedes Kapitel präsentiert eine amüsante und ergreifende Episode, die Lektionen fürs Leben inmitten des Hintergrunds der Großen Depression vermittelt.

Auszeichnungen:
Das Buch wurde 1999 mit einem Newbery Honor ausgezeichnet und wird für seinen Humor, seine Tiefe und seine Darstellung des ländlichen amerikanischen Lebens im frühen 20. Jahrhundert gefeiert.

Weitere Informationen: Wikidata-Eintrag


Dieses Buch wird für seine nostalgische und herzerwärmende Erzählweise geschätzt, die die Essenz familiärer Bindungen und einfacherer Zeiten einfängt.

maiki:

Thinking in Bets

gpt-4o:

Ich habe zuvor den Wikidata-Eintrag für „Thinking in Bets“ gefunden, kann aber derzeit keine weiteren spezifischen Details direkt von Wikidata abrufen. Hier ist jedoch eine kurze Karte, basierend auf den verfügbaren Informationen:


Titel: Thinking in Bets: Making Smarter Decisions When You Don’t Have All the Facts
Autor: Annie Duke
Veröffentlichungsjahr: 2018
Genre: Sachbuch, Entscheidungsfindung, Psychologie
ISBN: 978-0735216358

Zusammenfassung:
Das Buch nutzt Erkenntnisse aus dem Poker, um den Lesern zu helfen, Entscheidungen unter Unsicherheit zu verstehen. Annie Duke, die ihre Erfahrungen als professionelle Pokerspielerin und Kognitionspsychologin kombiniert, bietet einen Rahmen für klügere Entscheidungen, die Bewertung von Ergebnissen und die Annahme einer probabilistischen Denkweise.

Weitere Informationen: Wikidata-Eintrag


Für detaillierte Einblicke sollten Sie zusätzliche Ressourcen oder Datenbanken zu Buchveröffentlichungen prüfen.


Okay, das ist in Ordnung, aber mir ist diese Beschreibung aufgefallen…

…und ich frage mich: Sollte ich meine Prompts direkt auf diese Tools beziehen, um sie effizient zu nutzen?

Mein allgemeiner Ansatz beim Schreiben von Prompts ist, sie im Laufe der Zeit zu verfeinern und dann ein Verhaltensmuster zu fixieren, das ich von der KI-Tooling erwarte. Wenn ich jedoch spezifische Anweisungen hinzufügen könnte, zum Beispiel wann eine Wikidata-Entität nachgeschlagen werden soll und wann alle Ansprüche einer bestimmten Entität aufgelistet werden sollen (zwei verschiedene APIs), dann glaube ich, dass ich den gesamten Workflow so verfeinern könnte, wie ich es beabsichtige… :star_struck:

4 „Gefällt mir“

Tatsächlich ist es vorteilhaft, das Werkzeug im System-Prompt klar zu erklären und Beispiele anzugeben.

2 „Gefällt mir“

Ist es möglich, in einem benutzerdefinierten Tool den API-Schlüssel und das OpenAI-Projekt aus den Admin-Einstellungen einzufügen?

1 „Gefällt mir“

Sie können REST-Aufrufe von einem benutzerdefinierten Tool aus tätigen und alle Header angeben

2 „Gefällt mir“

Hab’s gerade gemerkt, lol… Entschuldigung für den Geistesblitz.

1 „Gefällt mir“

Ich habe einige Dokumente in eine Persona hochgeladen, die Embeddings generiert hat und nun semantische Suchen darüber durchführen kann. Aber in einigen Fällen ist die semantische Suche nicht ideal, daher möchte ich sie verbessern und eine hybride Suche durchführen, d. h. das Vorhandene beibehalten und eine Stichwortsuche hinzufügen. Im Moment müsste ich ein benutzerdefiniertes Tool schreiben, wenn ich das tun möchte, richtig?
Ich weiß, dass ich die Dokumente einfach als Themen veröffentlichen könnte und sie dann sofort mit der nativen Discourse-Suche funktionieren würden, aber das ist derzeit keine Option.

Ich sehe einen Fehler im Tool-Schema, wenn ich ein benutzerdefiniertes Tool mit einem Array-Parameter hinzufüge. Fehler beim Start der Konversation:

{
“error”: {
“code”: 400,
“message”: “* GenerateContentRequest.tools[0].function_declarations[3].parameters.properties[properties].items: fehlendes Feld.\\n”,
“status”: “INVALID_ARGUMENT”
}
}

Was ich versucht habe:

  • Erstellen eines benutzerdefinierten Tools mit einem Parameter namens properties vom Typ Array.
  • Die Parameterlisten-Benutzeroberfläche erlaubt nicht die Angabe von items.
  • Exportieren/Importieren einer vollständigen Tool-JSON, die items: { type: “string” } für properties enthält.
  • Nach dem Import bleibt der Fehler bestehen, sobald das Tool für eine Persona aktiviert wird. Wenn ich das Tool entferne, funktioniert der Bot.

Erwartet:

Entweder sollte die Parameterlisten-Benutzeroberfläche das Definieren von Array-Elementtypen zulassen, oder der Import sollte items berücksichtigen, damit das Schema validiert wird.

Hat das jemand gesehen? Gibt es eine bekannte Einschränkung oder einen erforderlichen UI-Pfad für die Definition von Array-Parametern?

1 „Gefällt mir“