跳到内容

@mfui/ai-sdk

@mfui/ai-sdk 把 Vercel AI SDK 的流式结果转换成 MFUI 语义 SSE 流。

当服务端已经使用 streamText(),或其他暴露 textStreamfullStreamconsumeStream() 的 AI SDK API 时,使用这个包。

createMFUIResponse()

根据 AI SDK 流式结果创建 MFUI 语义 SSE Response

Import

ts
import { createMFUIResponse } from '@mfui/ai-sdk';

Signature

ts
function createMFUIResponse(
  result: AISDKMFUIResponseResult,
  mfui: MFUIManifest,
  options?: AISDKMFUIResponseOptions,
): Response

入参

名称类型是否必填默认值描述
resultAISDKMFUIResponseResultAI SDK 流式结果。
mfuiMFUIManifest当前请求可用的组件。
optionsAISDKMFUIResponseOptions{}Response、parser、writer 和生命周期选项。

返回值

类型描述
Response输出 MFUI 语义 SSE 事件的 text/event-stream response。

示例

ts
import { openai } from '@ai-sdk/openai';
import { streamText } from 'ai';
import { createMFUIPrompt } from '@mfui/server';
import { createMFUIResponse } from '@mfui/ai-sdk';

const result = streamText({
  model: openai('gpt-4o-mini'),
  system: [
    'You are a helpful assistant.',
    createMFUIPrompt(mfui),
  ].join('\n\n'),
  messages,
});

return createMFUIResponse(result, mfui, {
  onMessage(message) {
    saveAssistantMessage(message);
  },
});

注意事项

createMFUIResponse() 会优先使用 result.textStream,然后是 result.fullStream,最后回退到 result.consumeStream()

AISDKMFUIResponseResult

createMFUIResponse() 接受的 AI SDK result 结构。

字段类型是否必填默认值描述
consumeStream(options)(options?: { onError?: (error: unknown) => void }) => Promise<void>消费 stream 的 AI SDK 方法。缺少 textStreamfullStream 时使用。
textStreamAsyncIterable<string>普通文本 chunk stream。存在时优先使用。
fullStreamAsyncIterable<AISDKMFUIChunk>AI SDK chunk stream。缺少 textStream 时使用。
totalUsagePromiseLike<AISDKUsage> | AISDKUsageStream 消费后读取的 token 用量,优先级高于 usage
usagePromiseLike<AISDKUsage> | AISDKUsageToken 用量 fallback。

AISDKMFUIResponseOptions

createMFUIResponse() 的选项。

字段类型是否必填默认值描述
closebooleantrueAI SDK stream 结束时是否关闭 MFUI parser 和 writer。
parserMFUIBlockParserOptions{}传给 createMFUIBlockParser() 的选项。
writerMFUIStreamWriterOptions{}传给 createMFUIStreamWriter() 的选项。
responseInitResponseInit{}传给返回 Response 的 init 对象。
onMessageMFUIMessageHandlerMFUI response 完成后,使用最终投影消息调用。
onErrorMFUIErrorHandlerStream 处理或 MFUI block 解析失败时调用。

AISDKMFUIChunk

writeMFUIChunk() 消费的 AI SDK full-stream chunk 结构。

结构

ts
type AISDKMFUIChunk =
  | { type: 'text'; text: string }
  | { type: 'text-delta'; text: string }
  | { type: 'text-delta'; textDelta: string }
  | { type: 'finish'; totalUsage?: AISDKUsage }
  | { type: 'error'; error: unknown }
  | Record<string, unknown>

注意事项

MFUI 只读取 text chunk 和 text-delta chunk,其他 chunk 会被忽略。

AISDKUsage

复制到最终 MFUI message.end 事件里的 token 用量结构。

字段类型是否必填默认值描述
inputTokensnumber输入 token 数。
outputTokensnumber输出 token 数。

createMFUIOnChunk()

创建一个 AI SDK onChunk 回调,把文本 chunk 写入 MFUI block parser。

Import

ts
import { createMFUIOnChunk } from '@mfui/ai-sdk';

Signature

ts
function createMFUIOnChunk(
  parser: MFUIBlockParser,
): (event: { chunk: AISDKMFUIChunk }) => void

入参

名称类型是否必填默认值描述
parserMFUIBlockParser接收 AI SDK 文本 chunk 的 MFUI block parser。

返回值

类型描述
(event: { chunk: AISDKMFUIChunk }) => void可传给暴露 chunk event 的 AI SDK API 的回调。

writeMFUIChunk()

把单个 AI SDK full-stream chunk 写入 MFUI block parser。

Import

ts
import { writeMFUIChunk } from '@mfui/ai-sdk';

Signature

ts
function writeMFUIChunk(
  chunk: AISDKMFUIChunk,
  parser: MFUIBlockParser,
): void

入参

名称类型是否必填默认值描述
chunkAISDKMFUIChunkAI SDK chunk。只有文本 chunk 会写入 parser。
parserMFUIBlockParser接收 AI SDK 文本 chunk 的 MFUI block parser。

返回值

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

consumeMFUIStream()

通过 result.consumeStream() 消费 AI SDK stream,然后关闭或 flush MFUI block parser。

Import

ts
import { consumeMFUIStream } from '@mfui/ai-sdk';

Signature

ts
function consumeMFUIStream(
  result: AISDKConsumeStreamResult,
  parser: MFUIBlockParser,
  options?: { close?: boolean },
): Promise<void>

入参

名称类型是否必填默认值描述
resultAISDKConsumeStreamResult包含 consumeStream() 的 AI SDK result。
parserMFUIBlockParser要关闭或 flush 的 MFUI block parser。
options{ close?: boolean }{}closefalse 时调用 parser.flush(),否则调用 parser.close()

返回值

类型描述
Promise<void>AI SDK stream 消费完成,且 parser flush 或 close 后 resolve。

AISDKConsumeStreamResult

consumeMFUIStream() 消费的最小 AI SDK result 结构。

字段类型是否必填默认值描述
consumeStream(options)(options?: { onError?: (error: unknown) => void }) => Promise<void>用于消费 AI SDK stream 的方法。
totalUsagePromiseLike<AISDKUsage> | AISDKUsageStream 消费后读取的 token 用量,优先级高于 usage
usagePromiseLike<AISDKUsage> | AISDKUsageToken 用量 fallback。