两种用法
chatkit 有两种用法:多个会话的完整应用用 useChatSessions,嵌在页面里的单个对话用 useChatRuntime。两者用同一个适配器、同一个 <Chatkit>。
sessions 与 runtime 二选一。
完整应用:useChatSessions
-
聊天区和会话列表是两个组件:
<Chatkit>只显示聊天区,SessionList是会话列表,聊天区接收运行时,会话列表接收外部数组与回调。列表放在哪里由页面的布局决定,见会话列表。 -
一个适配器服务所有会话:同一组会话共用一个稳定的适配器实例。
-
切换会话不打断回答:会话第一次打开时才建运行时,在 hook 存续期间保留,显式 actions.release(id) 时释放。页面内切换后,原会话继续接收回答;切回来显示已收到的内容。
-
打开会话时先取历史:会话第一次打开时取一次历史;历史提供活动轮次及有效事件游标、适配器又给了
resume时,尝试续接。 -
先创建再发送:应用调用业务创建接口,取得真实 ID 后更新 activeSessionId;也可 await actions.open(id) 后向返回的 runtime 发送。
-
列表外部受控:目录查询、分页、改名、删除、fork 都由应用实现;不提供某个操作回调时隐藏对应按钮。
单个对话:useChatRuntime
sessionId必填,由业务方决定(工单号、文档 id)。换了sessionId就换了对话。- 首次挂载、
sessionId为空,以及切换sessionId或适配器时,运行时可能为undefined,所以渲染前要判断。 useChatRuntime只管一个对话。SessionList是独立的受控组件,也能用来切换它的sessionId,但每次切换都会释放旧运行时、重新取历史,旧会话不在后台继续接收;需要多会话切换时用useChatSessions。- 其余参数与
useChatSessions相同。两者修改stallThresholdMs都会重建运行时,建议在挂载时确定。
对话界面被销毁重建时
运行时跟着这两个 hook 所在的组件:组件卸载时运行时释放。适配器给了 history 时,再次打开同一 sessionId 会查询后端已保存的内容;
没给时对话会清空,要保留就把 hook 写在不会卸载的上层组件里,或者隐藏而不是移除对话界面。
写法见会话与历史从哪来。
两种用法的差别
在聊天区之外用内置组件和 hooks
想把附件按钮放进页面头部,或者在侧边栏里操作输入框时,用 <ChatkitProvider> 把页面包起来。里面的 <Chatkit /> 可以不写任何 props: