Blank white background with no objects or features visible.

تعلن TrueFoundry عن استحواذها على Seldon AI، موسعة بذلك لوحة التحكم الخاصة بها للذكاء الاصطناعي للمؤسسات. البيان الصحفي الكامل →

نماذج مدفوعة بالمخطط في React: البناء باستخدام TrueFoundry FormBuilder

إذا كنت قد استخدمت TrueFoundry لنشر خدمة، أو إنشاء مجموعة، أو تكوين نموذج LLM، أو إدارة الأسرار، فقد تفاعلت مع نماذج تبدو كواجهة مستخدم عادية، ولكنها مبنية بشكل مختلف تمامًا عن نماذج الويب التقليدية.

⚡ TL;DR

TrueFoundry’s FormBuilder is a schema-driven form system that uses structured JSON to automatically render dynamic React inputs, groups, and validation logic. This architecture ensures consistent behavior across complex resource configurations, simplifies nested state management using react-hook-form, and allows for rapid development of domain-specific UIs. TrueFoundry does not hand-code every field on every screen. Instead, it uses a schema-driven form system called FormBuilder. A form is defined as structured JSON (the schema). The UI reads that schema and renders the right inputs, groups, validations, and conditional fields automatically.

This post explains how that works, in four parts:
  • What a form schema looks like
  • How fields are mapped to UI components and rendered
  • How form state is managed
  • How validation works

لماذا تستخدم TrueFoundry النماذج المدفوعة بالمخطط

غالبًا ما تمثل نماذج TrueFoundry بيانات وصفية - كائنات YAML/JSON يمكنك تطبيقها أيضًا باستخدام واجهة سطر الأوامر (CLI) (tfy apply -f ...). قد يتم تعديل نفس الكائن في واجهة المستخدم، أو تنزيله كـ YAML، أو إرساله إلى واجهة برمجة التطبيقات (API).

يمنح النهج المدفوع بالمخطط TrueFoundry ما يلي:

  • مصدر واحد للحقيقة لهيكل النموذج (يتم تحميله من الواجهة الخلفية لكل نوع مورد).
  • سلوك متسق عبر عمليات النشر، والمجموعات، والسياسات، والنماذج، والأسرار، ونماذج الإعدادات، أو أي نموذج آخر في المنصة.
  • حقول متداخلة وشرطية دون إعادة كتابة منطق النموذج في كل شاشة.
  • أدوات واجهة مستخدم (Widgets) خاصة بالمجال (محدد المجموعات، محدد الأسرار، حدود الموارد) مدمجة في بيئة تشغيل مشتركة.

النموذج الذهني: يصف المخطط شكل البيانات وكيفية تعديلها؛ ويحول FormBuilder هذا الوصف إلى نموذج عملي.

1. مخطط النموذج:

مخطط النموذج هو مصفوفة من تعريفات الحقول. كل حقل هو كائن له بعض الخصائص المهمة:

Property Purpose
jsonKey Where this field lives in the submitted object (supports nesting, e.g. image.build_source.type).
label What the user sees.
uiType Which UI component to render (text input, select, group, custom widget, etc.).
sort Display order.
validate Required, min/max, pattern, defaults, custom validators.
conditions Show/hide or enable/disable based on other fields.
subParameters Child fields for groups and repeated sections.
uiProps Extra options passed to the component (search, table view, etc.).

إليك مثال عام مبسط - ليس مخطط TrueFoundry حقيقيًا، ولكنه قريب من كيفية تفكير المنتج في التكوين:

[
  {
    "sort": 1,
    "jsonKey": "name",
    "label": "Service Name",
    "uiType": "Input",
    "validate": { "required": true, "pattern": "^[a-z0-9-]+$" }
  },
  {
    "sort": 2,
    "jsonKey": "image",
    "label": "Image",
    "uiType": "Group",
    "subParameters": [
      {
        "jsonKey": "type",
        "label": "Source",
        "uiType": "Radio",
        "validate": {
          "required": true,
          "defaultValue": "build",
          "options": [
            { "label": "Build", "value": "build" },
            { "label": "Existing image", "value": "existing" }
          ]
        }
      },
      {
        "jsonKey": "uri",
        "label": "Image URI",
        "uiType": "Input",
        "conditions": [
 		{ "jsonKey": "image.type", "op": "==", "value": "existing"  }
  ],
        "validate": { "required": true }
      }
    ]
  }
]

البيانات الوصفية/التكوين الناتج عند الإرسال:

{
  "name": "my-service",
  "image": { "type": "existing", "uri": "registry.io/app:v1" }
}

