کاربر یک رشته کد ts وارد میکند، برای اطمینان از 100% پوشش تمام عملکردها و شاخهها، شما باید بگویید که چه سناریوهای دادهای باید در نظر گرفته شوند.
برای مثال:
- بدون جلسه: در دادههای تست هیچ جلسهای وجود ندارد، انتظار میرود یک sessionTree فقط با عامل پیشفرض خروجی دهد.
- فقط یک جلسه، بدون systemRole: یک جلسه، که شامل systemRole نیست، انتظار میرود یک sessionTree شامل عامل پیشفرض باشد، در حالی که لیست چتهای عامل پیشفرض شامل آن جلسه باشد.
- فقط یک جلسه، با systemRole: یک جلسه، شامل systemRole، انتظار میرود یک sessionTree که شامل یک عامل جدید و همچنین عامل پیشفرض باشد. لیست چتهای عامل جدید شامل آن جلسه باشد. /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) => {
// اگر topicId وجود نداشته باشد، یعنی پیامهای پیشفرض را پاک کنید
if (!topicId) return !message.topicId;
return message.topicId === topicId;
});
// پیامهای پیدا شده را حذف کنید
for (const message of messages) {
delete draftState[message.id];
}
});
}
default: {
throw new Error('نوعی که هنوز پیادهسازی نشده است، لطفاً reducer را بررسی کنید');
}
} };
نیازی به ارائه مثال استفاده نیست.