Skip to main content
Design a universal schema UI extension specification
👌 Sure, let me help you design a universal Schema UI extension specification that can be applied to all configuration schemas in your plugin system, enabling unified rules for frontend rendering.
Extend JSON Schema with a reserved field:
The frontend UI renderer determines which component to use, how to display, and how to handle dynamic linkage based on the contents of x-ui.

1. Basic Fields



3. Validation & Interaction


4. Special Component Conventions

modelProviderSelect

  • Used to select model providers (OpenAI, Anthropic, Azure, Ollama, etc.)
  • dataSource = "system.providers"

modelSelect

  • Used to select specific models
  • Depends on provider
  • dataSource = "system.models"
  • dependency = "provider"

promptEditor

  • Used to edit prompts, supports multiline, syntax highlighting, variable interpolation

jsonEditor

  • Used to edit JSON objects, with format validation

codeEditor

  • Used to edit code (supports language highlighting, e.g. js, ts, python)

5. Example Schema


With this approach:
  • The frontend UI renderer only needs to recognize x-ui.component, with other logic driven by the x-ui field.
  • Plugin developers only need to write the schema to automatically get an intelligent configuration experience.
  • Highly extensible, can be adapted for future Embedding, OCR, VLM, VectorStore plugins.

How to represent SECRET input fields

Great question 👍, SECRET type fields (such as API Key, Token, password) need special handling in the schema UI:
  1. Frontend should render as a password input (type="password" or masked).
  2. Storage should distinguish: do not display the original value, use "******" or empty value as a placeholder.
  3. Schema can explicitly mark so the frontend UI renderer knows it’s a secret field.

Extension Specification Solution

Add component: "secretInput" in x-ui, supporting the following properties:

Example Schema


Frontend Rendering Effect

  • apiKey is displayed as a password input, masked by default.
  • If revealable: true, there is an 👁 button to toggle show/hide.
  • When editing configuration, if the backend returns "******" it means a value exists; if unchanged, the original value is used.

Additional Security Considerations

  • When submitting the form, if apiKey === "******", keep the old value on the backend.
  • If a new value is submitted, the backend replaces the old value.
  • When exporting configuration or logging, skip SECRET fields.

Would you like me to further abstract the SECRET field into a generic interface (e.g. ISchemaSecretField) to clearly distinguish it from regular fields?

Abstract as a Generic Interface

👌 Sure, let’s abstract the SECRET field into a generic interface, so it’s consistent with regular fields but clearly marked as sensitive.

🔐 Generic Interface Design

This way, SECRET fields inherit the same specification as regular UI fields, with additional properties for sensitive information handling.

🔧 Usage Example


🔒 Frontend Handling Specification

  1. Rendering:
    • secretInput renders as a password field (type=password).
    • If revealable: true, add 👁 toggle button.
  2. Loading Configuration:
    • Backend returns ****** to indicate a value exists, frontend does not show the real value.
  3. Saving Configuration:
    • If the submitted value is still ****** → keep the old value.
    • If a new value is submitted → update and overwrite the old value.
  4. Export/Logging:
    • Ignore SECRET fields or output ****** to avoid leaks.

Now secretInput is a first-class UI component, just like textInput or select, and can be uniformly driven by the schema. Would you like me to define a complete ISchemaUIComponent union type to standardize all x-ui components (select, slider, secretInput, promptEditor, etc.)?