AI 组件 · AIChatInput
聊天输入框
用于 AI 聊天场景下的输入框

使用场景

在 AI 聊天场景下,用户可通过 AIChatInput实现富文本输入、上传、引用、建议、模版、功能配置、及丰富自定义展示等需求。
AIChatInput 的富文本输入是基于 tiptap 实现,tiptap 是一款现代的富文本编辑器开发框架,支持 React、Vue 前端框架,具备极强的可定制性和扩展性。其组件化能力优秀,性能优良,内置多种常用拓展,并支持用户自定义节点、命令、插件与菜单,使复杂 AI 场景下的富文本输入能力能够灵活适配和扩展。Semi 的 AIChatInput 组件对 tiptap 进行了封装,开发者可开箱即用或按需按业务扩展。

代码演示

如何引入

基本用法

支持文本输入以及文件上传,使用时可按需配置以下参数:
  • uploadProps 配置文件上传相关的参数,详见 UploadProps
  • onUploadChange 获取文件上传变化
  • placeholder 输入框的占位符
  • defaultContent 输入框的默认内容
  • onContentChange 输入框内容变化时的回调函数,参数为当前输入框的内容

消息发送

当输入框中有内容(包括输入文本,上传内容,引用内容),将允许发送消息。点击消息发送按钮,会触发 onMessageSend 回调函数,参数为当前输入框的内容,包括输入区域的文本,引用内容,上传文件,配置区域内容。
用户可在 onMessageSend 中根据判断是否设置 generating 表示消息正在处理中,如果 generatingtrue,则 AIChatInput 会在发送按钮位置显示停止生成按钮,并清空输入区的消息,以及上传文件,另外,引用内容需要用户自行清除。
点击停止生成按钮,会触发 onStopGenerate 回调函数,用户可在该回调函数中处理停止生成的逻辑, 如将 generating 设为 false

富文本输入区

AIChatInput 使用 tiptap 作为富文本输入框的编辑器,用户可以在输入框中输入文本,使用 AIChatInput 内置的 extensions(包括 input-slotselect-slotskill-slot)。用户也可以自定义 extensions 来扩展编辑器的功能。
  • input-slot 支持用户输入文本,并支持 placeholder 占位符。
  • select-slot 支持用户进行简单的选择,选项仅支持 string 类型。
  • skill-slot 是用于技能展示的块,方便用户理解当前输入框中的技能。
可以通过 ref 方法 setContent 来设置输入框的内容,使用 focusEditor 方法可以将输入框的焦点设置到编辑器中。

引用

用户可以 references 传入引用内容,引用内容会展示在输入框的顶部。
  • renderReference 自定义单个引用内容的渲染。
  • onReferenceDelete 处理引用内容的删除。
  • onReferenceClick 处理引用内容的点击。

配置区域

用户可以通过配置区域设置使用模型参数、联网搜索、深度思考等配置项,展示或者查看 MCP 工具。
可通过 renderConfigureArea API 自定义输入框的操作按钮。
使用 Configure 中的 SelectButtonMcpRadioButton 等组件可以自定义配置项。
Configure 将管理配置项的状态,用户可以通过 onConfigureChange API 监听配置项的变化。一定要配置 field 属性,用于标识配置项的唯一标识。如需设置初始值,可通过 initValue 属性设置。
如果用户有其他形式的配置需求,可以通过 getConfigureItem 将自定义组件扩展成 Configure 类型组件。
使用 getConfigureItem 扩展自定义组件为 Configure 类型组件。
使用示例如下:

操作区域

输入框右下角为操作区域,用户可以通过 renderActionArea API 自定义操作区域,展示自定义的操作按钮。
使用示例如下:

底部按钮形状

用户可以通过 round API 配置底部按钮的形状,默认是 true,是圆角按钮, 可以设置为 false 来配置为方形按钮。

建议

用户可通过 suggestion API 配置建议列表,功能类似于 AutoComplete 组件,用户可以根据输入的内容实现根据输入的内容动态展示建议列表。
使用鼠标上下按键切换建议列表的选项。按下 ESC 或者点击非建议列表,输入框区域,建议列表将关闭。
还可通过 renderSuggestionItem API 自定义建议列表的展示。

技能及模版

用户可以通过 skills API 配置技能列表,使用 skillHotKey 配置技能的触发键。
skills 的格式如下
由于模版的展示形式丰富,因此我们不提供默认的展示形式,用户可以通过 renderTemplateAPI 自定义模版的展示。模版面板的展示和关闭可通过点击模版按钮实现。
使用示例如下:

自定义渲染顶部区域

