跳到内容

@mfui/server

@mfui/server 是服务端 SDK,用于生成 MFUI 提示词、解析模型输出、 校验组件 spec,并返回 MFUI 语义 SSE 响应。

大多数 adapter 包会在内部使用这些基础能力。应用服务端只有在自定义模型接入时, 才需要直接使用这些原语。

createMFUIPrompt()

为当前请求可用的组件和布局生成模型提示词。提示词会告诉模型如何输出普通文本,以及什么时候插入 <mfui> 块。

Import

ts
import { createMFUIPrompt } from '@mfui/server';

Signature

ts
function createMFUIPrompt(mfui: MFUIManifest): string

入参

名称类型是否必填默认值描述
mfuiMFUIManifest当前模型请求可用的组件和布局。nullundefined 会被视为未启用 MFUI。

返回值

类型描述
string包含组件描述、布局描述、JSON Schema、示例和 MFUI block 指令的提示词。当 MFUI 未启用或没有组件和布局时返回空字符串。

示例

ts
import { createMFUIPrompt } from '@mfui/server';

const system = [
  'You are a helpful assistant.',
  createMFUIPrompt(mfui),
].filter(Boolean).join('\n\n');

Throws

当传入 manifest 形状非法时抛出 MFUIServerError

buildComponentCatalogText()

只生成 MFUI 提示词里的组件目录部分。

Import

ts
import { buildComponentCatalogText } from '@mfui/server';

Signature

ts
function buildComponentCatalogText(mfui: MFUIManifest): string

入参

名称类型是否必填默认值描述
mfuiMFUIManifest要展示给模型的组件。nullundefined 会被视为未启用 MFUI。

返回值

类型描述
string人类可读的组件目录文本。没有组件时返回空字符串。

buildLayoutCatalogText()

只生成 MFUI 提示词里的布局目录部分。

Import

ts
import { buildLayoutCatalogText } from '@mfui/server';

Signature

ts
function buildLayoutCatalogText(mfui: MFUIManifest): string

入参

名称类型是否必填默认值描述
mfuiMFUIManifest要展示给模型的内置布局。nullundefined 会被视为未启用 MFUI。

返回值

类型描述
string人类可读的布局目录文本。没有布局时返回空字符串。

MFUIManifest

从客户端发送到服务端的可序列化 manifest。

字段类型是否必填默认值描述
componentsComponentManifest[]当前模型请求可用的组件。
layoutsArray<{ name: string; model?: { description: string; whenToUse?: string; examples?: Array<{ user: string; spec: unknown }> }; metadata?: JsonObject }>当前模型请求可用的内置布局。

ComponentManifest

单个组件的可序列化 manifest。

字段类型是否必填默认值描述
namestring稳定组件名,用于模型输出、流事件和渲染器查找。
schemaJsonSchema组件 spec 的 JSON Schema。
projection{ text: string }把合法组件 spec 投影成可移植文本的模板。
model{ description: string; whenToUse?: string; examples?: Array<{ user: string; spec: unknown }> }createMFUIPrompt() 使用的模型侧组件说明。
metadataJsonObject可序列化应用元数据。

JsonSchema

服务端用于校验组件 spec 的 JSON Schema 对象。

结构

ts
type JsonSchema = JsonObject

JsonObject

JSON 兼容对象结构。

结构

ts
type JsonObject = Record<string, unknown>

createMFUIStreamWriter()

创建 MFUI 语义 SSE writer。自定义 provider adapter,或者在服务端测试 MFUI stream 时可以直接使用。

Import

ts
import { createMFUIStreamWriter } from '@mfui/server';

Signature

ts
function createMFUIStreamWriter(
  mfui: MFUIManifest,
  options?: MFUIStreamWriterOptions,
): MFUIStreamWriter

入参

名称类型是否必填默认值描述
mfuiMFUIManifest用于校验组件快照并渲染投影的 manifest。
optionsMFUIStreamWriterOptions{}Writer 选项。

返回值

类型描述
MFUIStreamWriter负责输出 MFUI 语义 SSE 事件并暴露 Response 的状态对象。

示例

ts
import {
  createMFUIBlockParser,
  createMFUIStreamWriter,
} from '@mfui/server';

const writer = createMFUIStreamWriter(mfui);
const parser = createMFUIBlockParser(mfui, writer);