2. كيفية ربط المكونات وعرض الحقول

يتم العرض في مسار عمل صغير، والتدفق هو:

يتصفح FormBuilder شجرة المخطط ويختار مكون React لكل عقدة بناءً على uiType.

أنواع المكونات:

  • أساسي: إدخال، اختيار، زر اختيار، مفتاح تبديل، رقم
  • هيكلي: مجموعة (قسم)، هياكل (قائمة قابلة للتكرار)، KV / ENV (مفتاح-قيمة)
  • خاص بالمجال: ClusterSelect، SecretSelect، Resources، ModelSelect، PermissionsMatrix، حقول MCP، وغيرها

الشروط: إذا كان image.type لا يساوي "existing"، فإن حقل URI لا يتم تحميله أبدًا. مع shouldUnregister: true، فإنه يغادر حالة النموذج أيضًا، وبذلك لا يمكن للقيم المخفية أن تتسرب إلى الحمولة.

منطق التعيين في الكود:

// FormComponentMap
const ComponentType = FormComponents[schema.uiType]
const CustomComp = CustomComponentsMap?.[schema.uiType]

if (!enabledByCondition) return null

return CustomComp
  ? <CustomComp schema={schema} />
  : <ComponentType schema={schema} />

3. كيفية التعامل مع حالة النموذج

يستخدم FormBuilder مكتبة react-hook-form كمحرك لحالته. هذا الاختيار يؤثر على كيفية تصرف المنتج.

التهيئة/استخدام المكونات - إنشاء وتعديل:

<FormBuilder
  schema={schema}
  defaultValues={existingManifest}   // edit: pre-fill; create: empty/template
  onSubmit={(manifest) => createOrUpdate({ manifest })}
/>

إعداد النموذج:

const methods = useForm({
  mode: 'onChange',          // validate as user types
  defaultValues,
  shouldUnregister: true,    // hidden fields drop out of state
})

تسجيل الحقول - يرتبط كل إدخال بمساره الخاص:

// Inside a text field component
const { register } = useFormContext()

<input
  {...register(schema.jsonKey, registerProps)}
  defaultValue={defaultValue}
/>

سياق إضافي - تمرير بيانات وقت التشغيل الخاصة بالنموذج بشكل منفصل عن قيم الحقول:

<FormBuilder
  schema={schema}
  extraContext={{
    workspace,
    cluster,
    serviceAccountOptions,  // dynamic dropdown options
    dataTestPrefix: 'create-cluster',
  }}
/>

كائن واحد، مسارات متداخلة:

توجد جميع قيم الحقول في كائن نموذج واحد. يسجل كل حقل تحت مسار jsonKey الكامل الخاص به:

  • الاسم ← سلسلة نصية على المستوى الأعلى
  • image.type ← قيمة متداخلة
  • ports.0.container_port ← العنصر الأول في مصفوفة

عند تعديل حقل، فإنك تقوم بتعديل هذا الكائن المشترك. عند الإرسال، يقرأ FormBuilder الكائن بأكمله ويمرره إلى معالج النموذج (الذي عادةً ما يستدعي واجهة برمجة تطبيقات TrueFoundry أو ينتج YAML).

القيم الافتراضية ووضع التعديل:

عند فتح نموذج لإنشاء شيء ما، قد تكون defaultValues فارغة أو تأتي من قالب.

عند التحرير، تكون defaultValues عادةً هي البيان الحالي. تُملأ حقول النموذج مسبقًا من هذا الكائن. يتم وضع علامة "غير قابل للتغيير" على بعض الحقول في وضع التحرير (مثل اسم المورد) بحيث تظهر للقراءة فقط.

تتم إزالة الحقول المخفية من الحالة:

تستخدم نماذج TrueFoundry الخاصية shouldUnregister: true. وهذا يعني:

  • إذا كان الحقل مخفيًا بشرط، فإنه يتم إلغاء تسجيله من حالة النموذج
  • لا تتسرب قيمته إلى الحمولة المرسلة

هذا مهم للنماذج الشرطية: أنت ترسل فقط ما يمكن للمستخدم رؤيته وتعديله بالفعل.

4. كيفية عمل التحقق

يتم التحقق في نماذج TrueFoundry على طبقتين.

الطبقة 1: التحقق من المخطط (إعلاني)

