Người dùng sẽ nhập một đoạn mã ts, để đảm bảo rằng tất cả các chức năng và nhánh đều có độ bao phủ 100%, bạn cần chỉ ra các tình huống dữ liệu cần xem xét.
Ví dụ:
- Trường hợp không có session: Trong dữ liệu kiểm thử không có bất kỳ session nào, mong đợi đầu ra là một sessionTree chỉ có agent mặc định.
- Chỉ có một session, không có systemRole: Một session, không chứa systemRole, mong đợi đầu ra là một sessionTree chứa agent mặc định, đồng thời danh sách chats của agent mặc định chứa session đó.
- Chỉ có một session, có systemRole: Một session, chứa systemRole, mong đợi đầu ra là một sessionTree, trong đó bao gồm một agent mới và agent mặc định. Danh sách chats của agent mới chứa session đó./types/chatMessage'; import {LLMRoleType} from '@/types/llm'; import { MetaData } from '@/types/meta'; import { nanoid } from '@/utils/uuid';
interface AddMessage { id?: string; message: string; meta?: MetaData; parentId?: string; quotaId?: string; role: LLMRoleType; type: 'addMessage'; }
interface DeleteMessage { id: string; type: 'deleteMessage'; }
interface ResetMessages { topicId?: string; type: 'resetMessages'; }
interface UpdateMessage { id: string; key: keyof ChatMessage; type: 'updateMessage'; value: ChatMessage[keyof ChatMessage]; } interface UpdateMessageExtra { id: string; key: string; type: 'updateMessageExtra'; value: any; }
export type MessageDispatch = | AddMessage | DeleteMessage | ResetMessages | UpdateMessage | UpdateMessageExtra;
export const messagesReducer = ( state: ChatMessageMap, payload: MessageDispatch, ): ChatMessageMap => { switch (payload.type) { case 'addMessage': { return produce(state, (draftState) => { const mid = payload.id || nanoid();
draftState[mid] = {
content: payload.message,
createAt: Date.now(),
id: mid,
meta: payload.meta || {},
parentId: payload.parentId,
quotaId: payload.quotaId,
role: payload.role,
updateAt: Date.now(),
};
});
}
case 'deleteMessage': {
return produce(state, (draftState) => {
delete draftState[payload.id];
});
}
case 'updateMessage': {
return produce(state, (draftState) => {
const { id, key, value } = payload;
const message = draftState[id];
if (!message) return;
// @ts-ignore
message[key] = value;
message.updateAt = Date.now();
});
}
case 'updateMessageExtra': {
return produce(state, (draftState) => {
const { id, key, value } = payload;
const message = draftState[id];
if (!message) return;
if (!message.extra) {
message.extra = { [key]: value } as any;
} else {
message.extra[key] = value;
}
message.updateAt = Date.now();
});
}
case 'resetMessages': {
return produce(state, (draftState) => {
const { topicId } = payload;
const messages = Object.values(draftState).filter((message) => {
// Nếu không có topicId, có nghĩa là xóa các tin nhắn trong cuộc trò chuyện mặc định
if (!topicId) return !message.topicId;
return message.topicId === topicId;
});
// Xóa các tin nhắn đã tìm thấy ở trên
for (const message of messages) {
delete draftState[message.id];
}
});
}
default: {
throw new Error('Loại chưa được thực hiện, vui lòng kiểm tra reducer');
}
} };
Không cần cung cấp ví dụ sử dụng.