Funcțiile de logică sunt funcții TypeScript pe partea de server care rulează pe platforma Twenty. Acestea pot fi declanșate de solicitări HTTP, programări cron sau evenimente din baza de date — și pot fi, de asemenea, expuse ca instrumente pentru agenți AI.Documentation Index
Fetch the complete documentation index at: https://docs.twenty.com/llms.txt
Use this file to discover all available pages before exploring further.
defineLogicFunction
Definiți funcții logice și declanșatoarele acestora
defineLogicFunction
Definiți funcții logice și declanșatoarele acestora
defineLogicFunction() pentru a exporta o configurație cu un handler și declanșatoare opționale.- httpRoute: Expune funcția pe o cale și metodă HTTP sub endpoint-ul
/s/:
de ex.path: '/post-card/create'este apelabil lahttps://your-twenty-server.com/s/post-card/create
- cron: Rulează funcția pe un program folosind o expresie CRON.
- databaseEvent: Rulează la evenimentele ciclului de viață ale obiectelor din spațiul de lucru. Când operațiunea evenimentului este
updated, câmpurile specifice de urmărit pot fi specificate în array-ulupdatedFields. Dacă este lăsat nedefinit sau gol, orice actualizare va declanșa funcția.
de ex.person.updated,*.created,company.*
Payload-ul declanșatorului de rută
Când un declanșator de rută invocă funcția logică, aceasta primește un obiectRoutePayload care urmează
AWS HTTP API v2 format.
Importați tipul RoutePayload din twenty-sdk:RoutePayload are următoarea structură:| Proprietate | Tip | Descriere | Exemplu |
|---|---|---|---|
headers | Record\<string, string | undefined> | Anteturi HTTP (doar cele listate în forwardedRequestHeaders) | consultați secțiunea de mai jos |
queryStringParameters | Record\<string, string | undefined> | Parametri query string (valorile multiple unite cu virgule) | /users?ids=1&ids=2&ids=3&name=Alice -> { ids: '1,2,3', name: 'Alice' } |
pathParameters | Record\<string, string | undefined> | Parametri de cale extrași din modelul rutei | /users/:id, /users/123 -> { id: '123' } |
body | object | null | Corpul cererii analizat (JSON) | { id: 1 } -> { id: 1 } |
rawBody | string | undefined | Corpul original al cererii în UTF-8, înainte de parsarea JSON. Util pentru verificarea semnăturilor de tip HMAC pentru webhook-uri (de exemplu, X-Hub-Signature-256 de la GitHub, Stripe). undefined atunci când mediul de execuție nu a păstrat-o. | |
isBase64Encoded | boolean | Indică dacă corpul este codificat în base64 | |
requestContext.http.method | string | Metoda HTTP (GET, POST, PUT, PATCH, DELETE) | |
requestContext.http.path | string | Calea brută a cererii |
forwardedRequestHeaders
În mod implicit, anteturile HTTP din cererile de intrare nu sunt transmise funcției dvs. de logică din motive de securitate. Pentru a accesa anumite anteturi, listați-le explicit în array-ulforwardedRequestHeaders:event.headers['content-type']).Expunerea unei funcții ca instrument AI sau ca acțiune în fluxul de lucru
Funcțiile logice pot fi expuse în două locuri, fiecare cu propriul declanșator:toolTriggerSettings— face funcția descoperibilă de către funcționalitățile AI ale Twenty (chat, MCP, apelarea de funcții). Folosește JSON Schema standard, formatul pe care LLM-urile îl înțeleg nativ.workflowActionTriggerSettings— determină ca funcția să apară ca un pas în constructorul vizual de fluxuri de lucru. FoloseșteInputSchemabogat al Twenty, astfel încât constructorul să poată afișa editori de câmp adecvați, selectoare de variabile și etichete.
cronTriggerSettings, databaseEventTriggerSettings și httpRouteTriggerSettings — același tipar, aceeași formă.- O funcție poate combina suprafețele — declară atât
toolTriggerSettings, cât șiworkflowActionTriggerSettingspentru a o expune atât în chat, cât și în constructorul de fluxuri de lucru. toolTriggerSettings.inputSchemașiworkflowActionTriggerSettings.inputSchemasunt ambele opționale. Când sunt omise, generatorul de manifest le deduce din codul sursă al handlerului (JSON Schema pentru instrumentul AI,InputSchemaal Twenty pentru acțiunea de flux de lucru). Furnizează unul în mod explicit atunci când dorești o tipizare mai bogată — de exemplu, cu câmpuri compatibile cuFieldMetadataType, precumCURRENCYsauRELATIONpentru constructorul de fluxuri de lucru, sau cu câmpuridescriptionpe care agentul AI le poate citi:
description bună. Agenții AI se bazează pe câmpul description al funcției pentru a decide când să folosească instrumentul. Fiți specifici cu privire la ceea ce face instrumentul și când ar trebui apelat.definePostInstallLogicFunction
Definește o funcție logică post-instalare (una per aplicație)
definePostInstallLogicFunction
Definește o funcție logică post-instalare (una per aplicație)
- Funcțiile de post-instalare folosesc
definePostInstallLogicFunction()— o variantă specializată care omite setările de declanșare (cronTriggerSettings,databaseEventTriggerSettings,httpRouteTriggerSettings,toolTriggerSettings,workflowActionTriggerSettings). - Handlerul primește un
InstallPayloadcu{ previousVersion?: string; newVersion: string }—newVersioneste versiunea care este instalată, iarpreviousVersioneste versiunea instalată anterior (sauundefinedla o instalare nouă). Folosiți aceste valori pentru a distinge instalările noi de actualizări și pentru a rula logică de migrare specifică versiunii. - Când rulează hook-ul: doar la instalări noi, în mod implicit. Transmiteți
shouldRunOnVersionUpgrade: truedacă doriți să ruleze și atunci când aplicația este actualizată de la o versiune anterioară. Când este omis, indicatorul are implicit valoareafalse, iar actualizările sar peste hook. - Model de execuție — implicit asincron, sincron opțional: indicatorul
shouldRunSynchronouslycontrolează modul în care este executat post-install.shouldRunSynchronously: false(implicit) — hook-ul este pus în coadă în message queue curetryLimit: 3și rulează asincron într-un worker. Răspunsul la instalare revine imediat ce jobul este pus în coadă, astfel încât un handler lent sau care eșuează nu blochează apelantul. Workerul va reîncerca de până la trei ori. Folosiți acest mod pentru joburi de lungă durată — popularea unor seturi mari de date, apelarea API-urilor lente ale terților, provizionarea resurselor externe, orice ar putea depăși o fereastră rezonabilă de răspuns HTTP.shouldRunSynchronously: true— hook-ul este executat inline în timpul fluxului de instalare (același executor ca pre-install). Cererea de instalare blochează până când handlerul se termină, iar dacă acesta aruncă o eroare, apelantul instalării primește unPOST_INSTALL_ERROR. Fără reîncercări automate. Folosiți acest mod pentru sarcini rapide, care trebuie să se finalizeze înainte de răspuns — de exemplu, emiterea unei erori de validare către utilizator sau o configurare rapidă de care clientul va depinde imediat după ce apelul de instalare revine. Reține că migrarea metadatelor a fost deja aplicată până când rulează post-install, astfel încât un eșec în modul sincron nu anulează modificările de schemă — doar expune eroarea.
- Asigurați-vă că handlerul dvs. este idempotent. În modul asincron, coada poate reîncerca de până la trei ori; în oricare mod, hook-ul poate rula din nou la actualizări când
shouldRunOnVersionUpgrade: true. - Variabilele de mediu
APPLICATION_ID,APP_ACCESS_TOKENșiAPI_URLsunt disponibile în interiorul handlerului (la fel ca în orice altă funcție logică), astfel încât puteți apela API-ul Twenty cu un token de acces al aplicației limitat la aplicația dvs. - Este permisă o singură funcție de post-instalare per aplicație. Construirea manifestului va genera o eroare dacă este detectată mai mult de una.
universalIdentifier,shouldRunOnVersionUpgradeșishouldRunSynchronouslyale funcției sunt atașate automat la manifestul aplicației în câmpulpostInstallLogicFunctionîn timpul build-ului — nu este nevoie să le referi îndefineApplication().- Timpul de expirare implicit este setat la 300 de secunde (5 minute) pentru a permite sarcini de configurare mai lungi, cum ar fi popularea datelor.
- Nu se execută în modul dev: când o aplicație este înregistrată local (prin
yarn twenty dev), serverul sare complet peste fluxul de instalare și sincronizează fișierele direct prin watcher-ul CLI — astfel încât post-install nu rulează niciodată în modul dev, indiferent deshouldRunSynchronously. Folosițiyarn twenty exec --postInstallpentru a-l declanșa manual într-un workspace care rulează.
definePreInstallLogicFunction
Definește o funcție logică de pre-instalare (una per aplicație)
definePreInstallLogicFunction
Definește o funcție logică de pre-instalare (una per aplicație)
InstallPayload), dar este plasată mai devreme în fluxul de instalare, astfel încât poate pregăti starea de care depinde migrarea iminentă — utilizări tipice includ realizarea unui backup al datelor, validarea compatibilității cu noua schemă sau arhivarea înregistrărilor care urmează să fie restructurate sau eliminate.- Funcțiile de pre-instalare folosesc
definePreInstallLogicFunction()— aceeași configurare specializată ca pentru post-install, doar că atașată la un alt punct din ciclul de viață. - Atât handlerele de pre-install, cât și cele de post-install primesc același tip
InstallPayload:{ previousVersion?: string; newVersion: string }. Importați-l o singură dată și reutilizați-l pentru ambele hook-uri. - Când rulează hook-ul: poziționat chiar înainte de migrarea metadatelor workspace-ului (
synchronizeFromManifest). Înainte de execuție, serverul rulează un “sync redus”, pur aditiv, care înregistrează funcția de pre-instalare a versiunii noi în metadatele workspace-ului — nimic altceva nu este atins — și apoi o execută. Deoarece acest sync este doar aditiv, obiectele, câmpurile și datele versiunii precedente sunt încă intacte când rulează handlerul dvs.: puteți citi și face backup în siguranță stării pre-migrare. - Model de execuție: pre-install este executat sincron și blochează instalarea. Dacă handlerul aruncă o eroare, instalarea este întreruptă înainte ca orice modificări de schemă să fie aplicate — workspace-ul rămâne la versiunea anterioară într-o stare consistentă. Acest lucru este intenționat: pre-install este ultima dvs. șansă de a refuza o actualizare riscantă.
- La fel ca la post-install, este permisă o singură funcție de pre-instalare per aplicație. Este atașată automat la manifestul aplicației sub
preInstallLogicFunctionîn timpul build-ului. - Nu se execută în modul dev: la fel ca post-install — fluxul de instalare este sărit complet pentru aplicațiile înregistrate local, astfel încât pre-install nu rulează niciodată sub
yarn twenty dev. Folosițiyarn twenty exec --preInstallpentru a-l declanșa manual.
Pre-install vs post-install: când să folosești fiecare
Alegerea hook-ului de instalare potrivit
Pre-install vs post-install: când să folosești fiecare
Alegerea hook-ului de instalare potrivit
InstallPayload. Diferența constă în momentul în care rulează în raport cu migrarea metadatelor workspace-ului, iar asta schimbă ce date pot atinge în siguranță.shouldRunSynchronously: true. Consultați acordeonul definePostInstallLogicFunction de mai sus pentru când să folosiți fiecare mod.Folosiți post-install pentru orice are nevoie ca noua schemă să existe. Acesta este cazul obișnuit:- Popularea datelor implicite (crearea înregistrărilor inițiale, a vizualizărilor implicite, a conținutului demo) pentru obiectele și câmpurile adăugate recent.
- Înregistrarea webhook-urilor la servicii terțe, acum că aplicația are acreditările sale.
- Apelarea propriului tău API pentru a finaliza configurarea care depinde de metadatele sincronizate.
- Logică idempotentă de tipul “asigurați-vă că acest lucru există” care ar trebui să reconcilieze starea la fiecare actualizare — combină cu
shouldRunOnVersionUpgrade: true.
PostCard implicită după instalare:pre-install atunci când o migrare altfel ar distruge sau ar corupe datele existente. Deoarece pre-install rulează pe schema anterioară și eșecul său anulează actualizarea, acesta este locul potrivit pentru orice este riscant:- Crearea unui backup al datelor care urmează să fie eliminate sau restructurate — de exemplu, elimini un câmp în v2 și trebuie să-i copiezi valorile într-un alt câmp sau să le exporți în stocare înainte de rularea migrării.
- Arhivarea înregistrărilor pe care o nouă constrângere le-ar invalida — de exemplu, un câmp devine
NOT NULLși trebuie mai întâi să ștergi sau să corectezi rândurile cu valori nule. - Validarea compatibilității și refuzarea actualizării dacă datele curente nu pot fi migrate fără probleme — aruncă din handler și instalarea se oprește fără ca modificări să fie aplicate. Aceasta este mai sigur decât să descoperi incompatibilitatea în mijlocul migrării.
- Redenumirea sau schimbarea cheilor datelor înaintea unei modificări de schemă care ar pierde asocierile.
| Vrei să… | Folosiți |
|---|---|
| Populați date implicite, configurați workspace-ul, înregistrați resurse externe | post-install |
| Rulați populări de durată sau apeluri către terți care nu ar trebui să blocheze răspunsul la instalare | post-install (implicit — shouldRunSynchronously: false, cu reîncercări ale workerului) |
| Rulați o configurare rapidă de care apelantul va depinde imediat după ce apelul de instalare revine | post-install cu shouldRunSynchronously: true |
| Citești sau faci backup datelor pe care migrarea iminentă le-ar pierde | pre-install |
| Respingeți o actualizare care ar corupe datele existente | pre-install (aruncă din handler) |
| Rulați o reconciliere la fiecare actualizare | post-install cu shouldRunOnVersionUpgrade: true |
| Faceți o configurare unică doar la prima instalare | post-install cu shouldRunOnVersionUpgrade: false (implicit) |
Clienți API tipizați (twenty-client-sdk)
Pachetultwenty-client-sdk oferă doi clienți GraphQL tipați pentru a interacționa cu API-ul Twenty din funcțiile de logică și componentele Front.
| Client | Importați | Endpoint | Generat? |
|---|---|---|---|
CoreApiClient | twenty-client-sdk/core | /graphql — date ale spațiului de lucru (înregistrări, obiecte) | Da, în timpul dev/build |
MetadataApiClient | twenty-client-sdk/metadata | /metadata — configurarea spațiului de lucru, încărcări de fișiere | Nu, este livrat preconstruit |
CoreApiClient
Interogați și modificați datele spațiului de lucru (înregistrări, obiecte)
CoreApiClient
Interogați și modificați datele spațiului de lucru (înregistrări, obiecte)
CoreApiClient este clientul principal pentru interogarea și modificarea datelor din spațiul de lucru. Este generat din schema spațiului de lucru în timpul yarn twenty dev sau yarn twenty build, astfel încât este complet tipizat pentru a corespunde obiectelor și câmpurilor dvs.true pentru a include un câmp, folosiți __args pentru argumente și imbricați obiecte pentru relații. Obțineți autocompletare și verificare a tipurilor complete, pe baza schemei spațiului dvs. de lucru.yarn twenty dev sau yarn twenty build, va arunca o eroare. Generarea are loc automat — CLI inspectează schema GraphQL a spațiului dvs. de lucru și generează un client tipizat folosind @genql/cli.Folosirea CoreSchema pentru adnotări de tip
CoreSchema oferă tipuri TypeScript care corespund obiectelor din spațiul dvs. de lucru — utile pentru tiparea stării componentelor sau a parametrilor funcțiilor:MetadataApiClient
Configurația spațiului de lucru, aplicații și încărcări de fișiere
MetadataApiClient
Configurația spațiului de lucru, aplicații și încărcări de fișiere
MetadataApiClient este livrat preconstruit împreună cu SDK-ul (nu este necesară generarea). Interoghează endpointul /metadata pentru configurarea spațiului de lucru, aplicații și încărcări de fișiere.Încărcarea fișierelor
MetadataApiClient include o metodă uploadFile pentru atașarea fișierelor la câmpuri de tip fișier:| Parametru | Tip | Descriere |
|---|---|---|
fileBuffer | Buffer | Conținutul brut al fișierului |
filename | string | Numele fișierului (folosit pentru stocare și afișare) |
contentType | string | Tipul MIME (implicit application/octet-stream dacă este omis) |
fieldMetadataUniversalIdentifier | string | universalIdentifier al câmpului de tip fișier de pe obiectul dvs. |
- Folosește
universalIdentifieral câmpului (nu ID-ul specific spațiului de lucru), astfel încât codul dvs. de încărcare funcționează în orice spațiu de lucru în care aplicația dvs. este instalată. urlreturnat este un URL semnat pe care îl puteți folosi pentru a accesa fișierul încărcat.
TWENTY_API_URL— URL-ul de bază al API-ului TwentyTWENTY_APP_ACCESS_TOKEN— Cheie cu durată scurtă, limitată la rolul implicit de funcție al aplicației
process.env. Permisiunile cheii API sunt determinate de rolul referențiat în defaultRoleUniversalIdentifier din application-config.ts.