核心概念

接入 chatkit 要理解三个概念:适配器、配置、插槽。本页各用一段话说清楚,再补上读文档时会遇到的几个名词。

适配器:对接后端

适配器是唯一认识后端协议的地方:把后端的流翻译成界面能显示的内容,把发送、停止这些操作翻译成请求。 同一组会话共用一个稳定的实例,交给 useChatSessions 或 useChatRuntime。

适配器只做协议翻译:每项能力由接入方写一个发请求的函数,请求发到哪、带什么凭据、用哪个模型或应用,都在函数里决定。 生产环境让请求走自己的代理,用户是谁由登录态决定,密钥不放进前端。

适配器决定界面能使用哪些后端能力。会话列表由外部数组和操作回调控制,提供 regenerate 或 edit 后可显示对应操作;还要满足功能开关和当前消息状态的条件。调用后端 abort 后继续接收输出并保留执行位;终态事件或历史明确终态确认后才结束运行。失败或未确认不能伪造中止;缺少 abort 时不显示停止按钮。详见能力一览。

chatkit 不把对话持久化到浏览器存储:当前内容保留在内存中,刷新后能否恢复取决于历史接口。会话列表与历史是独立能力,提供其中一项不会自动具备另一项。 对话界面被销毁重建时对话会不会丢,见会话与历史从哪来。

内置适配器见接入后端;后端是别的协议时写一个新的适配器。

配置:settings 与 features

  • settings 只填值:语言、占位文字、欢迎语、最大宽度、执行过程的显示方式……没有函数,没有界面内容,可以整个放进配置中心。
  • features 管内置功能:支持开关的功能可以用 false 关掉;需要业务方提供实现的功能(上传、赞踩回调、语音识别)在这里给函数;带控件的功能可以用 slot 换位置。
<Chatkit
  sessions={sessions}
  settings={{ locale: 'en-US', toolFlow: 'step' }}
  features={{ attachments: { upload }, edit: false }}
/>

全部配置项见配置参考。

插槽:slots 与 renderers

  • slots 按位置放:聊天区有 17 个固定位置(顶栏、消息上下、输入框工具栏、右侧面板……),业务组件放进去,和内置功能排在一起。见插槽。
  • renderers 按类型显示:后端返回的某类内容怎么显示。业务卡片按数据类型登记,工具按工具名登记,失败卡片按错误码登记。见业务卡片、工具展示。

拿不准用哪个时看 settings / features / slots / renderers 怎么选。

五层架构

从上到下是:接入方应用、界面(聊天区 <Chatkit> 与会话列表 SessionList)、会话层(useChatSessions,管会话列表和每个会话的运行时)、运行时(每个打开的会话一个,负责排队、停止、历史和一轮的结论)、适配器(整个应用一个实例,每次调用都带会话 id)。接入方日常只接触最上面和最下面:上面写配置与插槽,下面选或写适配器。

不同形态的产品能用哪些层

产品形态能用的层说明
Web 应用(React)全部五层本文档默认的用法
App 内嵌的 H5 页面全部五层上线前在目标 App 的内置浏览器里验证一遍
React Native、原生 App、小程序运行时与适配器的设计和规范界面基于 React DOM,不能直接用;运行时、适配器的规范可以照着实现
Node 服务端运行时、适配器用于回放、测试、批量评测;从 @volcengine/chatkit/core 与各适配器入口引入
非 React 的 Web 框架运行时、适配器界面自己写;或者把 chatkit 做成单独的页面嵌进去

各入口能在哪里运行见入口与导出。

读文档时会遇到的名词

名词含义
会话一段连续的对话,有一个 id。文档里的 sessionId 就是会话 id
一轮用户发一次消息到这次回答结束。一轮有状态(排队、运行中、完成、失败、中断)和唯一的结论,指标按一轮来算
运行信息一轮现在怎么样了:状态、阶段、各个时间点、是否被停止、错误码。消息插槽和支持运行信息的渲染器上下文里可读到可选的 run
片段一条消息由多个片段组成:正文、思考、工具调用、图片、业务数据。业务数据片段带 kind(如 acme.order),界面按它找渲染器
后端能力接入方给了适配器哪些能力函数。界面从 capabilities 读,决定依赖后端的内置功能显示与否
事件SDK 不主动发送遥测,提供事件回调;是否上报由接入方决定。事情发生时调 onEvent:发送、运行、工具调用、历史加载、首次显示、渲染错误。见事件