ChatThreads 会话列表
多会话工作台:左侧会话列表 + 右侧会话区。配合 useChatSessions 使用——它给每个会话挂一个独立的 useChatEngine 实例,切走只是不渲染,回答继续流,切回来内容还在。
本页组件在独立包
@wil-works/evoke-chat里,安装与注册见 Chatbot 对话窗口顶部说明。
家族既有原则不变:不发请求、不落存储。transport 由你注入,持久化由你经 snapshot() 取走、经 initialThreads 灌回。
基础用法
useChatSessions 交出的对象直接传给 EbAiConsole 的 sessions:列表、引擎、发送全接管,未传 sessions 时 Console 仍是原来的单栏形态。
内容由 AI 生成,仅供参考
会话数:2生成中:0最近回调:—
只列表、自己排布
不想要 Console 那套编排时,EbChatThreads 可以单独用;#item 插槽整条接管,itemProps 用于回落默认渲染(与 ChatList#message 同款约定):
持久化
引擎不碰存储,但给足了取与回灌的入口:
js
// 取走:thread 元数据 + 各自的消息数组
const saved = JSON.stringify(sessions.snapshot())
// 回灌
const sessions = useChatSessions({
initialThreads: JSON.parse(saved),
transport, // (content, attachments, context, { threadId }) => ...
onChange: (thread, reason) => { /* create / rename / pin / archive / remove / select / update */ },
onReject: ({ threadId, reason }) => { /* 目前只有 concurrency */ },
})并发与重排
- 切走不中断:每个会话各持一个引擎,切走只是不渲染。代价是可能同时有多个会话在流式,所以有
maxConcurrentStreaming(0为不限);用满时send()返回false并走onReject({ reason: 'concurrency' })。 - 列表不会因点击重排:
updatedAt只在真的产生新消息时推进。选中、改名、置顶都不动它——否则用户刚点的条目会在指针底下跳走。
API
useChatSessions
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| initialThreads | 回灌用;每项 { id, title, updatedAt, pinned?, archived?, unread?, messages? } | array | [] |
| activeId | 初始选中的会话;缺省取第一条 | string | — |
| transport | 模型调用入口,比 Console 的多收一个 { threadId } | (content, attachments, context, { threadId }) => void | Promise | null |
| titleOf | 首条消息生成标题的规则;缺省截前 24 字加省略号 | (text: string) => string | — |
| maxConcurrentStreaming | 同时生成中的会话数上限,0 为不限 | number | 0 |
| onChange | 会话元数据变更:create / rename / pin / archive / remove / select / update | (thread, reason) => void | — |
| onReject | 发送被拒:{ threadId, reason } | (info) => void | — |
useChatSessions 返回值
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| threads / visible / archived | 全部 / 未归档 / 已归档会话 | Ref<array> | — |
| activeId / active / activeEngine | 当前会话 id / 元数据 / 引擎实例 | Ref | — |
| streamingIds | 仍在生成中的会话 id | Ref<string[]> | — |
| engineOf(id) | 取某个会话的引擎(惰性创建) | (id) => engine | null | — |
| select / create / rename / pin / archive / remove | 会话操作;remove 后 activeId 自动落到剩余第一条 | 函数 | — |
| send / stop | 在当前会话上发送 / 取当前引擎(停止请求由宿主 abort) | 函数 | — |
| canSendOn(id) | 该会话当前能否发起生成(loading 与并发上限一起判) | (id) => boolean | — |
| snapshot / clear | 取可持久化快照 / 清空全部会话 | 函数 | — |
ChatThreads Props
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| threads | 会话列表 | array | [] |
| active | 当前会话 id | string | — |
| streaming | 仍在生成中的会话 id,用于显示活动标记 | string[] | [] |
| searchable | 显示搜索框(本地按标题过滤) | boolean | true |
| showCreate | 显示新建按钮 | boolean | true |
| groupByDate | 按今天 / 昨天 / 近 7 天 / 更早分组;搜索中与置顶段不分组 | boolean | true |
| renamable / removable | 菜单里的重命名与删除项;置顶与归档不受影响 | boolean | true / true |
| timeFormat | 时间列格式化转义口(如 YYYY-MM-DD HH:mm:ss);缺省回落浏览器本地日期 | (ts: number) => string | — |
ChatThreads Events
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| select / create | 选中会话 / 新建 | (id) => void / () => void | — |
| rename | 重命名提交(空标题视为放弃,不触发) | (id, title) => void | — |
| remove / pin / archive | 删除 / 置顶(第二参为目标态)/ 归档(同) | (id, value?) => void | — |
| search | 搜索词变化(过滤已由组件完成,此处仅供埋点或远端检索) | (keyword) => void | — |
ChatThreads Slots
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| item | 整条接管;作用域 { thread, index, isActive, isStreaming, itemProps } | — | — |
| header / footer / empty | 列表顶部 / 底部 / 空态 | — | — |
未做
- 列表虚拟滚动:分组标题与虚拟列表本身冲突(要拍平成带 sticky 表头),与其交一个半成品不如先不做;消息列表侧同理。
- 会话分享、多模型并行对比、跨设备同步。