diff --git a/packages/twenty-docs/docs.json b/packages/twenty-docs/docs.json
index 86191838ef..37c6846d39 100644
--- a/packages/twenty-docs/docs.json
+++ b/packages/twenty-docs/docs.json
@@ -837,6 +837,18 @@
"l/fr/developers/extend/apps/getting-started/troubleshooting"
]
},
+ {
+ "group": "Tutoriel",
+ "pages": [
+ "l/fr/developers/extend/apps/tutorials/document-generator/overview",
+ "l/fr/developers/extend/apps/tutorials/document-generator/data-model",
+ "l/fr/developers/extend/apps/tutorials/document-generator/generating-documents",
+ "l/fr/developers/extend/apps/tutorials/document-generator/http-routes",
+ "l/fr/developers/extend/apps/tutorials/document-generator/building-the-ui",
+ "l/fr/developers/extend/apps/tutorials/document-generator/ai-agent",
+ "l/fr/developers/extend/apps/tutorials/document-generator/publishing"
+ ]
+ },
{
"group": "Configuration",
"pages": [
@@ -1277,6 +1289,18 @@
"l/ar/developers/extend/apps/getting-started/troubleshooting"
]
},
+ {
+ "group": "البرنامج التعليمي",
+ "pages": [
+ "l/ar/developers/extend/apps/tutorials/document-generator/overview",
+ "l/ar/developers/extend/apps/tutorials/document-generator/data-model",
+ "l/ar/developers/extend/apps/tutorials/document-generator/generating-documents",
+ "l/ar/developers/extend/apps/tutorials/document-generator/http-routes",
+ "l/ar/developers/extend/apps/tutorials/document-generator/building-the-ui",
+ "l/ar/developers/extend/apps/tutorials/document-generator/ai-agent",
+ "l/ar/developers/extend/apps/tutorials/document-generator/publishing"
+ ]
+ },
{
"group": "التهيئة",
"pages": [
@@ -1717,6 +1741,18 @@
"l/cs/developers/extend/apps/getting-started/troubleshooting"
]
},
+ {
+ "group": "Návod",
+ "pages": [
+ "l/cs/developers/extend/apps/tutorials/document-generator/overview",
+ "l/cs/developers/extend/apps/tutorials/document-generator/data-model",
+ "l/cs/developers/extend/apps/tutorials/document-generator/generating-documents",
+ "l/cs/developers/extend/apps/tutorials/document-generator/http-routes",
+ "l/cs/developers/extend/apps/tutorials/document-generator/building-the-ui",
+ "l/cs/developers/extend/apps/tutorials/document-generator/ai-agent",
+ "l/cs/developers/extend/apps/tutorials/document-generator/publishing"
+ ]
+ },
{
"group": "Konfigurace",
"pages": [
@@ -2157,6 +2193,18 @@
"l/de/developers/extend/apps/getting-started/troubleshooting"
]
},
+ {
+ "group": "Tutorial",
+ "pages": [
+ "l/de/developers/extend/apps/tutorials/document-generator/overview",
+ "l/de/developers/extend/apps/tutorials/document-generator/data-model",
+ "l/de/developers/extend/apps/tutorials/document-generator/generating-documents",
+ "l/de/developers/extend/apps/tutorials/document-generator/http-routes",
+ "l/de/developers/extend/apps/tutorials/document-generator/building-the-ui",
+ "l/de/developers/extend/apps/tutorials/document-generator/ai-agent",
+ "l/de/developers/extend/apps/tutorials/document-generator/publishing"
+ ]
+ },
{
"group": "Konfiguration",
"pages": [
@@ -2597,6 +2645,18 @@
"l/es/developers/extend/apps/getting-started/troubleshooting"
]
},
+ {
+ "group": "Tutorial",
+ "pages": [
+ "l/es/developers/extend/apps/tutorials/document-generator/overview",
+ "l/es/developers/extend/apps/tutorials/document-generator/data-model",
+ "l/es/developers/extend/apps/tutorials/document-generator/generating-documents",
+ "l/es/developers/extend/apps/tutorials/document-generator/http-routes",
+ "l/es/developers/extend/apps/tutorials/document-generator/building-the-ui",
+ "l/es/developers/extend/apps/tutorials/document-generator/ai-agent",
+ "l/es/developers/extend/apps/tutorials/document-generator/publishing"
+ ]
+ },
{
"group": "Configuración",
"pages": [
@@ -3037,6 +3097,18 @@
"l/it/developers/extend/apps/getting-started/troubleshooting"
]
},
+ {
+ "group": "Tutorial",
+ "pages": [
+ "l/it/developers/extend/apps/tutorials/document-generator/overview",
+ "l/it/developers/extend/apps/tutorials/document-generator/data-model",
+ "l/it/developers/extend/apps/tutorials/document-generator/generating-documents",
+ "l/it/developers/extend/apps/tutorials/document-generator/http-routes",
+ "l/it/developers/extend/apps/tutorials/document-generator/building-the-ui",
+ "l/it/developers/extend/apps/tutorials/document-generator/ai-agent",
+ "l/it/developers/extend/apps/tutorials/document-generator/publishing"
+ ]
+ },
{
"group": "Configurazione",
"pages": [
@@ -3477,6 +3549,18 @@
"l/ja/developers/extend/apps/getting-started/troubleshooting"
]
},
+ {
+ "group": "チュートリアル",
+ "pages": [
+ "l/ja/developers/extend/apps/tutorials/document-generator/overview",
+ "l/ja/developers/extend/apps/tutorials/document-generator/data-model",
+ "l/ja/developers/extend/apps/tutorials/document-generator/generating-documents",
+ "l/ja/developers/extend/apps/tutorials/document-generator/http-routes",
+ "l/ja/developers/extend/apps/tutorials/document-generator/building-the-ui",
+ "l/ja/developers/extend/apps/tutorials/document-generator/ai-agent",
+ "l/ja/developers/extend/apps/tutorials/document-generator/publishing"
+ ]
+ },
{
"group": "設定",
"pages": [
@@ -3917,6 +4001,18 @@
"l/ko/developers/extend/apps/getting-started/troubleshooting"
]
},
+ {
+ "group": "튜토리얼",
+ "pages": [
+ "l/ko/developers/extend/apps/tutorials/document-generator/overview",
+ "l/ko/developers/extend/apps/tutorials/document-generator/data-model",
+ "l/ko/developers/extend/apps/tutorials/document-generator/generating-documents",
+ "l/ko/developers/extend/apps/tutorials/document-generator/http-routes",
+ "l/ko/developers/extend/apps/tutorials/document-generator/building-the-ui",
+ "l/ko/developers/extend/apps/tutorials/document-generator/ai-agent",
+ "l/ko/developers/extend/apps/tutorials/document-generator/publishing"
+ ]
+ },
{
"group": "설정",
"pages": [
@@ -4357,6 +4453,18 @@
"l/pt/developers/extend/apps/getting-started/troubleshooting"
]
},
+ {
+ "group": "Tutorial",
+ "pages": [
+ "l/pt/developers/extend/apps/tutorials/document-generator/overview",
+ "l/pt/developers/extend/apps/tutorials/document-generator/data-model",
+ "l/pt/developers/extend/apps/tutorials/document-generator/generating-documents",
+ "l/pt/developers/extend/apps/tutorials/document-generator/http-routes",
+ "l/pt/developers/extend/apps/tutorials/document-generator/building-the-ui",
+ "l/pt/developers/extend/apps/tutorials/document-generator/ai-agent",
+ "l/pt/developers/extend/apps/tutorials/document-generator/publishing"
+ ]
+ },
{
"group": "Configuração",
"pages": [
@@ -4797,6 +4905,18 @@
"l/ro/developers/extend/apps/getting-started/troubleshooting"
]
},
+ {
+ "group": "Tutorial",
+ "pages": [
+ "l/ro/developers/extend/apps/tutorials/document-generator/overview",
+ "l/ro/developers/extend/apps/tutorials/document-generator/data-model",
+ "l/ro/developers/extend/apps/tutorials/document-generator/generating-documents",
+ "l/ro/developers/extend/apps/tutorials/document-generator/http-routes",
+ "l/ro/developers/extend/apps/tutorials/document-generator/building-the-ui",
+ "l/ro/developers/extend/apps/tutorials/document-generator/ai-agent",
+ "l/ro/developers/extend/apps/tutorials/document-generator/publishing"
+ ]
+ },
{
"group": "Configurare",
"pages": [
@@ -5671,6 +5791,18 @@
"l/tr/developers/extend/apps/getting-started/troubleshooting"
]
},
+ {
+ "group": "Öğretici",
+ "pages": [
+ "l/tr/developers/extend/apps/tutorials/document-generator/overview",
+ "l/tr/developers/extend/apps/tutorials/document-generator/data-model",
+ "l/tr/developers/extend/apps/tutorials/document-generator/generating-documents",
+ "l/tr/developers/extend/apps/tutorials/document-generator/http-routes",
+ "l/tr/developers/extend/apps/tutorials/document-generator/building-the-ui",
+ "l/tr/developers/extend/apps/tutorials/document-generator/ai-agent",
+ "l/tr/developers/extend/apps/tutorials/document-generator/publishing"
+ ]
+ },
{
"group": "Yapılandırma",
"pages": [
@@ -6111,6 +6243,18 @@
"l/zh/developers/extend/apps/getting-started/troubleshooting"
]
},
+ {
+ "group": "教程",
+ "pages": [
+ "l/zh/developers/extend/apps/tutorials/document-generator/overview",
+ "l/zh/developers/extend/apps/tutorials/document-generator/data-model",
+ "l/zh/developers/extend/apps/tutorials/document-generator/generating-documents",
+ "l/zh/developers/extend/apps/tutorials/document-generator/http-routes",
+ "l/zh/developers/extend/apps/tutorials/document-generator/building-the-ui",
+ "l/zh/developers/extend/apps/tutorials/document-generator/ai-agent",
+ "l/zh/developers/extend/apps/tutorials/document-generator/publishing"
+ ]
+ },
{
"group": "配置",
"pages": [
diff --git a/packages/twenty-docs/l/ar/developers/extend/apps/tutorials/document-generator/ai-agent.mdx b/packages/twenty-docs/l/ar/developers/extend/apps/tutorials/document-generator/ai-agent.mdx
new file mode 100644
index 0000000000..a9c7a9d36d
--- /dev/null
+++ b/packages/twenty-docs/l/ar/developers/extend/apps/tutorials/document-generator/ai-agent.mdx
@@ -0,0 +1,80 @@
+---
+title: 5. An AI agent
+icon: robot
+description: السماح لوكيل بتوليد مستندات من محادثة، باستخدام أداتك.
+---
+
+لأن `وثيقة توليد الطاقة` مكشوفة كـ **أداة**، يمكن لوكيل الذكاء الاصطناعي أن يطلق عليها.
+دعونا نضيف وكيلا ومهارة حتى يمكن للمستخدمين أن يقولوا فقط *"إنشاء اقتراح لـ
+Jeffery Griffin"*.
+
+## المهارة
+
+A [skill](/l/ar/developers/extend/apps/logic/skills-and-agents) قابل لإعادة الاستخدام- المعرفة التي تربطها بالوكلاء. علمنا النموذج كيفية استخدام
+ الأداة.
+
+```ts filename="src/skills/document-drafting.skill.ts"
+import { defineSkill } from 'twenty-sdk/define';
+
+export default defineSkill({
+ universalIdentifier: DOCUMENT_SKILL_UNIVERSAL_IDENTIFIER,
+ name: 'document-drafting',
+ label: 'Document drafting',
+ icon: 'IconFileText',
+ content: [
+ 'To generate a document, call the `generate-document` tool with:',
+ '- `templateId`: the id of the document template to use.',
+ '- `recordId`: the id of the Person or Company the document is for.',
+ '',
+ 'If the user names a template or person instead of an id, find the record first,',
+ 'then pass its id. Make sure the template target matches the record type.',
+ ].join('\n'),
+});
+```
+
+## الوكيل
+
+[agent](/l/ar/developers/extend/apps/logic/skills-and-agents) يزوج موجه مع نموذج
+. تعيين 'استمارة الاستجابة' بشكل صريح لتجنب تحذير البناء.
+
+```ts filename="src/agents/document-assistant.agent.ts"
+import { defineAgent } from 'twenty-sdk/define';
+
+export default defineAgent({
+ universalIdentifier: DOCUMENT_AGENT_UNIVERSAL_IDENTIFIER,
+ name: 'document-assistant',
+ label: 'Document Assistant',
+ description: 'Generates documents from your templates and CRM records.',
+ icon: 'IconFileText',
+ responseFormat: { type: 'text' },
+ prompt: [
+ 'You are the Document Assistant for a CRM.',
+ 'You help users generate personalized documents from reusable templates',
+ 'and the data already in their CRM. Use the generate-document tool, and',
+ 'always confirm what you created.',
+ ].join(' '),
+});
+```
+
+
+ولا يمكن للوكيل الاتصال بالأداة إلا إذا كان دوره يسمح بذلك. لقد قمنا بالفعل بتعيين
+'cancessAllTools: true' و 'canBeAssignedToAgents: true' على دور التطبيق في
+[الفصل 2](/l/ar/developers/extend/apps/tutorials/document-generator/generating-documents#grant-it-access).
+
+
+## جرب ذلك
+
+افتح محادثة مع **مساعد مستندات** واطلب منها إعداد وثيقة لشخص
+في إدارة علاقات العملاء الخاصة بك. يجد السجل، يستدعي `generate-document`، ويُرجِع
+المستند الذي أنشأه — الذي يظهر الآن في عرض **Documents** لديك،
+تمامًا مثل مسارات قائمة الأوامر وسير العمل.
+
+هذه هي ثمرة كشف المنطق كأداة: **دالة واحدة، والعديد من نقاط الدخول** —
+قائمة الأوامر، وHTTP، وخطوة سير العمل، والآن اللغة الطبيعية.
+
+**بعد هذه الخطوة:** التطبيق كامل الميزة ومفيد حقا. حان الوقت
+لإطلاقه.
+
+
+ إضافة بيانات التعريف للسوق والنشر.
+
diff --git a/packages/twenty-docs/l/ar/developers/extend/apps/tutorials/document-generator/building-the-ui.mdx b/packages/twenty-docs/l/ar/developers/extend/apps/tutorials/document-generator/building-the-ui.mdx
new file mode 100644
index 0000000000..28eeb08ad9
--- /dev/null
+++ b/packages/twenty-docs/l/ar/developers/extend/apps/tutorials/document-generator/building-the-ui.mdx
@@ -0,0 +1,294 @@
+---
+title: 4. بناء واجهة المستخدم
+icon: table-columns
+description: المشاهدة، الملاحة الجانبية، الأوامر، والمكونات الأمامية.
+---
+
+الآن يمكن الوصول إلى الكائنات فقط من خلال الإعدادات. لنمنح التطبيق حضورًا حقيقيًا في واجهة المستخدم: عروض قائمة، وعناصر في الشريط الجانبي، وأمر **Generate document** بنقرة واحدة، ومكوّن واجهة أمامية في صفحة السجل لِـ**preview** مستند، وعلامة تبويب **editor** نصيّة منسّقة (rich-text) أصلية للقوالب.
+
+## وجهات النظر والملاحة
+
+A [view](/l/ar/developers/extend/apps/layout/views) هي قائمة محفوظة لكائن معين.
+ويضع [عنصر قائمة التنقل](/l/ar/developers/extend/apps/layout/navigation-menu-items)
+هذا العرض في الشريط الجانبي.
+
+```ts filename="src/views/documents.view.ts"
+import { defineView, ViewKey } from 'twenty-sdk/define';
+
+export default defineView({
+ universalIdentifier: DOCUMENTS_VIEW_UNIVERSAL_IDENTIFIER,
+ name: 'All documents',
+ objectUniversalIdentifier: DOCUMENT_OBJECT_UNIVERSAL_IDENTIFIER,
+ icon: 'IconFile',
+ key: ViewKey.INDEX,
+ position: 0,
+ fields: [
+ { universalIdentifier: DOCUMENTS_VIEW_NAME_FIELD_UNIVERSAL_IDENTIFIER,
+ fieldMetadataUniversalIdentifier: DOCUMENT_NAME_FIELD_UNIVERSAL_IDENTIFIER,
+ position: 0, isVisible: true, size: 280 },
+ { universalIdentifier: DOCUMENTS_VIEW_STATUS_FIELD_UNIVERSAL_IDENTIFIER,
+ fieldMetadataUniversalIdentifier: DOCUMENT_STATUS_FIELD_UNIVERSAL_IDENTIFIER,
+ position: 1, isVisible: true, size: 120 },
+ { universalIdentifier: DOCUMENTS_VIEW_TEMPLATE_FIELD_UNIVERSAL_IDENTIFIER,
+ fieldMetadataUniversalIdentifier: DOCUMENT_TEMPLATE_FIELD_UNIVERSAL_IDENTIFIER,
+ position: 2, isVisible: true, size: 200 },
+ ],
+});
+```
+
+```ts filename="src/navigation-menu-items/documents.navigation-menu-item.ts"
+import { defineNavigationMenuItem, NavigationMenuItemType } from 'twenty-sdk/define';
+
+export default defineNavigationMenuItem({
+ universalIdentifier: DOCUMENTS_NAVIGATION_MENU_ITEM_UNIVERSAL_IDENTIFIER,
+ name: 'Documents',
+ icon: 'IconFile',
+ color: 'green',
+ position: 1,
+ type: NavigationMenuItemType.VIEW,
+ viewUniversalIdentifier: DOCUMENTS_VIEW_UNIVERSAL_IDENTIFIER,
+});
+```
+
+أضف نفس زوج للنماذج. ويظهر كلاهما الآن في الشريط الجانبي:
+
+
+
+
+
+## مكون أمامي
+
+[مكون أمامي](/l/ar/developers/extend/apps/layout/front-components) هو مكون React
+مربع رملي داخل عشرين. يقرأ السجل المحدد، يحمّل قوالب الشخص
+عبر `CoreApiClient`، و POSTs إلى المسار من الفصل
+الأخير.
+
+```tsx filename="src/front-components/generate-document-form.front-component.tsx"
+import { useEffect, useState } from 'react';
+import { CoreApiClient } from 'twenty-client-sdk/core';
+import { defineFrontComponent } from 'twenty-sdk/define';
+import { enqueueSnackbar, useSelectedRecordIds } from 'twenty-sdk/front-component';
+
+const GenerateDocumentForm = () => {
+ const selectedRecordIds = useSelectedRecordIds();
+ const recordId = selectedRecordIds.length === 1 ? selectedRecordIds[0] : null;
+ const [templates, setTemplates] = useState<{ id: string; name: string }[]>([]);
+ const [templateId, setTemplateId] = useState('');
+
+ useEffect(() => {
+ new CoreApiClient()
+ .query({ documentTemplates: {
+ __args: { filter: { target: { eq: 'PERSON' } }, first: 100 },
+ edges: { node: { id: true, name: true } } } })
+ .then(({ documentTemplates }) => {
+ const list = documentTemplates?.edges?.map((e) => e.node) ?? [];
+ setTemplates(list);
+ if (list[0]) setTemplateId(list[0].id);
+ });
+ }, []);
+
+ const generate = async () => {
+ const apiBaseUrl = process.env.TWENTY_API_URL;
+ const token = process.env.TWENTY_APP_ACCESS_TOKEN ?? process.env.TWENTY_API_KEY;
+ const res = await fetch(`${apiBaseUrl}/s/documents/generate`, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` },
+ body: JSON.stringify({ templateId, recordId }),
+ }).then((r) => r.json());
+ await enqueueSnackbar({
+ message: res.success ? 'Document generated.' : 'Generation failed.',
+ variant: res.success ? 'success' : 'error',
+ });
+ };
+
+ // ...render a