0.2.5 • Published 11 months ago

@binlun/chat-ai v0.2.5

Weekly downloads
-
License
-
Repository
-
Last release
11 months ago

chat-ai组件

交互式问答组件

组件安装

npm install --registry=http://registry.npm.lishicloud.com/ @lishi/chat-ai --save

使用示例

<chat-ai 
  :requestOptions="getRequestOptions"
  :storage="{ key: key }"
  :filterWords="filterWords"
  :transformResponse="transformResponse"
>
  <template #empty>
    <!-- slot: 自定义没有聊天时的空状态 -->
  </template>

  <template #source="item">
    <!-- slot: 自定义回答来源 -->
  </template>
</chat-ai>
import ChatAi from '@lishi/chat-ai'
import '@lishi/chat-ai/lib/style.css'

const key = '' // 最好是取用户唯一标识,因为是根据该key值存储用户会话, 防止不同的用户聊天记录互混

// 自定义会话请求参数
function getRequestOptions({ data: { prompt } }) {
  return {
    url: '/xz-chatx/api/saas/chat/dialog',
    headers: { 'Xz-Token': 'xxxxx' },
    data: { question: prompt }
  }
}

// 敏感词
async function filterWords({ prompt, promptRef }) {
  const { data } = await sensitiveCheckApi({ content: prompt })

  if (data.matchResult) {
    message.error('您的问题中包含敏感词,请修改后再试')
    return false // 返回 false 表示不发送请求
  }
}

// 用于响应数据转换,其中 `text` 字段是必须的
function formatData(data) {
  return {
    text: data.text, // 回答内容
    source: data.fileSource?.sourceFileList, // 回答的来源
  }
}

接口文档

属性

属性类型必填默认值功能/备注
hasLayoutBooleanoptiontrue是否显示(左侧)布局
featureObjectoption查看下方说明开启的功能
storageObjectoption查看下方说明当开启了聊天记录存储到 storage 功能时(feature.chatSaveToStorage = true)
exportImageWatermarkObjectoption查看下方说明导出图片的水印设置(feature.exportImage = true)
filterWordsFunctionoptionasync ({ promptRef, prompt }) => true用于处理敏感词, 返回false不会发送问答请求
placeholderString, Functionoption'来说点什么吧...(Shift + Enter = 换行)'输入框的placeholder,支持函数形式: (isMobile) => xxx
requestOptionsFunction, Objectoption{}自定义会话请求(参数)
transformResponseFunction, Nulloptionnull自定义后端不断推送的数据的转化逻辑,返回的结果会传入formatData中再处理
formatDataFunctionoption(data) => ({ text: data.text, replayOptions: {}, source: 查看下方说明 })处理返回的数据,其中text必须返回; source: 来源; replayOptions: 当feature.isUsingContext为true,该参数会保存在下一次问答 requestOptions({ data: { prompt, options } }) options中
chatImgStringoption''ai头像
userImgStringoption''用户头像
inputPropsObjectoption{}输入框(textarea)属性
fileLinkClassNameStringoption"js-file-link"回答内容中来源链接的类名

feature

属性类型必填默认值功能/备注
chatSaveToStorageBooleanfalsetrue聊天记录是否保存到 storage
isUsingContextBooleanfalsetrue请求是否携带之前的聊天记录
clearChatBooleanfalsetrue清空聊天记录功能
exportImageBooleanfalsetrue导出聊天记录为图片功能
delChatBooleanfalsetrue删除单条聊天记录功能
copyChatBooleanfalsetrue复制单条聊天记录功能
retryReplyBooleanfalsetrue重新获取回复功能
stopReplyBooleanfalsetrue停止响应功能
sourceBooleanfalsetrue是否显示来源

storage

属性类型必填默认值功能/备注
keyStringfalse'CHATAISTATE'不同的用户应该有不同的key,防止聊天记录不对应
expireNumberfalsenull聊天记录保存的时间
maxCountNumberfalse50一个会话保存的最大聊天记录数, 0表示不限制, ps: 该值最好是偶数

exportImageWatermark

属性类型必填默认值功能/备注
textStringfalse'力石科技'导出图片的水印文本,空表示没有水印
fontStringfalse'14px microsoft yahei'字体
colorStringfalse'rgba(238, 36, 5, 0.1)'颜色
spaceXNumberfalse160x轴间隔
spaceYNumberfalse120y轴间隔
angle角度false-25 * Math.PI / 180倾斜角度

source

// 示例
function formatData(data) {
  return {
    text: data.text,
    source: [ // 来源
      { 
        fileUrl: 'http://127.0.0.1:3005/pdf-file',     // 文档地址
        fileName: '富文本哈哈啊哈哈哈哈哈哈啊哈哈哈哈哈', // 文档名称
        showName: '富文本showName', // 回答来源中显示的名称,不设置默认取fileName字段
        tooltip: '富文本tooltip',   // 回答来源中tooltip显示的内容,不设置不显示
        id: 1,                     // 回答内容中的来源引用要和此处关联
        page: 2,                   // 要跳转的页码
        keyword: '中文内容较少'     // 匹配的内容
      },
      { fileUrl: 'http://127.0.0.1:3005/pdf-example', fileName: 'example', id:2, page: 2, keyword: 'Every compiled trace contains' },
    ]
  }
}

依赖项

ant-desigin-vue, 
copy-to-clipboard,
highlight.js, 
markdown-it-link-attributes, 
markdown-it
localforage
html2canvas
@microsoft/fetch-event-source
pdf.js

本地调试

可以在 service 目录下启动 node ./index.js

打包

  • 运行 npm run build 来打包
  • bundle的入口在vite.build.config.ts的entry字段中配置
  • 打包以后生成lib/bundle.es.js和lib/bundle.umd.js

发布