78 lines
3.5 KiB
TypeScript
78 lines
3.5 KiB
TypeScript
import { z } from "zod";
|
||
import gigachat from './gigachat';
|
||
|
||
export interface ModerationResult {
|
||
comment: string;
|
||
isApproved: boolean;
|
||
success: boolean;
|
||
error?: string;
|
||
}
|
||
|
||
export class ChatModerationAgent {
|
||
private moderationLlm: any;
|
||
|
||
constructor(GIGA_AUTH) {
|
||
// Создаем структурированный вывод для модерации
|
||
this.moderationLlm = gigachat(GIGA_AUTH).withStructuredOutput(z.object({
|
||
comment: z.string(),
|
||
isApproved: z.boolean(),
|
||
}) as any);
|
||
}
|
||
|
||
private getSystemPrompt(): string {
|
||
return `Ты модерируешь сообщения в чате. Твоя задача - проверить сообщение на нецензурную лексику, брань и неприемлемый контент.
|
||
|
||
Твои задачи:
|
||
1. Проверь сообщение на наличие нецензурной лексики, мата, ругательств и брани.
|
||
2. Проверь на оскорбления, угрозы и агрессивное поведение.
|
||
3. Проверь на спам и рекламу.
|
||
4. Проверь на неприемлемый контент (дискриминация, экстремизм и т.д.).
|
||
|
||
- Если сообщение не содержит запрещенного контента, оно одобряется (isApproved: true).
|
||
- Если сообщение содержит запрещенный контент, оно отклоняется (isApproved: false).
|
||
|
||
Правила написания комментария:
|
||
- Если сообщение одобряется, оставь поле comment пустым.
|
||
- Если сообщение отклоняется, пиши комментарий со следующей формулировкой:
|
||
"Сообщение удалено. Причина: (укажи конкретную причину: нецензурная лексика, оскорбления, спам и т.д.)"`;
|
||
}
|
||
|
||
public async moderateMessage(message: string): Promise<ModerationResult> {
|
||
try {
|
||
const prompt = `${this.getSystemPrompt()}
|
||
|
||
Сообщение: ${message}`;
|
||
|
||
const result = await this.moderationLlm.invoke(prompt);
|
||
|
||
// Дополнительная проверка
|
||
if (!result.isApproved && result.comment.trim() === '') {
|
||
result.comment = 'Сообщение удалено. Причина: нарушение правил чата.';
|
||
}
|
||
|
||
return {
|
||
comment: result.comment,
|
||
isApproved: result.isApproved,
|
||
success: true
|
||
};
|
||
|
||
} catch (error) {
|
||
console.error('❌ [Chat Moderation] Ошибка при модерации:', error);
|
||
|
||
// В случае ошибки одобряем сообщение
|
||
return {
|
||
comment: '',
|
||
isApproved: true,
|
||
success: false,
|
||
error: error instanceof Error ? error.message : 'Неизвестная ошибка'
|
||
};
|
||
}
|
||
}
|
||
}
|
||
|
||
// Экспортируем функцию для обратной совместимости
|
||
export const moderationText = async (title: string, body: string, GIGA_AUTH): Promise<[string, boolean, string]> => {
|
||
const agent = new ChatModerationAgent(GIGA_AUTH);
|
||
const result = await agent.moderateMessage(body);
|
||
return [result.comment, result.isApproved, body];
|
||
}; |