ai对话
This commit is contained in:
@@ -11,26 +11,30 @@ import type {
|
||||
ChatMemberVO,
|
||||
ChatRoomMessageVO,
|
||||
CustomerServiceVO
|
||||
} from '../../types/workcase/chatRoom'
|
||||
} from '../../types/workcase'
|
||||
import type {
|
||||
TbChat,
|
||||
TbChatMessage,
|
||||
CreateChatParam,
|
||||
PrepareChatParam,
|
||||
StopChatParam,
|
||||
CommentMessageParam,
|
||||
ChatListParam,
|
||||
ChatMessageListParam,
|
||||
SSECallbacks,
|
||||
SSETask,
|
||||
SSEMessageData
|
||||
} from '../../types/ai/aiChat'
|
||||
|
||||
// AI对话相关类型(简化版)
|
||||
interface TbChat {
|
||||
chatId?: string
|
||||
userId?: string
|
||||
title?: string
|
||||
status?: string
|
||||
}
|
||||
interface TbChatMessage {
|
||||
messageId?: string
|
||||
chatId?: string
|
||||
content?: string
|
||||
role?: string
|
||||
}
|
||||
interface ChatPrepareData {
|
||||
chatId?: string
|
||||
message?: string
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
declare const uni: {
|
||||
getStorageSync: (key: string) => any
|
||||
request: (options: any) => any
|
||||
}
|
||||
|
||||
// API 基础配置
|
||||
const BASE_URL = 'http://localhost:8180'
|
||||
|
||||
/**
|
||||
* @description 工单对话相关接口
|
||||
* @filename workcaseChat.ts
|
||||
@@ -45,9 +49,10 @@ export const workcaseChatAPI = {
|
||||
|
||||
/**
|
||||
* 创建对话
|
||||
* @param param agentId和userId必传
|
||||
*/
|
||||
createChat(chat: TbChat): Promise<ResultDomain<TbChat>> {
|
||||
return request<TbChat>({ url: this.baseUrl, method: 'POST', data: chat })
|
||||
createChat(param: CreateChatParam): Promise<ResultDomain<TbChat>> {
|
||||
return request<TbChat>({ url: this.baseUrl, method: 'POST', data: param })
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -59,23 +64,26 @@ export const workcaseChatAPI = {
|
||||
|
||||
/**
|
||||
* 查询对话列表
|
||||
* @param param userId必传
|
||||
*/
|
||||
getChatList(filter: TbChat): Promise<ResultDomain<TbChat>> {
|
||||
return request<TbChat>({ url: `${this.baseUrl}/list`, method: 'POST', data: filter })
|
||||
getChatList(param: ChatListParam): Promise<ResultDomain<TbChat[]>> {
|
||||
return request<TbChat[]>({ url: `${this.baseUrl}/list`, method: 'POST', data: param })
|
||||
},
|
||||
|
||||
/**
|
||||
* 获取对话消息列表
|
||||
* @param param chatId必传
|
||||
*/
|
||||
getChatMessageList(filter: TbChat): Promise<ResultDomain<TbChatMessage>> {
|
||||
return request<TbChatMessage>({ url: `${this.baseUrl}/message/list`, method: 'POST', data: filter })
|
||||
getChatMessageList(param: ChatMessageListParam): Promise<ResultDomain<TbChatMessage[]>> {
|
||||
return request<TbChatMessage[]>({ url: `${this.baseUrl}/message/list`, method: 'POST', data: param })
|
||||
},
|
||||
|
||||
/**
|
||||
* 准备对话会话
|
||||
* 准备流式对话会话
|
||||
* @param param chatId和message必传
|
||||
*/
|
||||
prepareChatMessageSession(prepareData: ChatPrepareData): Promise<ResultDomain<string>> {
|
||||
return request<string>({ url: `${this.baseUrl}/prepare`, method: 'POST', data: prepareData })
|
||||
prepareChatMessageSession(param: PrepareChatParam): Promise<ResultDomain<string>> {
|
||||
return request<string>({ url: `${this.baseUrl}/prepare`, method: 'POST', data: param })
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -86,17 +94,103 @@ export const workcaseChatAPI = {
|
||||
},
|
||||
|
||||
/**
|
||||
* 停止对话
|
||||
* 建立SSE流式对话连接
|
||||
* @param sessionId 会话ID(必传)
|
||||
* @param callbacks 回调函数
|
||||
* @returns SSETask 可用于中止请求
|
||||
*/
|
||||
stopChat(filter: TbChat, taskId: string): Promise<ResultDomain<boolean>> {
|
||||
return request<boolean>({ url: `${this.baseUrl}/stop/${taskId}`, method: 'POST', data: filter })
|
||||
streamChat(sessionId: string, callbacks: SSECallbacks): SSETask {
|
||||
const url = `${BASE_URL}${this.baseUrl}/stream/${sessionId}`
|
||||
const token = uni.getStorageSync('token') || ''
|
||||
|
||||
const requestTask = uni.request({
|
||||
url: url,
|
||||
method: 'GET',
|
||||
header: {
|
||||
'Accept': 'text/event-stream',
|
||||
'Authorization': token ? `Bearer ${token}` : ''
|
||||
},
|
||||
enableChunked: true,
|
||||
success: (res: any) => {
|
||||
console.log('SSE请求完成:', res)
|
||||
// 处理非200状态码
|
||||
if (res.statusCode !== 200) {
|
||||
console.error('SSE请求状态码异常:', res.statusCode)
|
||||
let errorMsg = '抱歉,服务暂时不可用,请稍后重试。'
|
||||
if (res.statusCode === 401) {
|
||||
errorMsg = '登录已过期,请重新登录。'
|
||||
} else if (res.statusCode === 403) {
|
||||
errorMsg = '无权限访问,请联系管理员。'
|
||||
} else if (res.statusCode === 404) {
|
||||
errorMsg = '会话不存在或已过期,请重新发起对话。'
|
||||
} else if (res.statusCode >= 500) {
|
||||
errorMsg = '服务器异常,请稍后重试。'
|
||||
}
|
||||
callbacks.onError?.(errorMsg)
|
||||
}
|
||||
callbacks.onComplete?.()
|
||||
},
|
||||
fail: (err: any) => {
|
||||
console.error('SSE请求失败:', err)
|
||||
callbacks.onError?.('网络连接失败,请稍后重试。')
|
||||
callbacks.onComplete?.()
|
||||
}
|
||||
})
|
||||
|
||||
// 监听分块数据
|
||||
requestTask.onChunkReceived((res: any) => {
|
||||
try {
|
||||
const decoder = new TextDecoder('utf-8')
|
||||
const text = decoder.decode(new Uint8Array(res.data))
|
||||
|
||||
const lines = text.split('\n')
|
||||
for (const line of lines) {
|
||||
if (line.startsWith('data:')) {
|
||||
const dataStr = line.substring(5).trim()
|
||||
if (dataStr && dataStr !== '[DONE]') {
|
||||
try {
|
||||
const data: SSEMessageData = JSON.parse(dataStr)
|
||||
const event = data.event
|
||||
|
||||
if (event === 'message' || event === 'agent_message') {
|
||||
callbacks.onMessage?.(data)
|
||||
} else if (event === 'message_end') {
|
||||
callbacks.onEnd?.(data.task_id || '')
|
||||
} else if (event === 'error') {
|
||||
callbacks.onError?.(data.message || '发生错误,请稍后重试。')
|
||||
}
|
||||
} catch (e) {
|
||||
console.log('解析SSE数据失败:', dataStr)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('处理分块数据失败:', e)
|
||||
}
|
||||
})
|
||||
|
||||
return {
|
||||
abort: () => {
|
||||
requestTask.abort()
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 评论对话消息
|
||||
* 停止对话
|
||||
* @param param taskId, agentId, userId必传
|
||||
*/
|
||||
commentChatMessage(filter: TbChat, messageId: string, comment: string): Promise<ResultDomain<boolean>> {
|
||||
return request<boolean>({ url: `${this.baseUrl}/comment?messageId=${messageId}&comment=${comment}`, method: 'POST', data: filter })
|
||||
stopChat(param: StopChatParam): Promise<ResultDomain<boolean>> {
|
||||
return request<boolean>({ url: `${this.baseUrl}/stop/${param.taskId}`, method: 'POST', data: param })
|
||||
},
|
||||
|
||||
/**
|
||||
* 评价对话消息
|
||||
* @param param agentId, chatId, messageId, comment, userId必传
|
||||
*/
|
||||
commentChatMessage(param: CommentMessageParam): Promise<ResultDomain<boolean>> {
|
||||
return request<boolean>({ url: `${this.baseUrl}/comment?messageId=${param.messageId}&comment=${param.comment}`, method: 'POST', data: param })
|
||||
},
|
||||
|
||||
// ====================== 对话分析 ======================
|
||||
|
||||
Reference in New Issue
Block a user