用户可以通过 renderTopSlot API 自定义渲染顶部区域,可自行渲染引用,上传内容以及配置项。可结合 showReferenceshowUploadFile API 控制是否展示引用和上传文件。另外,可通过 topSlotPosition API 配置自定义渲染内容相对于引用区域,上传展示区域的相对位置。
使用用例如下:

自定义扩展

富文本区域可以自定义扩展,自定义扩展的实现可参考 Tiptap 自定义扩展。通过 extensions API 可将自定义扩展添加到 AIChatInput 组件中。如果添加了自定义扩展,需要在 transformer 中添加对应的转换规则, 以保证在 onContentChange 中得到的该节点数据符合用户预期。

API 参考

AIChatInput

属性说明类型默认值
canSend是否可以发送,未设置时,根据输入框内容,上传内容,引用内容决定是否可发送booleantrue
className自定义类名string-
defaultContent输入框默认内容,支持 html string 以及 json 格式,同 Tiptap 的 ContentTiptapContent-
dropdownMatchTriggerWidth下拉弹出层是否是否与输入框宽度一致booleantrue
extensions自定义扩展,类型同 tiptap 的 Extension 类型相同Extension[]-
generating是否正在生成中booleanfalse
onContentChange输入框内容变化时候的回调(content:
OnContentChangeProps
) => void
-
onMessageSend发送消息回调(content:
OnMessageSendProps
) => void
-
onReferenceClick引用点击回调(reference: Reference) => void-
onReferenceDelete引用删除回调(reference: Reference) => void-
onSkillChange技能切换回调(skill: Skill) => void-
onStopGenerate停止生成回调() => void-
onSuggestClick建议点击回调(suggestion: Suggestion) => void-
onTemplateVisibleChange模板弹出层可见性变化回调(visible: boolean) => void-
onUploadChange上传文件相关回调(props: OnChangeProps) => void-
popoverProps下拉弹出层的配置参数PopoverProps-
placeholder输入框占位符string-
references输入框引用列表Reference[]-
renderActionArea自定义底部的操作区域() => React.ReactNode-
renderConfigureArea自定义底部的配置区域() => React.ReactNode-
renderReference自定义渲染引用(reference: Reference) => ReactNode-
renderSkillItem自定义技能列表的 item 渲染(props:
RenderSkillItemProps
) => React.ReactNode
-
renderSuggestionItem自定义建议列表的 item 渲染(props:
RenderSkillItemProps
) => React.ReactNode
-
renderTemplate自定义模板渲染(skill: Skill, onTemplateClick: (content: string) => void) => React.ReactNode-
renderTopSlot自定义顶部 slot() => React.ReactNode-
round底部的配置区域和操作区域是否形状是否为全圆角booleantrue
onBlur富文本输入框失焦的回调(event: React.FocusEvent) => void-
onConfigureChange配置区域发生变化的回调(value: LeftMenuChangeProps, changedValue: LeftMenuChangeProps) => void-
onFocus富文本输入框聚焦的回调(event: React.FocusEvent) => void-
showReference是否展示引用区域,用于配合 renderTopSlot 使用booleantrue
showTemplateButton是否展示模板按钮,未设置时,将根据当前选中技能中的 hasTemplate 决定是否展示模版按钮booleanfalse
showUploadFile是否展示上传文件区域,用于配合 renderTopSlot 使用booleantrue
skillHotKey输入框中触发技能的热键string-
skills技能列表Skill[]-
style自定义样式React.CSSProperties-
suggestions建议列表Suggestion[]-
templatesCls模版的样式类名称string-
templatesStyle模版的样式React.CSSProperties-
topSlotPosition顶部 slot 位置,相对于引用内容,上传内容'top' | 'bottom' | 'middle'-
transformer自定义扩展的转换规则Map<string, (obj: any) => any>
uploadProps上传文件相关配置UploadProps-
uploadTipProps上传文件相关提示配置UploadTipProps-

Methods

属性说明类型默认值
changeTemplateVisible切换模板弹出层的可见性(visible: boolean) => void-
deleteContent删除富文本中的某一项,删除逻辑依赖的是 content 中的 uniqueKey(content: Content) => void-
deleteUploadFile删除上传文件中的某一项(item: Attachment) => void-
focusEditor聚焦输入框,默认聚焦到输入框的末尾(pos?: string) => void-
getEditor获取当前的 tiptap 的 editor 实例() => Editor-
setContent设置输入框内容(content: TiptapContent) => void-
setContentWhileSaveTool保留技能项的同时设置输入框内容(content: TiptapContent) => void-

设计变量