@lobehub/chat
Version:
Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.
147 lines (116 loc) • 3.86 kB
text/typescript
import dayjs from 'dayjs';
import { FileModel } from '@/database/_deprecated/models/file';
import { MessageModel } from '@/database/_deprecated/models/message';
import { DB_Message } from '@/database/_deprecated/schemas/message';
import {
ChatFileItem,
ChatMessage,
ChatMessageError,
ChatTTS,
ChatTranslate,
CreateMessageParams,
ModelRankItem,
} from '@/types/message';
import { IMessageService } from './type';
export class ClientService implements IMessageService {
async createMessage(data: CreateMessageParams) {
const { id } = await MessageModel.create(data);
return id;
}
// @ts-ignore
async batchCreateMessages(messages: ChatMessage[]) {
return MessageModel.batchCreate(messages);
}
async getMessages(sessionId: string, topicId?: string): Promise<ChatMessage[]> {
const messages = await MessageModel.query({ sessionId, topicId });
const fileList = (await Promise.all(
messages
.flatMap((item) => item.files)
.filter(Boolean)
.map(async (id) => FileModel.findById(id!)),
)) as ChatFileItem[];
return messages.map((item) => ({
...item,
imageList: fileList
.filter((file) => item.files?.includes(file.id) && file.fileType.startsWith('image'))
.map((file) => ({
alt: file.name,
id: file.id,
url: file.url,
})),
}));
}
async getAllMessages() {
return MessageModel.queryAll();
}
async countMessages() {
return MessageModel.count();
}
// @ts-ignore
async rankModels(): Promise<ModelRankItem[]> {
throw new Error('Method not implemented.');
}
// @ts-ignore
async countWords(): Promise<number> {
throw new Error('Method not implemented.');
}
// @ts-ignore
async getHeatmaps() {
throw new Error('Method not implemented.');
}
async countTodayMessages() {
const topics = await MessageModel.queryAll();
return topics.filter(
(item) => dayjs(item.createdAt).format('YYYY-MM-DD') === dayjs().format('YYYY-MM-DD'),
).length;
}
async getAllMessagesInSession(sessionId: string) {
return MessageModel.queryBySessionId(sessionId);
}
async updateMessageError(id: string, error: ChatMessageError) {
return MessageModel.update(id, { error });
}
// @ts-ignore
async updateMessage(id: string, message: Partial<DB_Message>) {
return MessageModel.update(id, message);
}
async updateMessageTTS(id: string, tts: Partial<ChatTTS> | false) {
return MessageModel.update(id, { tts });
}
async updateMessageTranslate(id: string, translate: Partial<ChatTranslate> | false) {
return MessageModel.update(id, { translate });
}
async updateMessagePluginState(id: string, value: Record<string, any>) {
return MessageModel.updatePluginState(id, value);
}
async updateMessagePluginArguments(id: string, value: string | Record<string, any>) {
const args = typeof value === 'string' ? value : JSON.stringify(value);
return MessageModel.updatePlugin(id, { arguments: args });
}
async bindMessagesToTopic(topicId: string, messageIds: string[]) {
return MessageModel.batchUpdate(messageIds, { topicId });
}
async removeMessage(id: string) {
return MessageModel.delete(id);
}
async removeMessages(ids: string[]) {
return MessageModel.bulkDelete(ids);
}
async removeMessagesByAssistant(assistantId: string, topicId?: string) {
return MessageModel.batchDelete(assistantId, topicId);
}
async removeAllMessages() {
return MessageModel.clearTable();
}
async hasMessages() {
const number = await this.countMessages();
return number > 0;
}
async messageCountToCheckTrace() {
const number = await this.countMessages();
return number >= 4;
}
async updateMessagePluginError() {
throw new Error('Method not implemented.');
}
}