parser.write('Here is the plan:\n\n');
parser.write('<mfui>{"component":"app.task_list","spec":{"title":"Next","items":[]}}</mfui>');
parser.close();

return writer.response();

Throws

当传入 manifest 形状非法时抛出 MFUIServerError

MFUIStreamWriterOptions

createMFUIStreamWriter() 的选项。

字段类型是否必填默认值描述
idstring生成的 msg_* id用在 message.startmessage.end 事件里的消息 id。

MFUIStreamWriter

createMFUIStreamWriter() 返回的 writer。

方法类型描述
start()() => void如果 stream 尚未开始,则输出 message.starttext()component()end() 会自动调用它。
text(text, options)(text: string, options?: { partId?: string }) => void输出 text delta,并追加到当前投影消息中。空字符串会被忽略。
component(input)(input: MFUIComponentInput) => ProjectedComponentPart校验组件 spec、渲染投影、输出 component.snapshot,并返回投影后的 component part。
error(input)(input: MFUIStreamErrorInput) => void输出 MFUI error 事件并关闭 stream。
end(options)(options?: MFUIStreamWriterEndOptions) => void输出带最终 portable text 的 message.end,并关闭 stream。
response(init)(init?: ResponseInit) => Response返回由 writer stream 驱动的 text/event-stream Response
snapshot()() => ProjectedMessage | undefined返回当前投影消息;stream 开始前返回 undefined

MFUIComponentInput

MFUIStreamWriter.component() 的入参。

字段类型是否必填默认值描述
idstring生成的 cmp_* idComponent part id。
componentstring组件名。必须匹配 manifest 中的组件。
specunknown要校验并投影的组件 spec。
metadataJsonObject附加到 component part 和 stream event 的应用元数据。

MFUIStreamWriterEndOptions

MFUIStreamWriter.end() 的选项。

字段类型是否必填默认值描述
usage{ inputTokens?: number; outputTokens?: number }可选模型用量,会包含在最终 message.end 事件中。

MFUIStreamErrorInput

MFUIStreamWriter.error() 的入参。

字段类型是否必填默认值描述
codestring机器可读错误码。
messagestring人类可读错误信息。
recoverableboolean客户端是否可能恢复。

ProjectedMessage

MFUIStreamWriter.snapshot() 和 adapter onMessage 回调使用的投影消息结构。

字段类型是否必填默认值描述
idstring消息 id。
partsProjectedMessagePart[]投影后的文本、组件和布局 parts。
portableTextstring消息的确定性文本表示。
metadataJsonObject应用元数据。

createMFUIBlockParser()

创建 parser,把 provider 文本输出里的 <mfui> 块转换成 MFUI stream writer 调用。

Import

ts
import { createMFUIBlockParser } from '@mfui/server';

Signature

ts
function createMFUIBlockParser(
  mfui: MFUIManifest,
  writer: MFUIStreamWriter,
  options?: MFUIBlockParserOptions,
): MFUIBlockParser

入参

名称类型是否必填默认值描述
mfuiMFUIManifest当前 manifest。保留该参数是为了和 writer 构造保持一致。
writerMFUIStreamWriter接收解析后 text 和 component 调用的 writer。
optionsMFUIBlockParserOptions{}Parser 选项。

返回值

类型描述
MFUIBlockParser用于 provider 文本 chunk 的增量 parser。

Throws

遇到格式错误或非法的 MFUI block 时抛出 MFUIServerError。抛出前 writer 也会输出一个 error 事件。

MFUIBlockParserOptions

createMFUIBlockParser() 的选项。

字段类型是否必填默认值描述
maxBlockLengthnumber65536单个打开的 <mfui> block 里允许的最大字符数。

MFUIBlockParser

createMFUIBlockParser() 返回的增量 parser。

方法类型描述
write(text)(text: string) => void处理下一个 provider 文本 chunk。普通文本会发送给 writer.text(),完整 MFUI block 会解析后发送给 writer.component()
flush()() => void刷出缓冲的普通文本,但不结束 writer。如果 MFUI block 仍处于打开状态则抛错。
close(options)(options?: MFUIStreamWriterEndOptions) => void刷出缓冲文本,并调用 writer.end(options)

MFUI_BLOCK_TAG

