assistant-ui 接入
assistant-ui 项目已经用 @assistant-ui/react-streamdown 渲染文本消息时,可以用 @slexkit/assistant-ui 替换 text part 里的 slex language block。thread、composer、message parts、runtime 和 tool UI 仍由 assistant-ui 处理。
下面的可运行演示是一个静态 assistant-ui transcript,用于验证 adapter 在 assistant-ui message-part 上下文中的渲染行为;它不连接模型、API key 或 ToolHost 流程。
bun run --filter @slexkit/assistant-ui build
bun examples/dev-server.mjs assistant-ui
源码位于 examples/assistant-ui。页面用 useExternalStoreRuntime 和 AssistantRuntimeProvider 构造 thread,再通过 SlexKitAssistantStreamdownText 渲染 text parts。
安装:
npm install slexkit @slexkit/theme-shadcn @slexkit/streamdown @slexkit/assistant-ui @assistant-ui/react @assistant-ui/react-streamdown streamdown react react-dom
导入样式:
import "@slexkit/theme-shadcn/style.css";
import "@slexkit/assistant-ui/style.css";
接到 assistant message:
import { MessagePrimitive } from "@assistant-ui/react";
import { SlexKitAssistantStreamdownText } from "@slexkit/assistant-ui";
export function AssistantMessage() {
return (
<MessagePrimitive.Root>
<MessagePrimitive.Parts>
{({ part }) =>
part.type === "text" ? (
<SlexKitAssistantStreamdownText
artifactId="message-1"
runtime="secure"
secureFrame={{ runtimeUrl: "/slexkit.runtime.js" }}
/>
) : null
}
</MessagePrimitive.Parts>
</MessagePrimitive.Root>
);
}
模型输出示例:
<div class="slex-prerender-placeholder" data-slex-source="bmFtZXNwYWNlOiAiYXNzaXN0YW50X3N0YXR1cyIsCiAgZzoge30sCiAgbGF5b3V0OiB7CiAgICAidGV4dDpzdGF0dXMiOiB7IHRleHQ6ICJSZW5kZXJlZCBpbnNpZGUgYXNzaXN0YW50LXVpLiIgfQogIH0KfQ=="><pre><code class="language-slex">namespace: "assistant_status",
g: {},
layout: {
"text:status": { text: "Rendered inside assistant-ui." }
}
}</code></pre></div>
处理范围
| 项目 | 约定 |
|---|---|
| Fence language | slex |
| Runtime | 默认 secure |
| Markdown host | @assistant-ui/react-streamdown |
| ToolHost | 不处理 |
ToolHost/tool-call 渲染需要单独接入。这个 adapter 只处理 assistant-ui text message parts 里的 Markdown fence runtime。
项目已有 StreamdownTextPrimitive 包装时,可以用 createSlexKitAssistantStreamdownComponents() 只合并 slex language override。