Files
multy-stub/server/routers/kfu-m-24-1/sber_mobile/chat-ai-agent/chat-moderation.ts
2025-06-14 16:12:03 +03:00

91 lines
4.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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];
}
};