useAiChat 数据响应流
@yh-ui/hooks 提供了极其强大的 纯逻辑 Headless Hooks 抽象 系列。其中以 useAiChat 和 useAiConversations 为核心的数据引擎更是做到了完全与视觉解耦。
传统情况中,如果你需要接入后端模型接口,还要自己写网络 Fetch、维护 Token 流解析、实现历史记录与中止操作(Abort),不仅恶心而且极难做到组件通用。
现在,你只需注入一个你自定义的 request 函数接口给 useAiChat 挂靠,即可开箱即大地拿到所有 AI 全链路状态。
基础请求接管
利用纯纯的 Promise 完成接管和状态隔离,再也不需要手动 refloading = true 甚至自己去维护 messages.push。这一切已经在内部完全闭环。
极简接管
原生事件流(Stream)与随时中断
市面上诸多模型为了更低的首字节延时(TTFB)会采用 text/event-stream。 只要让你的 request 变成 AsyncGenerator(异步生成器返回 yield),也就是一个大文本块块。这个 Hook 内部会自动为你转化为精美的连贯打字流!
并在调用 stop() API 的同时利用原生 AbortController 立即拦截接口和后续 DOM 的渲染。
流式生成与强制中止
会话侧边状态漫游 (useAiConversations)
如果你要写一整个类似 ChatGPT 的宏大知识库界面。除了单聊天窗外的左侧抽屉记录一定跑不掉。 请使用 useAiConversations 快速获取一套开箱即用的会话列表管理能力。
我的会话
左侧由
useAiConversations 管理历史会话无头管理
API Reference
useAiChat Options
| 参数 | 说明 | 类型 |
|---|---|---|
initialMessages | 默认消息列表 | AiChatMessage[] |
request | 请求适配器,签名为 (message, history, abortSignal) => AsyncGenerator | Promise<string | Response> | Function |
idGenerator | 自定义消息 ID 生成器 | () => string |
parser | SSE / 流式块解析器,用于适配不同厂商的返回格式 | StreamChunkParser |
typewriter | 是否启用内置打字机输出效果 | boolean |
charsPerFrame | 打字机每帧输出字符数 | number |
systemPrompt | 自动插入到历史最前面的系统 Prompt | string |
onError | 错误回调 | (err) => void |
onFinish | assistant 消息完成时的回调 | (message) => void |
useAiChat Returns
你可以从中解构整套会话状态与操作方法。
| 返回值 | 说明 | 类型 |
|---|---|---|
messages | 双向绑定的会话历史列表 | Ref<AiChatMessage[]> |
isGenerating | 是否正在生成 | Ref<boolean> |
isSending | isGenerating 的语义别名 | ComputedRef<boolean> |
sendMessage | 发送消息并触发 request | (content: string) => Promise<void> |
stop | 中断当前生成并更新消息状态 | () => void |
clear | 清空全部会话消息 | () => void |
removeMessage | 删除指定消息 | (id: string) => void |
updateMessage | 更新指定消息的内容或状态 | (id: string, patch: Partial<AiChatMessage>) => void |