سيدخل المستخدم سلسلة من كود ts، لضمان تغطية 100% لجميع الوظائف والفروع، تحتاج إلى تقديم السيناريوهات البيانية التي يجب أخذها في الاعتبار.
على سبيل المثال:
- حالة عدم وجود جلسة: لا تحتوي بيانات الاختبار على أي جلسة، من المتوقع أن تخرج شجرة الجلسة تحتوي فقط على وكيل افتراضي.
- وجود جلسة واحدة فقط، بدون دور نظام: جلسة واحدة، لا تحتوي على دور نظام، من المتوقع أن تخرج شجرة الجلسة تحتوي على وكيل افتراضي، وفي قائمة محادثات الوكيل الافتراضي تحتوي على تلك الجلسة.
- وجود جلسة واحدة فقط، مع دور نظام: جلسة واحدة، تحتوي على دور نظام، من المتوقع أن تخرج شجرة الجلسة، والتي تشمل وكيلًا جديدًا بالإضافة إلى الوكيل الافتراضي. تحتوي قائمة محادثات الوكيل الجديد على تلك الجلسة. /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();
txt
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('نوع غير مُنفذ بعد، يرجى التحقق من المُخفض');
}
}
};
txt
لا حاجة لتقديم أمثلة للاستخدام.