يمكن لكتلة التحقق لكل حقل أن تحدد:

  • مطلوب
  • الحد الأدنى / الحد الأقصى (النطاق المسموح به للقيمة العددية الصحيحة)
  • الحد الأدنى للطول / الحد الأقصى للطول (طول السلسلة النصية أو المصفوفة)
  • النمط (تعبير نمطي) مع رسالة مخصصة
  • القيمة الافتراضية
  • غير قابل للتغيير (للقراءة فقط في وضع التحرير)

يتم تحويل هذه القواعد إلى قواعد تحقق خاصة بـ react-hook-form. تظهر الأخطاء مباشرة بجانب الحقل. يتم تشغيل التحقق عند التغيير (الوضع: 'onChange')، حتى يتلقى المستخدمون ملاحظات فورية أثناء الكتابة، وليس فقط عند الإرسال.

الطبقة 2: التحقق المخصص وغير المتزامن

يمكن للمخططات أيضًا إرفاق دالة تحقق مخصصة، تُستخدم عادةً لـ:

  • تفرد الاسم ("كيان بهذا الاسم موجود بالفعل")
  • عمليات تحقق مدعومة بواجهة برمجة التطبيقات قبل الإرسال
  • قواعد الربط بين الحقول داخل مكون مخصص
  • تُرفق الشاشات هذه القواعد في وقت التشغيل باستخدام أدوات مساعدة مثل "إرفاق التحقق باسم الحقل". تعرض واجهة المستخدم مؤشر تحميل أثناء تشغيل التحقق غير المتزامن (مثل فحص الاسم المؤجل).
useAttachValidation(schema, {
  name: async (name) => {
    const taken = await checkNameExists(name)
    return taken ? 'Name already exists' : true
  },
})

لنجمع كل ذلك: تجربتك كمستخدم

عند فتح "إنشاء مجموعة"، "نشر خدمة"، "إضافة نموذج"، أو "إدارة الأسرار":

  • يقوم TrueFoundry بتحميل (أو بناء) مخطط لهذا المورد
  • يعرض FormBuilder كل عقدة مخطط كمكون الإدخال المطلوب
  • تُحدّث تعديلاتك كائن نموذج متداخلاً واحدًا
  • يتم التحقق بشكل مستمر ومرة أخرى عند الإرسال
  • الكائن النهائي هو بيان (manifest) - بنفس الشكل الذي ستستخدمه في YAML أو واجهة سطر الأوامر (CLI)

لهذا السبب يمكن لـ TrueFoundry دعم واجهات مستخدم معقدة للغاية للتكوين دون أن تكون كل شاشة نموذجًا فريدًا: تكمن التعقيدات في المخطط ومكتبة مكونات الحقول، والتي يتم تنسيقها بواسطة بيئة تشغيل مشتركة واحدة.

The fastest way to build, govern and scale your AI

Sign Up
Table of Contents

One Gateway for Every LLM, Agent and MCP Server

Book a 30-min with our AI expert

Book a Demo

The fastest way to build, govern and scale your AI

Book Demo
Summarize with
ChatGPT logo by OpenAI
Perplexity AI logo
Blurry red snowflake on white background, symmetrical frosty design with soft edges and abstract shape.

Discover More

No items found.
July 4, 2026
|
5 min read

تكاملات منصة التعلم الآلي #1: Weights & Biases

Use Cases
Engineering and Product
July 4, 2026
|
5 min read

تكامل Pillar Security مع TrueFoundry

No items found.
July 4, 2026
|
5 min read

التخزين المؤقت الدلالي لنماذج اللغة الكبيرة (LLMs): تقليل التكلفة وزمن الاستجابة بما يتجاوز التخزين المؤقت للبادئات

No items found.
July 4, 2026
|
5 min read

تكاملات أدوات التعلم الآلي #2 DVC لإدارة إصدارات بياناتك

Engineering and Product
Use Cases
No items found.

Recent Blogs

Black left pointing arrow symbol on white background, directional indicator.
Black left pointing arrow symbol on white background, directional indicator.

Frequently asked questions

Why choose a schema-driven approach over hand-coding forms?

Schema-driven forms provide a single source of truth for your configuration manifests. They ensure consistent UI behavior, support nested/conditional logic without repeated code, and allow the backend to drive the form structure dynamically.

How does validation work in FormBuilder?

Validation happens in two layers: Declarative schema validation (using rules like required, pattern, or min/max) and Custom/Async validation for API-backed checks, such as verifying unique resource names.

Can I integrate this with existing React libraries?

Yes. TrueFoundry's FormBuilder uses react-hook-form as its core state engine, making it compatible with standard React patterns and easy to extend with custom components.

Take a quick product tour
Start Product Tour
Product Tour