模型文本里包裹 MFUI 组件 payload 的 XML 风格 tag 名。

Import

ts
import { MFUI_BLOCK_TAG } from '@mfui/server';

ts
const MFUI_BLOCK_TAG = 'mfui'

parseMFUIBlockPayload()

解析 <mfui> block 内部的 JSON payload。

Import

ts
import { parseMFUIBlockPayload } from '@mfui/server';

Signature

ts
function parseMFUIBlockPayload(payload: string): MFUIComponentInput

入参

名称类型是否必填默认值描述
payloadstring<mfui></mfui> 之间的原始 JSON 字符串。

返回值

类型描述
MFUIComponentInput从 block payload 中解析出的组件名和 spec。

Throws

当 payload 不是合法 JSON、不是对象,或缺少 component/spec 时抛出 MFUIServerError

validateMFUIManifest()

校验 MFUI manifest 的结构。

Import

ts
import { validateMFUIManifest } from '@mfui/server';

Signature

ts
function validateMFUIManifest(mfui: MFUIManifest): ValidationResult

入参

名称类型是否必填默认值描述
mfuiMFUIManifest要校验的 manifest。

返回值

类型描述
ValidationResult合法时为 { ok: true },否则为 { ok: false, errors }

assertValidMFUIManifest()

校验 manifest,并在非法时抛错。

Import

ts
import { assertValidMFUIManifest } from '@mfui/server';

Signature

ts
function assertValidMFUIManifest(mfui: MFUIManifest): void

入参

名称类型是否必填默认值描述
mfuiMFUIManifest要校验的 manifest。

返回值

类型描述
void合法时不返回任何内容。

Throws

非法时抛出 code 为 invalid_component_manifestMFUIServerError

validateSpecWithManifest()

使用单个 component manifest 校验单个组件 spec。

Import

ts
import { validateSpecWithManifest } from '@mfui/server';

Signature

ts
function validateSpecWithManifest(
  manifest: ComponentManifest,
  spec: unknown,
): ValidationResult

入参

名称类型是否必填默认值描述
manifestComponentManifest包含 JSON Schema 的 component manifest。
specunknown要校验的组件 spec。

返回值

类型描述
ValidationResultAJV 产生的校验结果。

ValidationResult

校验成功或失败的联合类型。

结构

ts
type ValidationResult = ValidationSuccess | ValidationFailure

ValidationSuccess

校验成功结果。

字段类型是否必填默认值描述
oktrue成功判别字段。

ValidationFailure

校验失败结果。

字段类型是否必填默认值描述
okfalse失败判别字段。
errorsstring[]校验错误信息。

MFUIMessageHandler

Adapter onMessage 选项使用的回调类型。

结构

ts
type MFUIMessageHandler = (message: ProjectedMessage) => void | Promise<void>

MFUIErrorHandler

Adapter onError 选项使用的回调类型。

结构

ts
type MFUIErrorHandler = (error: unknown) => void | Promise<void>

MFUIResponseHooks

Adapter response options 复用的回调对象结构。

字段类型是否必填默认值描述
onMessageMFUIMessageHandlerMFUI response 完成处理后,使用最终投影消息调用。
onErrorMFUIErrorHandlerprovider stream 处理或 MFUI block 解析失败时调用。

MFUIServerError

服务端校验、提示词、writer 和 block parser helper 抛出的错误结构。

字段类型是否必填默认值描述
messagestring来自 Error 的人类可读错误信息。
codestringMFUI 机器可读错误码。
statusnumberMFUI 校验错误默认为 400面向 HTTP 的状态码。

SemanticStreamEvent

MFUIStreamWriter 输出的 MFUI 语义 SSE 事件联合类型。

结构

ts
type SemanticStreamEvent =
  | { type: 'message.start'; id: string; createdAt?: string }
  | { type: 'text.delta'; partId: string; text: string }
  | { type: 'component.snapshot'; partId: string; component: string; spec: unknown; projection: { text: string }; metadata?: JsonObject }
  | { type: 'layout.snapshot'; partId: string; layout: 'mfui.columns'; columns: unknown[]; projection: { text: string }; metadata?: JsonObject }
  | { type: 'message.end'; id: string; portableText: string; usage?: { inputTokens?: number; outputTokens?: number } }
  | { type: 'error'; code: string; message: string; recoverable?: boolean }