add chat moderation

This commit is contained in:
DenAntonov
2025-06-14 16:12:03 +03:00
parent 471cbacb66
commit bd0b11dc4a
6 changed files with 743 additions and 5 deletions

View File

@@ -0,0 +1,91 @@
import { Agent } from 'node:https';
import { GigaChat } from "langchain-gigachat";
import { z } from "zod";
const httpsAgent = new Agent({
rejectUnauthorized: false,
});
const llm = new GigaChat({
credentials: "MGIzODY1N2MtYzMwMS00N2I4LWI1YzQtM2U4NzAxZGI5NmMzOjJmNzcyYzBmLWU0NjUtNGNmZC1iMDM2LTRjNmY0N2JhNDdiOA==",
temperature: 0.2,
model: 'GigaChat-2',
httpsAgent,
});
// возвращаю комментарий + булево значение (удалять или нет) + финальный текст сообщения
const moderationLlm = llm.withStructuredOutput(z.object({
comment: z.string(),
isApproved: z.boolean(),
}) as any)
export const moderationText = async (title: string, body: string): Promise<[string, boolean, string]> => {
const startTime = Date.now();
const messagePreview = body.length > 50 ? body.substring(0, 50) + '...' : body;
console.log(`🤖 [AI Agent] Начинаем анализ сообщения: "${messagePreview}"`);
console.log(`🤖 [AI Agent] Длина сообщения: ${body.length} символов`);
console.log(`🤖 [AI Agent] Модель: GigaChat-2, Temperature: 0.2`);
const prompt = `
Ты модерируешь сообщения в чате. Твоя задача - проверить сообщение на нецензурную лексику, брань и неприемлемый контент.
Сообщение: ${body}
Твои задачи:
1. Проверь сообщение на наличие нецензурной лексики, мата, ругательств и брани.
2. Проверь на оскорбления, угрозы и агрессивное поведение.
3. Проверь на спам и рекламу.
4. Проверь на неприемлемый контент (дискриминация, экстремизм и т.д.).
- Если сообщение не содержит запрещенного контента, оно одобряется (isApproved: true).
- Если сообщение содержит запрещенный контент, оно отклоняется (isApproved: false).
Правила написания комментария:
- Если сообщение одобряется, оставь поле comment пустым.
- Если сообщение отклоняется, пиши комментарий со следующей формулировкой:
"Сообщение удалено. Причина: (укажи конкретную причину: нецензурная лексика, оскорбления, спам и т.д.)"
`
try {
console.log(`🤖 [AI Agent] Отправляем запрос к GigaChat...`);
const result = await moderationLlm.invoke(prompt);
const processingTime = Date.now() - startTime;
console.log(`🤖 [AI Agent] Получен ответ от GigaChat за ${processingTime}мс`);
console.log(`🤖 [AI Agent] Результат анализа:`, {
isApproved: result.isApproved,
comment: result.comment || 'нет комментария',
hasComment: !!result.comment
});
// Дополнительная проверка
if(!result.isApproved && result.comment.trim() === '') {
console.log(`⚠️ [AI Agent] Сообщение отклонено, но комментарий пустой. Добавляем стандартный комментарий.`);
result.comment = 'Сообщение удалено. Причина: нарушение правил чата.'
}
// Определяем итоговый текст сообщения
let finalMessage = body;
if (!result.isApproved) {
finalMessage = '[Удалено модератором]';
console.log(`🚫 [AI Agent] Сообщение будет заменено на: "${finalMessage}"`);
} else {
console.log(`✅ [AI Agent] Сообщение одобрено, остается без изменений`);
}
console.log(`🤖 [AI Agent] Анализ завершен. Общее время: ${Date.now() - startTime}мс`);
return [result.comment, result.isApproved, finalMessage];
} catch (error) {
const processingTime = Date.now() - startTime;
console.error(`❌ [AI Agent] Ошибка при анализе сообщения (${processingTime}мс):`, error);
console.error(`❌ [AI Agent] Сообщение будет одобрено из-за ошибки модерации`);
// В случае ошибки одобряем сообщение
return ['', true, body];
}
};