Skip to content

消息与数据管理 useMessage

示例

基础用法

loading

onReceiveData 事件

onReceiveData 的签名如下:

ts
onReceiveData?: <T = any>(data: T, messages: Ref<ChatMessage[]>, preventDefault: () => void) => void

data 是大模型响应, messages 是本地存储的对话记录, preventDefault 可以用来阻止默认行为。

非流式 chat 内部的默认行为如下:

ts
const assistantMessage: ChatMessage = {
  role: 'assistant',
  content: data.choices[0].message.content,
}
messages.value.push(assistantMessage)

流式 chat 内部的默认行为如下:

ts
if (messages.value[messages.value.length - 1].role === 'user') {
  messages.value.push({ role: 'assistant', content: '' })
}
const choice = data.choices?.[0]
if (choice && choice.delta.content) {
  messages.value[messages.value.length - 1].content += choice.delta.content
}

API

typescript
const messageComposable: UseMessageReturn = useMessage(
  options: UseMessageOptions
): UseMessageReturn

选项

useMessage 接受以下选项:

typescript
interface UseMessageOptions {
  /** AI客户端实例 */
  client: AIClient
  /** 是否默认使用流式响应 */
  useStreamByDefault?: boolean
  /** 错误消息模板 */
  errorMessage?: string
  /** 初始消息列表 */
  initialMessages?: ChatMessage[]
  /** 事件回调 */
  events?: {
    onReceiveData?: <T = any>(data: T, messages: Ref<ChatMessage[]>, preventDefault: () => void) => void
  }
}

返回值

useMessage 返回以下内容:

typescript
interface UseMessageReturn {
  messages: Ref<ChatMessage[]>
  /** 消息状态 */
  messageState: Reactive<MessageState>
  /** 输入消息 */
  inputMessage: Ref<string>
  /** 是否使用流式响应 */
  useStream: Ref<boolean>
  /** 发送消息 */
  sendMessage: (content?: ChatMessage['content'], clearInput?: boolean) => Promise<void>
  /** 手动执行addMessage添加消息后,可以执行send发送消息 */
  send: () => Promise<void>
  /** 清空消息 */
  clearMessages: () => void
  /** 添加消息 */
  addMessage: (message: ChatMessage | ChatMessage[]) => void
  /** 中止请求 */
  abortRequest: () => void
  /** 重试请求 */
  retryRequest: (msgIndex: number) => Promise<void>
}

MessageState 接口

typescript
interface MessageState {
  status: STATUS
  errorMsg: string | null
}

enum STATUS {
  INIT = 'init', // 初始状态
  PROCESSING = 'processing', // AI请求正在处理中, 还未响应,显示加载动画
  STREAMING = 'streaming', // 流式响应中分块数据返回中
  FINISHED = 'finished', // AI请求已完成
  ABORTED = 'aborted', // 用户中止请求
  ERROR = 'error', // AI请求发生错误
}

// 状态常量
const GeneratingStatus = [STATUS.PROCESSING, STATUS.STREAMING]
const FinalStatus = [STATUS.FINISHED, STATUS.ABORTED, STATUS.ERROR]