pet/http/api/assistant.js

214 lines
7.1 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 宠物助手相关API接口模块
* 对接后端宠物助手服务接口
*/
import BaseRequest from '../utils/request-helper.js'
import { LOADING_TEXTS } from '../config/constants.js'
// ==================== 宠物助手聊天接口 ====================
/**
* 向宠物助手提问(非流式)
* @description 发送消息给宠物助手,获取专业的宠物护理建议
* @param {Object} messageData 消息数据对象
* @param {string} messageData.message 用户消息内容必填1-2000字符
* @param {string} [messageData.sessionId] 会话ID可选UUID格式
* @param {boolean} [messageData.stream=false] 是否流式响应
* @param {number} [messageData.temperature=0.7] 温度参数控制随机性范围0-2
* @param {number} [messageData.maxTokens=1000] 最大生成token数范围1-4000
* @param {string} [messageData.model] 模型名称,可选
* @param {Object} [config={}] 自定义请求配置
* @returns {Promise<Object>} 返回聊天响应对象
* @example
* // 基本用法
* const response = await askPetAssistant({
* message: '我的狗狗不吃饭怎么办?'
* })
*
* // 指定会话和参数
* const response = await askPetAssistant({
* message: '还有其他建议吗?',
* sessionId: 'uuid-session-id',
* temperature: 0.8,
* maxTokens: 1500
* })
*/
export const askPetAssistant = (messageData, config = {}) => {
return BaseRequest.post('/pet/user/assistant/ask', messageData, 'AUTHENTICATED_UPDATE', LOADING_TEXTS.AI_THINKING, config)
}
/**
* 向宠物助手流式提问
* @description 发送消息给宠物助手,获取流式响应(实时显示回复过程)
* @param {Object} messageData 消息数据对象
* @param {string} messageData.message 用户消息内容
* @param {string} [messageData.sessionId] 会话ID可选
* @param {number} [messageData.temperature=0.7] 温度参数
* @param {number} [messageData.maxTokens=1000] 最大token数
* @param {Object} [config={}] 自定义请求配置
* @returns {Promise<Object>} 返回流式响应对象
* @example
* const response = await streamAskPetAssistant({
* message: '我的猫咪呕吐是什么原因?',
* sessionId: 'uuid-session-id'
* })
*/
export const streamAskPetAssistant = (messageData, config = {}) => {
// 强制设置为流式响应
const streamData = { ...messageData, stream: true }
return BaseRequest.post('/pet/user/assistant/stream-ask', streamData, 'AUTHENTICATED_UPDATE', LOADING_TEXTS.AI_THINKING, config)
}
/**
* 获取宠物助手对话历史
* @description 获取用户与宠物助手的对话历史记录(单一会话)
* @param {Object} [params={}] 查询参数
* @param {number} [params.page=1] 页码默认第1页
* @param {number} [params.pageSize=20] 每页数量默认20条
* @param {Object} [config={}] 自定义请求配置
* @returns {Promise<Object>} 返回历史记录列表
* @example
* // 获取历史记录
* const history = await getAssistantHistory({
* page: 1,
* pageSize: 50
* })
*/
export const getAssistantHistory = (params = {}, config = {}) => {
return BaseRequest.get('/pet/user/assistant/history', params, 'AUTHENTICATED_QUERY', config)
}
/**
* 清空宠物助手对话历史
* @description 清空用户与宠物助手的对话历史记录
* @param {Object} [config={}] 自定义请求配置
* @returns {Promise<Object>} 返回操作结果
* @example
* // 清空历史记录
* await clearAssistantHistory()
*/
export const clearAssistantHistory = (config = {}) => {
return BaseRequest.delete('/pet/user/assistant/clear-history', {}, 'AUTHENTICATED_DELETE', '正在清除历史记录...', config)
}
// ==================== 兼容性接口(保持向后兼容) ====================
/**
* 发送消息给AI助手兼容旧版本
* @deprecated 请使用 askPetAssistant 替代
* @param {Object} messageData 消息数据
* @param {Object} config 自定义配置
* @returns {Promise}
*/
export const sendMessage = (messageData, config = {}) => {
console.warn('sendMessage is deprecated, please use askPetAssistant instead')
return askPetAssistant(messageData, config)
}
/**
* 获取聊天历史(兼容旧版本)
* @deprecated 请使用 getAssistantHistory 替代
* @param {Object} params 查询参数
* @param {Object} config 自定义配置
* @returns {Promise}
*/
export const getChatHistory = (params = {}, config = {}) => {
console.warn('getChatHistory is deprecated, please use getAssistantHistory instead')
return getAssistantHistory(params, config)
}
/**
* 清除聊天历史(兼容旧版本)
* @deprecated 请使用 clearAssistantHistory 替代
* @param {Object} config 自定义配置
* @returns {Promise}
*/
export const clearChatHistory = (config = {}) => {
console.warn('clearChatHistory is deprecated, please use clearAssistantHistory instead')
return clearAssistantHistory({}, config)
}
// ==================== 工具函数 ====================
/**
* 验证消息内容
* @description 验证用户输入的消息是否符合要求
* @param {string} message 消息内容
* @returns {Object} 验证结果 { valid: boolean, error?: string }
*/
export const validateMessage = (message) => {
if (!message || typeof message !== 'string') {
return { valid: false, error: '消息内容不能为空' }
}
const trimmedMessage = message.trim()
if (trimmedMessage.length === 0) {
return { valid: false, error: '消息内容不能为空' }
}
if (trimmedMessage.length > 2000) {
return { valid: false, error: '消息内容不能超过2000个字符' }
}
return { valid: true }
}
/**
* 格式化聊天消息
* @description 将API返回的消息格式化为前端显示格式
* @param {Object} apiMessage API返回的消息对象
* @returns {Object} 格式化后的消息对象
*/
export const formatChatMessage = (apiMessage) => {
return {
id: apiMessage.id,
type: apiMessage.role === 'user' ? 'user' : 'ai',
content: apiMessage.messageContent || apiMessage.message || '',
time: formatMessageTime(apiMessage.createdAt || apiMessage.created_at),
sessionId: apiMessage.sessionId,
isSensitive: apiMessage.isSensitive || false,
tokenCount: apiMessage.tokenCount || 0,
responseTime: apiMessage.responseTime || 0
}
}
/**
* 格式化消息时间
* @description 将时间戳或时间字符串格式化为显示格式
* @param {string|number|Date} timestamp 时间戳或时间对象
* @returns {string} 格式化后的时间字符串
*/
export const formatMessageTime = (timestamp) => {
if (!timestamp) return ''
const date = new Date(timestamp)
const now = new Date()
const today = new Date(now.getFullYear(), now.getMonth(), now.getDate())
const messageDate = new Date(date.getFullYear(), date.getMonth(), date.getDate())
const timeStr = date.toLocaleTimeString('zh-CN', {
hour: '2-digit',
minute: '2-digit',
hour12: false
})
if (messageDate.getTime() === today.getTime()) {
return timeStr
} else if (messageDate.getTime() === today.getTime() - 24 * 60 * 60 * 1000) {
return `昨天 ${timeStr}`
} else {
return date.toLocaleDateString('zh-CN', {
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
hour12: false
})
}
}