defineLogicFunction
Logikfunktionen und deren Trigger definieren
defineLogicFunction
Logikfunktionen und deren Trigger definieren
Jede Funktionsdatei verwendet Verfügbare Trigger-Typen:Der Typ
Greifen Sie in Ihrem Handler wie folgt auf die weitergeleiteten Header zu:Hauptpunkte:
defineLogicFunction(), um eine Konfiguration mit einem Handler und optionalen Triggern zu exportieren.src/logic-functions/createPostCard.logic-function.ts
- httpRoute: Stellt Ihre Funktion unter einem HTTP-Pfad und einer Methode unter dem Endpunkt
/s/bereit:
z. B.path: '/post-card/create'ist unterhttps://your-twenty-server.com/s/post-card/createaufrufbar
- cron: Führt Ihre Funktion nach Zeitplan mithilfe eines CRON-Ausdrucks aus.
- databaseEvent: Wird bei Lebenszyklusereignissen von Workspace-Objekten ausgeführt. Wenn die Ereignisoperation
updatedist, können bestimmte zu überwachende Felder im ArrayupdatedFieldsangegeben werden. Wenn das Array undefiniert oder leer ist, löst jede Aktualisierung die Funktion aus.
z. B.person.updated,*.created,company.*
Sie können eine Funktion auch manuell über die CLI ausführen:Sie können Protokolle mit folgendem Befehl ansehen:
Routen-Trigger-Payload
Wenn ein Route-Trigger Ihre Logikfunktion aufruft, erhält sie einRoutePayload-Objekt, das dem AWS-HTTP-API-v2-Format folgt.
Importieren Sie den Typ RoutePayload aus twenty-sdk:RoutePayload hat die folgende Struktur:| Eigenschaft | Typ | Beschreibung | Beispiel |
|---|---|---|---|
headers | Record\<string, string | undefined> | HTTP-Header (nur die in forwardedRequestHeaders aufgelisteten) | siehe Abschnitt unten |
queryStringParameters | Record\<string, string | undefined> | Query-String-Parameter (mehrere Werte mit Kommas verbunden) | /users?ids=1&ids=2&ids=3&name=Alice -> { ids: '1,2,3', name: 'Alice' } |
pathParameters | Record\<string, string | undefined> | Aus dem Routenmuster extrahierte Pfadparameter | /users/:id, /users/123 -> { id: '123' } |
body | object | null | Geparster Request-Body (JSON) | { id: 1 } -> { id: 1 } |
isBase64Encoded | boolean | Gibt an, ob der Body Base64-codiert ist | |
requestContext.http.method | Zeichenkette | HTTP-Methode (GET, POST, PUT, PATCH, DELETE) | |
requestContext.http.path | Zeichenkette | Rohpfad der Anfrage |
forwardedRequestHeaders
Standardmäßig werden HTTP-Header von eingehenden Anfragen aus Sicherheitsgründen nicht an Ihre Logikfunktion weitergegeben. Um auf bestimmte Header zuzugreifen, listen Sie diese im ArrayforwardedRequestHeaders auf:Header-Namen werden in Kleinbuchstaben normalisiert. Greifen Sie mit Schlüsseln in Kleinbuchstaben darauf zu (z. B.
event.headers['content-type']).Eine Funktion als Tool bereitstellen
Logikfunktionen können als Tools für KI-Agenten und Workflows verfügbar gemacht werden. Wenn eine Funktion als Tool markiert ist, wird sie von den KI-Funktionen von Twenty auffindbar und kann in Workflow-Automatisierungen verwendet werden.Um eine Logikfunktion als Tool zu markieren, setzen SieisTool: true:src/logic-functions/enrich-company.logic-function.ts
- Sie können
isToolmit Triggern kombinieren — eine Funktion kann gleichzeitig sowohl ein Tool (von KI-Agenten aufrufbar) als auch durch Ereignisse ausgelöst werden. toolInputSchema(optional): Ein JSON-Schema-Objekt, das die Parameter beschreibt, die Ihre Funktion akzeptiert. Das Schema wird automatisch durch statische Analyse des Quellcodes ermittelt, Sie können es jedoch auch explizit festlegen:
Schreiben Sie eine gute
description. KI-Agenten verlassen sich auf das description-Feld der Funktion, um zu entscheiden, wann das Tool verwendet werden soll. Seien Sie konkret darin, was das Tool tut und wann es aufgerufen werden soll.definePostInstallLogicFunction
Eine Post-Installations-Logikfunktion definieren (eine pro App)
definePostInstallLogicFunction
Eine Post-Installations-Logikfunktion definieren (eine pro App)
Eine Post-Installationsfunktion ist eine Logikfunktion, die automatisch ausgeführt wird, nachdem Ihre App in einem Arbeitsbereich installiert wurde. Der Server führt sie nach der Synchronisierung der Metadaten der App und der Generierung des SDK-Clients aus, sodass der Arbeitsbereich vollständig einsatzbereit ist und das neue Schema bereitsteht. Typische Anwendungsfälle umfassen das Befüllen von Standarddaten, das Erstellen anfänglicher Datensätze, das Konfigurieren von Arbeitsbereichseinstellungen oder das Bereitstellen von Ressourcen bei Diensten von Drittanbietern.Sie können die Post-Installationsfunktion auch jederzeit manuell über die CLI ausführen:Hauptpunkte:
src/logic-functions/post-install.ts
- Post-Installationsfunktionen verwenden
definePostInstallLogicFunction()— eine spezialisierte Variante, die Trigger-Einstellungen (cronTriggerSettings,databaseEventTriggerSettings,httpRouteTriggerSettings,isTool) weglässt. - Der Handler erhält ein
InstallPayloadmit{ previousVersion?: string; newVersion: string }—newVersionist die zu installierende Version, undpreviousVersionist die zuvor installierte Version (oderundefinedbei einer Neuinstallation). Verwenden Sie diese Werte, um Neuinstallationen von Upgrades zu unterscheiden und versionsspezifische Migrationslogik auszuführen. - Wann der Hook ausgeführt wird: standardmäßig nur bei Neuinstallationen. Übergeben Sie
shouldRunOnVersionUpgrade: true, wenn er auch beim Upgrade der App von einer vorherigen Version ausgeführt werden soll. Wenn weggelassen, ist das Flag standardmäßigfalseund Upgrades überspringen den Hook. - Ausführungsmodell — standardmäßig asynchron, synchron optional: Das Flag
shouldRunSynchronouslysteuert, wie Post-Install ausgeführt wird.shouldRunSynchronously: false(Standard) — der Hook wird in die Nachrichtenwarteschlange eingereiht mitretryLimit: 3und läuft asynchron in einem Worker. Die Installationsantwort kommt zurück, sobald der Job eingereiht ist, sodass ein langsamer oder fehlschlagender Handler den Aufrufer nicht blockiert. Der Worker versucht es bis zu dreimal erneut. Verwenden Sie dies für lang laufende Jobs — das Befüllen großer Datensätze, Aufrufe langsamer Drittanbieter-APIs, Bereitstellung externer Ressourcen, alles, was ein vernünftiges HTTP-Antwortfenster überschreiten könnte.shouldRunSynchronously: true— der Hook wird inline während des Installationsablaufs ausgeführt (gleicher Executor wie bei Pre-Install). Die Installationsanforderung blockiert, bis der Handler fertig ist, und wenn er einen Fehler wirft, erhält der Installationsaufrufer einenPOST_INSTALL_ERROR. Keine automatischen Wiederholungen. Verwenden Sie dies für schnelle Aufgaben, die vor der Antwort abgeschlossen sein müssen — z. B. um dem Benutzer einen Validierungsfehler auszugeben oder für eine schnelle Einrichtung, auf die der Client unmittelbar nach der Rückkehr des Installationsaufrufs angewiesen ist. Beachten Sie, dass die Metadatenmigration bereits angewendet wurde, wenn Post-Install läuft, sodass ein Fehler im Synchronmodus die Schemaänderungen nicht rückgängig macht — er zeigt lediglich den Fehler an.
- Stellen Sie sicher, dass Ihr Handler idempotent ist. Im asynchronen Modus kann die Warteschlange bis zu dreimal erneut versuchen; in beiden Modi kann der Hook bei Upgrades erneut laufen, wenn
shouldRunOnVersionUpgrade: true. - Die Umgebungsvariablen
APPLICATION_ID,APP_ACCESS_TOKENundAPI_URLsind im Handler verfügbar (wie bei jeder anderen Logikfunktion), sodass Sie die Twenty API mit einem auf Ihre App beschränkten Anwendungszugriffstoken aufrufen können. - Pro Anwendung ist nur eine Post-Installationsfunktion zulässig. Der Manifest-Build schlägt fehl, wenn mehr als eine erkannt wird.
- Die
universalIdentifier,shouldRunOnVersionUpgradeundshouldRunSynchronouslyder Funktion werden während des Builds automatisch dem Anwendungsmanifest unter dem FeldpostInstallLogicFunctionhinzugefügt — Sie müssen sie indefineApplication()nicht referenzieren. - Das standardmäßige Timeout ist auf 300 Sekunden (5 Minuten) festgelegt, um längere Einrichtungsvorgänge wie Daten-Seeding zu ermöglichen.
- Nicht im Dev-Modus ausgeführt: Wenn eine App lokal registriert ist (über
yarn twenty dev), überspringt der Server den Installationsablauf vollständig und synchronisiert Dateien direkt über den CLI-Watcher — daher läuft Post-Install im Dev-Modus nie, unabhängig vonshouldRunSynchronously. Verwenden Sieyarn twenty exec --postInstall, um es manuell gegen einen laufenden Workspace auszulösen.
definePreInstallLogicFunction
Eine Pre-Installations-Logikfunktion definieren (eine pro App)
definePreInstallLogicFunction
Eine Pre-Installations-Logikfunktion definieren (eine pro App)
Eine Pre-Install-Funktion ist eine Logikfunktion, die automatisch während der Installation ausgeführt wird, bevor die Metadatenmigration des Workspaces angewendet wird. Sie hat die gleiche Payload-Struktur wie Post-Install (Sie können die Pre-Installationsfunktion auch jederzeit manuell über die CLI ausführen:Hauptpunkte:
InstallPayload), ist aber früher im Installationsablauf positioniert, sodass sie Zustände vorbereiten kann, von denen die bevorstehende Migration abhängt — typische Anwendungsfälle sind das Sichern von Daten, die Validierung der Kompatibilität mit dem neuen Schema oder das Archivieren von Datensätzen, die umstrukturiert oder entfernt werden sollen.src/logic-functions/pre-install.ts
- Pre-Install-Funktionen verwenden
definePreInstallLogicFunction()— dieselbe spezialisierte Konfiguration wie bei Post-Install, nur an einen anderen Lifecycle-Slot gebunden. - Sowohl Pre- als auch Post-Install-Handler erhalten denselben
InstallPayload-Typ:{ previousVersion?: string; newVersion: string }. Importieren Sie ihn einmal und verwenden Sie ihn für beide Hooks wieder. - Wann der Hook ausgeführt wird: positioniert direkt vor der Metadatenmigration des Workspaces (
synchronizeFromManifest). Vor der Ausführung führt der Server einen rein additiven “pared-down sync” durch, der die Pre-Install-Funktion der neuen Version in den Workspace-Metadaten registriert — sonst wird nichts angefasst — und führt sie dann aus. Da dieser Sync nur additiv ist, sind die Objekte, Felder und Daten der vorherigen Version noch intakt, wenn Ihr Handler läuft: Sie können den Zustand vor der Migration gefahrlos lesen und sichern. - Ausführungsmodell: Pre-Install wird synchron ausgeführt und blockiert die Installation. Wenn der Handler einen Fehler wirft, wird die Installation abgebrochen, bevor Schemaänderungen angewendet werden — der Workspace verbleibt in der vorherigen Version in einem konsistenten Zustand. Das ist beabsichtigt: Pre-Install ist Ihre letzte Chance, ein riskantes Upgrade abzulehnen.
- Wie bei Post-Install ist pro Anwendung nur eine Pre-Installationsfunktion zulässig. Sie wird während des Builds automatisch dem Anwendungsmanifest unter
preInstallLogicFunctionhinzugefügt. - Nicht im Dev-Modus ausgeführt: wie bei Post-Install — der Installationsablauf wird für lokal registrierte Apps vollständig übersprungen, daher läuft Pre-Install unter
yarn twenty devnie. Verwenden Sieyarn twenty exec --preInstall, um es manuell auszulösen.
Pre-Install vs. Post-Install: wann was verwenden
Den richtigen Installations-Hook wählen
Pre-Install vs. Post-Install: wann was verwenden
Den richtigen Installations-Hook wählen
Beide Hooks sind Teil desselben Installationsablaufs und erhalten dasselbe Pre-Install ist immer synchron (blockiert die Installation und kann sie abbrechen). Post-Install ist standardmäßig asynchron — in einen Worker eingereiht mit automatischen Wiederholungen — kann aber per Verwenden Sie Faustregel:
InstallPayload. Der Unterschied besteht darin, wann sie relativ zur Metadatenmigration des Workspaces ausgeführt werden, und das ändert, auf welche Daten sie gefahrlos zugreifen können.shouldRunSynchronously: true in die synchrone Ausführung wechseln. Siehe das Akkordeon zu definePostInstallLogicFunction oben, wann welcher Modus zu verwenden ist.Verwenden Sie post-install für alles, wofür das neue Schema existieren muss. Dies ist der Regelfall:- Standarddaten befüllen (Anlegen anfänglicher Datensätze, Standardansichten, Demo-Inhalte) für neu hinzugefügte Objekte und Felder.
- Registrieren von Webhooks bei Drittanbieter-Diensten, jetzt, da die App ihre Anmeldedaten hat.
- Aufrufen Ihrer eigenen API, um eine Einrichtung abzuschließen, die von den synchronisierten Metadaten abhängt.
- Idempotente “Stelle sicher, dass dies existiert”-Logik, die bei jedem Upgrade den Zustand abgleichen soll — kombinieren Sie dies mit
shouldRunOnVersionUpgrade: true.
PostCard-Datensatz anlegen:src/logic-functions/post-install.ts
pre-install, wenn eine Migration ansonsten vorhandene Daten löschen oder beschädigen würde. Da Pre-Install gegen das vorherige Schema läuft und ein Fehlschlag das Upgrade zurückrollt, ist es der richtige Ort für alles Riskante:- Sichern von Daten, die gleich gelöscht oder umstrukturiert werden — z. B. Sie entfernen in v2 ein Feld und müssen dessen Werte vor der Migration in ein anderes Feld kopieren oder in einen Speicher exportieren.
- Archivieren von Datensätzen, die eine neue Einschränkung ungültig machen würde — z. B. ein Feld wird
NOT NULLund Sie müssen zuerst Zeilen mit Null-Werten löschen oder korrigieren. - Kompatibilität validieren und das Upgrade ablehnen, wenn die aktuellen Daten nicht sauber migriert werden können — werfen Sie im Handler einen Fehler, und die Installation wird ohne Änderungen abgebrochen. Das ist sicherer, als die Inkompatibilität mitten in der Migration zu entdecken.
- Daten umbenennen oder Schlüssel neu zuweisen vor einer Schemaänderung, bei der sonst die Zuordnung verloren ginge.
src/logic-functions/pre-install.ts
| You want to… | Verwenden |
|---|---|
| Standarddaten befüllen, den Workspace konfigurieren, externe Ressourcen registrieren | post-install |
| Lang laufendes Seeding oder Drittanbieteraufrufe ausführen, die die Installationsantwort nicht blockieren sollten | post-install (Standard — shouldRunSynchronously: false, mit Worker-Wiederholungen) |
| Schnelle Einrichtung ausführen, auf die sich der Aufrufer unmittelbar nach der Rückkehr des Installationsaufrufs verlassen wird | post-install mit shouldRunSynchronously: true |
| Daten lesen oder sichern, die bei der bevorstehenden Migration verloren gingen | pre-install |
| Ein Upgrade ablehnen, das vorhandene Daten beschädigen würde | pre-install (throw im Handler) |
| Bei jedem Upgrade einen Abgleich ausführen | post-install mit shouldRunOnVersionUpgrade: true |
| Einmalige Einrichtung nur bei der ersten Installation durchführen | post-install mit shouldRunOnVersionUpgrade: false (Standard) |
Im Zweifel auf Post-Install setzen. Greifen Sie nur zu Pre-Install, wenn die Migration selbst destruktiv ist und Sie den vorherigen Zustand abfangen müssen, bevor er verloren geht.
Typisierte API-Clients (twenty-client-sdk)
Das Pakettwenty-client-sdk stellt zwei typisierte GraphQL-Clients bereit, um aus Ihren Logikfunktionen und Frontend-Komponenten mit der Twenty-API zu interagieren.
| Client | Importieren | Endpunkt | Generiert? |
|---|---|---|---|
CoreApiClient | twenty-client-sdk/core | /graphql — Arbeitsbereichsdaten (Datensätze, Objekte) | Ja, zur Entwicklungs-/Build-Zeit |
MetadataApiClient | twenty-client-sdk/metadata | /metadata — Arbeitsbereichskonfiguration, Datei-Uploads | Nein, wird vorgefertigt ausgeliefert |
CoreApiClient
Arbeitsbereichsdaten (Datensätze, Objekte) abfragen und ändern
CoreApiClient
Arbeitsbereichsdaten (Datensätze, Objekte) abfragen und ändern
Der Der Client verwendet eine Selection-Set-Syntax: Übergeben Sie
CoreApiClient ist der Haupt-Client zum Abfragen und Ändern von Arbeitsbereichsdaten. Er wird während yarn twenty dev oder yarn twenty build aus Ihrem Arbeitsbereichsschema generiert und ist daher vollständig typisiert, passend zu Ihren Objekten und Feldern.true, um ein Feld einzuschließen, verwenden Sie __args für Argumente, und verschachteln Sie Objekte für Relationen. Sie erhalten vollständige Autovervollständigung und Typprüfung basierend auf Ihrem Arbeitsbereichsschema.Der CoreApiClient wird zur Entwicklungs-/Build-Zeit generiert. Wenn Sie ihn verwenden, ohne zuvor
yarn twenty dev oder yarn twenty build ausgeführt zu haben, wird ein Fehler ausgelöst. Die Generierung erfolgt automatisch — die CLI inspiziert das GraphQL-Schema Ihres Arbeitsbereichs und erzeugt mit @genql/cli einen typisierten Client.Verwendung von CoreSchema für Typannotationen
CoreSchema stellt TypeScript-Typen bereit, die Ihren Arbeitsbereichsobjekten entsprechen — nützlich zum Typisieren von Komponentenzustand oder Funktionsparametern:MetadataApiClient
Konfiguration des Arbeitsbereichs, Anwendungen und Dateiuploads
MetadataApiClient
Konfiguration des Arbeitsbereichs, Anwendungen und Dateiuploads
MetadataApiClient ist im SDK bereits vorgefertigt enthalten (keine Generierung erforderlich). Er fragt den Endpunkt /metadata nach Arbeitsbereichskonfiguration, Anwendungen und Datei-Uploads ab.Dateien hochladen
DerMetadataApiClient enthält eine Methode uploadFile, um Dateien an Felder des Typs Datei anzuhängen:| Parameter | Typ | Beschreibung |
|---|---|---|
fileBuffer | Buffer | Der Rohinhalt der Datei |
filename | Zeichenkette | Der Name der Datei (wird für Speicherung und Anzeige verwendet) |
contentType | Zeichenkette | MIME-Typ (standardmäßig application/octet-stream, wenn weggelassen) |
fieldMetadataUniversalIdentifier | Zeichenkette | Der universalIdentifier des Dateityp-Felds in Ihrem Objekt |
- Sie verwendet den
universalIdentifierdes Feldes (nicht dessen arbeitsbereichsspezifische ID), sodass Ihr Upload-Code in jedem Arbeitsbereich funktioniert, in dem Ihre App installiert ist. - Die zurückgegebene
urlist eine signierte URL, mit der Sie auf die hochgeladene Datei zugreifen können.
Wenn Ihr Code auf Twenty ausgeführt wird (Logikfunktionen oder Frontend-Komponenten), injiziert die Plattform Anmeldedaten als Umgebungsvariablen:
TWENTY_API_URL— Basis-URL der Twenty-APITWENTY_APP_ACCESS_TOKEN— Kurzlebiger Schlüssel, der auf die Standard-Funktionsrolle Ihrer Anwendung begrenzt ist
process.env. Die Berechtigungen des API-Schlüssels werden durch die Rolle bestimmt, auf die in defaultRoleUniversalIdentifier in Ihrer application-config.ts verwiesen wird.