项目正在快速迭代中,API 与视觉细节可能随版本调整,请勿用于生产环境。

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 | Promisenull
titleOf首条消息生成标题的规则;缺省截前 24 字加省略号(text: string) => string—
maxConcurrentStreaming同时生成中的会话数上限,0 为不限number0
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仍在生成中的会话 idRef<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当前会话 idstring—
streaming仍在生成中的会话 id,用于显示活动标记string[][]
searchable显示搜索框(本地按标题过滤)booleantrue
showCreate显示新建按钮booleantrue
groupByDate按今天 / 昨天 / 近 7 天 / 更早分组;搜索中与置顶段不分组booleantrue
renamable / removable菜单里的重命名与删除项;置顶与归档不受影响booleantrue / 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 表头),与其交一个半成品不如先不做;消息列表侧同理。
  • 会话分享、多模型并行对比、跨设备同步。