跳到内容

组件

组件定义描述模型可以生成的结构化内容,以及这些内容如何投影成稳定文本。MFUI 使用组件定义生成模型提示、校验模型输出,并为没有对应渲染器的客户端提供文本兜底。

一个组件定义由以下部分组成:

  • name
  • schema
  • model 提示
  • projection 模板

组件定义不包含视觉渲染器,也不定义交互逻辑。应用仍然负责 UI、状态和业务流程。

自定义组件

当内置组件不能表达你的业务语义时,可以定义自定义组件。自定义组件应该表达领域内容,例如订单状态、账户摘要或报价结果,而不是只包装 Markdown 或视觉排列方式。

使用带命名空间的组件名,能让模型输出、服务端校验、渲染器查找和持久化历史保持明确。应用自己的定义建议使用应用或领域前缀,例如 app.order_statuscrm.account_summary,不要使用 timeline 这类无前缀名称。

ts
import { createMFUIManifest, defineMFUIComponent } from '@mfui/client';
import { z } from 'zod';

const orderStatus = defineMFUIComponent({
  name: 'app.order_status',
  schema: z.object({
    orderId: z.string(),
    status: z.string(),
  }),
  model: {
    description: 'Show the current status of an order.',
  },
  projection: {
    text: '**Order {{ orderId }}:** {{ status }}',
  },
});

渲染器仍然留在你的应用里。发送请求时,把组件定义传给 createMFUIManifest();它会生成本次请求的可序列化 manifest,让服务端知道允许模型生成哪些组件。

ts
const mfui = createMFUIManifest({
  components: [orderStatus],
});

内置组件

MFUI 在 @mfui/client/definitions 下提供一组常用语义组件。内置组件也只是定义:它们提供 schema、模型提示和投影模板,不包含渲染器。

内置组件不会默认加入请求。应用需要把本次要启用的定义放进 manifest;可以只选择其中一部分,也可以和自定义组件混用。服务端只会把当前 manifest 中包含的组件暴露给模型。

如果客户端没有为某个内置组件提供渲染器,可以显示 part.projection.text

下面示例启用全部当前内置组件;实际使用时可以只选择需要的定义。

ts
import { createMFUIManifest } from '@mfui/client';
import {
  alertDefinition,
  timelineDefinition,
  formDefinition,
  barChartDefinition,
  lineChartDefinition,
  pieChartDefinition,
} from '@mfui/client/definitions';

const mfui = createMFUIManifest({
  components: [
    alertDefinition,
    timelineDefinition,
    formDefinition,
    barChartDefinition,
    lineChartDefinition,
    pieChartDefinition,
  ],
});

mfui.alert

用于展示需要从普通正文中突出的上下文消息,例如信息、成功、警告或错误提示。

字段类型是否必填描述
type'info' | 'success' | 'warning' | 'error'提示类型。
titlestring简短标题。
descriptionstring主要提示内容。

投影会包含提示类型、可选标题和描述。

mfui.timeline

用于展示有顺序的事件、计划、里程碑或日程。

字段类型是否必填描述
titlestring时间线标题。
itemsTimelineItem[]一个或多个有序条目。

投影会包含标题,并按顺序列出每个条目。

TimelineItem

字段类型是否必填描述
timestring时间、日期或阶段标签。
titlestring条目标题。
descriptionstring条目补充说明。

mfui.form

用于描述一个简短表单,让用户补充结构化信息。

字段类型是否必填描述
titlestring表单标题。
descriptionstring可选表单说明。
fieldsFormField[]一个或多个字段。
submitTextstring提交按钮文案。

FormField 可以是以下任一字段类型。

InputField

字段类型是否必填描述
type'input'单行输入字段。
namestring字段名,通常作为提交值里的 key。
labelstring展示给用户的字段标签。
descriptionstring字段说明。
requiredboolean是否必填。
inputType'text' | 'email' | 'password' | 'url' | 'tel' | 'number'输入类型。
placeholderstring占位文本。
defaultValuestring默认值。

TextareaField

字段类型是否必填描述
type'textarea'多行文本输入字段。
namestring字段名,通常作为提交值里的 key。
labelstring展示给用户的字段标签。
descriptionstring字段说明。
requiredboolean是否必填。
placeholderstring占位文本。
defaultValuestring默认值。

ChoiceField

字段类型是否必填描述
type'choice'选项字段,可渲染为 select、radio 或 checkbox 等控件。
namestring字段名,通常作为提交值里的 key。
labelstring展示给用户的字段标签。
descriptionstring字段说明。
requiredboolean是否必填。
optionsChoiceOption[]一个或多个可选项。
multipleboolean是否允许多选。
placeholderstring占位文本。
defaultValuestring | string[]默认选中值。多选时可以使用字符串数组。

ChoiceOption

字段类型是否必填描述
labelstring展示给用户的选项文案。
valuestring选项值。
descriptionstring选项补充说明。

SwitchField

字段类型是否必填描述
type'switch'开关字段。
namestring字段名,通常作为提交值里的 key。
labelstring展示给用户的字段标签。
descriptionstring字段说明。
requiredboolean是否必填。
defaultValueboolean默认开关状态。

DateField

字段类型是否必填描述
type'date'日期字段。
namestring字段名,通常作为提交值里的 key。
labelstring展示给用户的字段标签。
descriptionstring字段说明。
requiredboolean是否必填。
placeholderstring占位文本。
defaultValuestring默认日期值。

TimeField

字段类型是否必填描述
type'time'时间字段。
namestring字段名,通常作为提交值里的 key。
labelstring展示给用户的字段标签。
descriptionstring字段说明。
requiredboolean是否必填。
placeholderstring占位文本。
defaultValuestring默认时间值。

DatetimeField

字段类型是否必填描述
type'datetime'日期时间字段。
namestring字段名,通常作为提交值里的 key。
labelstring展示给用户的字段标签。
descriptionstring字段说明。
requiredboolean是否必填。
placeholderstring占位文本。
defaultValuestring默认日期时间值。

mfui.form 不定义提交行为。应用可以自行决定提交后是禁用表单、替换成文本、发送新的用户消息,还是执行其它业务流程。

mfui.bar_chart

用于分类数值对比。可选的 series 可以表达分组柱状图。

字段类型是否必填描述
titlestring图表标题。
descriptionstring可选上下文。
xLabelstringX 轴标签。
yLabelstringY 轴标签。
unitstring单位后缀或单位标签,例如 usersUSD%
dataBarChartDataPoint[]数据点,最多 100 个。

BarChartDataPoint

字段类型是否必填描述
labelstring分类标签。
valuenumber数值。
seriesstring分组名称。

mfui.line_chart

用于时间趋势或其它有序轴上的数值变化。可选的 series 可以表达多条折线。

字段类型是否必填描述
titlestring图表标题。
descriptionstring可选上下文。
xLabelstringX 轴标签。
yLabelstringY 轴标签。
unitstring单位后缀或单位标签,例如 usersUSD%
dataLineChartDataPoint[]有序数据点,最多 100 个。

LineChartDataPoint

字段类型是否必填描述
labelstring时间点、阶段或有序轴标签。
valuenumber数值。
seriesstring折线系列名称。

mfui.pie_chart

用于展示非负数值在整体中的组成关系。

字段类型是否必填描述
titlestring图表标题。
descriptionstring可选上下文。
unitstring单位后缀或单位标签,例如 %
dataPieChartDataPoint[]非负分类数值,最多 100 个。

PieChartDataPoint

字段类型是否必填描述
labelstring分类标签。
valuenumber非负数值。