Co jsou aplikace?
Aplikace vám umožňují vytvářet a spravovat přizpůsobení Twenty jako kód. Místo konfigurace všeho přes uživatelské rozhraní definujete v kódu svůj datový model a logické funkce — což zrychluje vývoj, údržbu i nasazování do více pracovních prostorů. Co můžete dělat už dnes:- Definujte vlastní objekty a pole jako kód (spravovaný datový model)
- Vytvářejte logické funkce s vlastními spouštěči
- Definujte dovednosti agentů AI
- Nasazujte stejnou aplikaci do více pracovních prostorů
Předpoklady
- Node.js 24+ a Yarn 4
- Pracovní prostor Twenty a klíč API (vytvořte si jej na https://app.twenty.com/settings/api-webhooks)
Začínáme
Vytvořte novou aplikaci pomocí oficiálního scaffolderu, poté se ověřte a začněte vyvíjet:Struktura projektu (vytvořená scaffolderem)
Když spustítenpx create-twenty-app@latest my-twenty-app, scaffolder:
- Zkopíruje minimální základní aplikaci do
my-twenty-app/ - Přidá lokální závislost
twenty-sdka konfiguraci pro Yarn 4 - Vytvoří konfigurační soubory a skripty napojené na
twentyCLI - Vygeneruje základní soubory (konfigurace aplikace, výchozí role funkcí, postinstalační funkce) a k nim ukázkové soubory podle zvoleného režimu generování kostry
--exhaustive vypadá takto:
--minimal se vytvoří pouze základní soubory (application-config.ts, roles/default-role.ts a logic-functions/post-install.ts). S volbou --interactive si vyberete, které ukázkové soubory chcete zahrnout.
V kostce:
- package.json: Deklaruje název aplikace, verzi, engines (Node 24+, Yarn 4) a přidává
twenty-sdkplus skripttwenty, který deleguje na lokálnítwentyCLI. Spusťteyarn twenty helppro výpis všech dostupných příkazů. - .gitignore: Ignoruje běžné artefakty jako
node_modules,.yarn,generated/(typovaný klient),dist/,build/, složky s coverage, logy a soubory.env*. - yarn.lock, .yarnrc.yml, .yarn/: Zamykají a konfigurují nástrojový řetězec Yarn 4 používaný projektem.
- .nvmrc: Fixuje verzi Node.js požadovanou projektem.
- eslint.config.mjs a tsconfig.json: Poskytují lintování a konfiguraci TypeScriptu pro zdrojové soubory vaší aplikace v TypeScriptu.
- README.md: Krátké README v kořeni aplikace se základními pokyny.
- public/: Složka pro ukládání veřejných prostředků (obrázky, písma, statické soubory), které bude vaše aplikace poskytovat. Soubory umístěné zde se během synchronizace nahrají a jsou za běhu dostupné.
- src/: Hlavní místo, kde definujete svou aplikaci jako kód
Detekce entit
SDK detekuje entity analýzou vašich souborů TypeScript a hledá voláníexport default define<Entity>({...}). Každý typ entity má odpovídající pomocnou funkci exportovanou z twenty-sdk:
| Pomocná funkce | Typ entity |
|---|---|
defineObject() | Definice vlastních objektů |
defineLogicFunction() | Definice logických funkcí |
defineFrontComponent() | Definice frontendových komponent |
defineRole() | Definice rolí |
defineField() | Rozšíření polí u existujících objektů |
defineView() | Definice uložených zobrazení |
defineNavigationMenuItem() | Definice položek navigační nabídky |
defineSkill() | Definice dovedností agenta AI |
Pojmenování souborů je flexibilní. Detekce entit je založená na AST — SDK prochází vaše zdrojové soubory a hledá vzor
export default define<Entity>({...}). Soubory a složky můžete organizovat, jak chcete. Seskupování podle typu entity (např. logic-functions/, roles/) je pouze konvence pro organizaci kódu, nikoli požadavek.yarn twenty app:devautomaticky vygeneruje typovaného klienta API vnode_modules/twenty-sdk/generated(typovaný klient Twenty + typy pracovního prostoru).yarn twenty entity:addpřidá soubory s definicemi entit dosrc/pro vaše vlastní objekty, funkce, frontové komponenty, role, dovednosti a další.
Ověření
Při prvním spuštěníyarn twenty auth:login budete vyzváni k zadání:
- URL API (výchozí je http://localhost:3000 nebo váš aktuální profil pracovního prostoru)
- Klíč API
~/.twenty/config.json. Můžete spravovat více profilů a přepínat mezi nimi.
Správa pracovních prostorů
yarn twenty auth:switch, všechny následující příkazy budou tento pracovní prostor používat jako výchozí. Můžete jej stále dočasně přepsat pomocí --workspace <name>.
Používejte zdroje SDK (typy a konfiguraci)
twenty-sdk poskytuje typované stavební bloky a pomocné funkce, které používáte ve své aplikaci. Níže jsou klíčové části, se kterými budete nejčastěji pracovat.Pomocné funkce
SDK poskytuje pomocné funkce pro definování entit vaší aplikace. Jak je popsáno v Detekce entit, musíte použítexport default define<Entity>({...}), aby byly vaše entity detekovány:
| Funkce | Účel |
|---|---|
defineApplication() | Nakonfigurujte metadata aplikace (povinné, jedno na aplikaci) |
defineObject() | Definice vlastních objektů s poli |
defineLogicFunction() | Definice logických funkcí s obslužnými funkcemi |
defineFrontComponent() | Definujte frontendové komponenty pro vlastní uživatelské rozhraní |
defineRole() | Konfigurace oprávnění rolí a přístupu k objektům |
defineField() | Rozšiřte existující objekty o další pole |
defineView() | Definujte uložená zobrazení pro objekty |
defineNavigationMenuItem() | Definujte odkazy postranní navigace |
defineSkill() | Definuje dovednosti agenta AI |
Definování objektů
Vlastní objekty popisují jak schéma, tak chování záznamů ve vašem pracovním prostoru. K definování objektů s vestavěnou validací použijtedefineObject():
- Použijte
defineObject()pro vestavěnou validaci a lepší podporu v IDE. - Hodnota
universalIdentifiermusí být jedinečná a stabilní napříč nasazeními. - Každé pole vyžaduje
name,type,labela svůj vlastní stabilníuniversalIdentifier. - Pole
fieldsje volitelné — objekty můžete definovat i bez vlastních polí. - Nové objekty můžete vygenerovat pomocí
yarn twenty entity:add, který vás provede pojmenováním, poli a vztahy.
Základní pole jsou vytvořena automaticky. Když definujete vlastní objekt, Twenty automaticky přidá standardní pole
jako
id, name, createdAt, updatedAt, createdBy, updatedBy a deletedAt.
Nemusíte je definovat v poli fields — přidejte pouze svá vlastní pole.
Výchozí pole můžete přepsat definováním pole se stejným názvem v poli fields,
ale to se nedoporučuje.Konfigurace aplikace (application-config.ts)
Každá aplikace má jeden souborapplication-config.ts, který popisuje:
- Identitu aplikace: identifikátory, zobrazovaný název a popis.
- Jak běží její funkce: kterou roli používají pro oprávnění.
- (Volitelné) proměnné: dvojice klíč–hodnota zpřístupněné vašim funkcím jako proměnné prostředí.
- (Volitelná) postinstalační funkce: logická funkce, která se spouští po instalaci aplikace.
defineApplication() to define your application configuration:
- Pole
universalIdentifierjsou deterministická ID, která vlastníte; vygenerujte je jednou a udržujte je stabilní napříč synchronizacemi. applicationVariablesse stanou proměnnými prostředí pro vaše funkce (napříkladDEFAULT_RECIPIENT_NAMEje dostupné jakoprocess.env.DEFAULT_RECIPIENT_NAME).defaultRoleUniversalIdentifierse musí shodovat se souborem role (viz níže).postInstallLogicFunctionUniversalIdentifier(volitelné) odkazuje na logickou funkci, která se automaticky spustí po instalaci aplikace. Viz Postinstalační funkce.
Role a oprávnění
Aplikace mohou definovat role, které zapouzdřují oprávnění k objektům a akcím ve vašem pracovním prostoru. PoledefaultRoleUniversalIdentifier v application-config.ts určuje výchozí roli používanou logickými funkcemi vaší aplikace.
- Běhový klíč API vložený jako
TWENTY_API_KEYje odvozen z této výchozí role funkcí. - Typovaný klient bude omezen oprávněními udělenými této roli.
- Dodržujte princip nejmenších oprávnění: vytvořte vyhrazenou roli pouze s oprávněními, která vaše funkce potřebují, a poté odkazujte na její univerzální identifikátor.
Výchozí role funkce (*.role.ts)
Když vygenerujete novou aplikaci, CLI také vytvoří výchozí soubor role. K definování rolí s vestavěnou validací použijtedefineRole():
universalIdentifier této role se poté odkazuje v application-config.ts jako na defaultRoleUniversalIdentifier. Jinými slovy:
- *.role.ts definuje, co může výchozí role funkce dělat.
- application-config.ts ukazuje na tuto roli, aby vaše funkce zdědily její oprávnění.
- Začněte rolí vytvořenou scaffolderem a postupně ji omezujte podle principu nejmenších oprávnění.
- Nahraďte
objectPermissionsafieldPermissionsobjekty/poli, která vaše funkce potřebují. permissionFlagsřídí přístup k schopnostem na úrovni platformy. Držte je na minimu; přidávejte pouze to, co potřebujete.- Podívejte se na funkční příklad v aplikaci Hello World:
packages/twenty-apps/hello-world/src/roles/function-role.ts.
Konfigurace logických funkcí a vstupní bod
Každý soubor funkce používádefineLogicFunction() k exportu konfigurace s obslužnou funkcí (handlerem) a volitelnými spouštěči.
- route: Zpřístupní vaši funkci na HTTP cestě a metodě pod koncovým bodem
/s/:
např.path: '/post-card/create',-> volání na<APP_URL>/s/post-card/create
- cron: Spouští vaši funkci podle plánu pomocí výrazu CRON.
- databaseEvent: Spouští se při událostech životního cyklu objektů v pracovním prostoru. Když je operace události
updated, lze konkrétní sledovaná pole určit v poliupdatedFields. Pokud zůstane nedefinované nebo prázdné, spustí funkci jakákoli aktualizace.
např. person.updated
Poznámky:
- Pole
triggersje volitelné. Funkce bez spouštěčů lze použít jako pomocné funkce volané jinými funkcemi. - V jedné funkci můžete kombinovat více typů spouštěčů.
Postinstalační funkce
Postinstalační funkce je logická funkce, která se automaticky spouští po instalaci vaší aplikace do pracovního prostoru. To je užitečné pro jednorázové úlohy nastavení, jako je naplnění výchozími daty, vytvoření počátečních záznamů nebo konfigurace nastavení pracovního prostoru. Když vygenerujete kostru nové aplikace pomocícreate-twenty-app, vytvoří se pro vás postinstalační funkce v src/logic-functions/post-install.ts:
application-config.ts:
- Postinstalační funkce jsou standardní logické funkce — používají
defineLogicFunction()stejně jako jakákoli jiná funkce. - Pole
postInstallLogicFunctionUniversalIdentifiervdefineApplication()je volitelné. Pokud je vynecháno, po instalaci se nespustí žádná funkce. - Výchozí časový limit je nastaven na 300 sekund (5 minut), aby umožnil delší úlohy nastavení, jako je naplnění daty.
- Postinstalační funkce nepotřebují spouštěče — jsou spouštěny platformou během instalace nebo ručně pomocí
function:execute --postInstall.
Payload spouštěče trasy
Když spouštěč trasy vyvolá vaši logickou funkci, ta obdrží objektRoutePayload, který odpovídá formátu AWS HTTP API v2. Importujte typ z twenty-sdk:
RoutePayload má následující strukturu:
| Vlastnost | Typ | Popis |
|---|---|---|
headers | Record<string, string | undefined> | Záhlaví HTTP (pouze ta uvedená v forwardedRequestHeaders) |
queryStringParameters | Record<string, string | undefined> | Parametry query stringu (více hodnot spojených čárkami) |
pathParameters | Record<string, string | undefined> | Parametry cesty extrahované ze vzoru trasy (např. /users/:id → { id: '123' }) |
text zprávy | object | null | Parsované tělo požadavku (JSON) |
isBase64Encoded | booleovská hodnota | Zda je tělo kódováno base64 |
requestContext.http.method | string | Metoda HTTP (GET, POST, PUT, PATCH, DELETE) |
requestContext.http.path | string | Nezpracovaná cesta požadavku |
Přeposílání záhlaví HTTP
Ve výchozím nastavení se záhlaví HTTP z příchozích požadavků z bezpečnostních důvodů do vaší logické funkce ne předávají. Chcete-li zpřístupnit konkrétní záhlaví, výslovně je uveďte v poliforwardedRequestHeaders:
Názvy záhlaví jsou normalizovány na malá písmena. Přistupujte k nim pomocí klíčů s malými písmeny (například
event.headers['content-type']).- Vygenerované: Spusťte
yarn twenty entity:adda zvolte možnost přidat novou logickou funkci. Tím se vygeneruje startovací soubor s obslužnou funkcí a konfigurací. - Ruční: Vytvořte nový soubor
*.logic-function.tsa použijtedefineLogicFunction()podle stejného vzoru.
Označení logické funkce jako nástroje
Logické funkce lze zpřístupnit jako nástroje pro agenty AI a pracovní postupy. Když je funkce označena jako nástroj, stane se dohledatelnou funkcemi AI produktu Twenty a lze ji vybrat jako krok v automatizacích pracovních postupů. Chcete-li označit logickou funkci jako nástroj, nastavteisTool: true a poskytněte toolInputSchema popisující očekávané vstupní parametry pomocí JSON Schema:
isTool(boolean, výchozí:false): Když je nastaveno natrue, funkce je zaregistrována jako nástroj a zpřístupní se agentům AI a automatizacím pracovních postupů.toolInputSchema(object, volitelné): Objekt JSON Schema, který popisuje parametry, jež vaše funkce přijímá. Agenti AI používají toto schéma k pochopení toho, jaké vstupy nástroj očekává, a k ověřování volání. Pokud je vynecháno, schéma má výchozí podobu{ type: 'object', properties: {} }(žádné parametry).- Funkce s
isTool: false(nebo není nastaveno) nejsou zpřístupněny jako nástroje. Stále je lze spouštět přímo nebo volat z jiných funkcí, ale neobjeví se ve vyhledávání nástrojů. - Pojmenování nástrojů: Když je funkce zpřístupněna jako nástroj, její název se automaticky normalizuje na
logic_function_<name>(převedeno na malá písmena, nealfanumerické znaky jsou nahrazeny podtržítky). Napříkladenrich-companyse změní nalogic_function_enrich_company. - Můžete kombinovat
isToolse spouštěči — funkce může být zároveň nástrojem (volatelným agenty AI) i spouštěna událostmi (cron, databázové události, routes).
Napište kvalitní
description. Agenti AI se spoléhají na pole funkce description při rozhodování, kdy nástroj použít. Buďte konkrétní ohledně toho, co nástroj dělá a kdy se má volat.Frontendové komponenty
Frontendové komponenty vám umožňují vytvářet vlastní React komponenty, které se vykreslují v rozhraní Twenty. K definování komponent s vestavěnou validací použijtedefineFrontComponent():
- Frontendové komponenty jsou React komponenty, které se vykreslují v izolovaných kontextech v rámci Twenty.
- Pro automatickou detekci použijte příponu souboru
*.front-component.tsx. - Pole
componentodkazuje na vaši React komponentu. - Komponenty se během
yarn twenty app:devautomaticky sestaví a synchronizují.
- Vygenerované: Spusťte
yarn twenty entity:adda zvolte možnost přidat novou frontendovou komponentu. - Ruční: Vytvořte nový soubor
*.front-component.tsxa použijtedefineFrontComponent().
Dovednosti
Dovednosti definují znovupoužitelné pokyny a schopnosti, které mohou agenti AI používat ve vašem pracovním prostoru. K definování dovedností s vestavěnou validací použijtedefineSkill():
nameje jedinečný identifikátor dovednosti (doporučuje se kebab-case).labelje uživatelsky čitelný název zobrazovaný v UI.contentobsahuje pokyny dovednosti — je to text, který agent AI používá.icon(volitelné) nastavuje ikonu zobrazovanou v UI.description(volitelné) poskytuje doplňující kontext o účelu dovednosti.
- Vygenerované: Spusťte
yarn twenty entity:adda zvolte možnost přidat novou dovednost. - Ruční: Vytvořte nový soubor a použijte
defineSkill()podle stejného vzoru.
Generovaný typovaný klient
Typovaný klient je automaticky generován pomocíyarn twenty app:dev a ukládá se do node_modules/twenty-sdk/generated podle schématu vašeho pracovního prostoru. Použijte jej ve svých funkcích:
yarn twenty app:dev kdykoli se změní vaše objekty nebo pole.
Běhové přihlašovací údaje v logických funkcích
Když vaše funkce běží na Twenty, platforma před spuštěním kódu vloží přihlašovací údaje jako proměnné prostředí:TWENTY_API_URL: Základní URL Twenty API, na které vaše aplikace cílí.TWENTY_API_KEY: Krátkodobý klíč s rozsahem omezeným na výchozí roli funkce vaší aplikace.
- Není nutné předávat URL ani klíč API vygenerovanému klientovi. Za běhu čte
TWENTY_API_URLaTWENTY_API_KEYz process.env. - Oprávnění klíče API jsou určena rolí odkazovanou ve vašem
application-config.tsprostřednictvímdefaultRoleUniversalIdentifier. Toto je výchozí role používaná logickými funkcemi vaší aplikace. - Aplikace mohou definovat role podle principu nejmenších oprávnění. Udělte pouze oprávnění, která vaše funkce potřebují, a poté nastavte
defaultRoleUniversalIdentifierna univerzální identifikátor této role.
Příklad Hello World
Prozkoumejte minimalistický end-to-end příklad, který demonstruje objekty, logické funkce, frontendové komponenty a více spouštěčů zde:Ruční nastavení (bez scaffolderu)
Ačkoli pro nejlepší začátky doporučujeme použítcreate-twenty-app, projekt můžete nastavit i ručně. Neinstalujte CLI globálně. Místo toho přidejte twenty-sdk jako lokální závislost a přidejte jeden skript do souboru package.json:
twenty:
yarn twenty <command>, např. yarn twenty app:dev, yarn twenty help atd.
Řešení potíží
- Chyby ověření: spusťte
yarn twenty auth:logina ujistěte se, že váš klíč API má požadovaná oprávnění. - Nelze se připojit k serveru: ověřte URL API a že je server Twenty dosažitelný.
- Types or client missing/outdated: restart
yarn twenty app:dev— it auto-generates the typed client. - Režim vývoje se nesynchronizuje: ujistěte se, že běží
yarn twenty app:deva že vaše prostředí změny neignoruje.