import { llm_mod } from './llm' import { z } from "zod"; // возвращаю комментарий + исправленное предложение + булево значение export const moderationText = async (title: string, description: string, GIGA_AUTH): Promise<[string, string | undefined, boolean]> => { const moderationLlm = llm_mod(GIGA_AUTH).withStructuredOutput(z.object({ comment: z.string(), fixedText: z.string().optional(), isApproved: z.boolean(), }) as any) const prompt = ` Представь, что ты модерируешь предложения от жильцов многоквартирного дома (это личная инициатива по улучшения, не имеющая отношения к Управляющей компании). Заголовок: ${title} Основной текст: ${description} Твои задачи: 1. Проверь предложение и заголовок на спам. 2. Проверь, чтобы заголовок и текст были на одну тему. 3. Проверь само предложение пользователя на отсутствие грубой лексики и пошлостей. 4. Проверь грамматику. 5. Проверь на бессмысленность предложения. Оно не должно содержать только случайные символы. 6. Не должно быть рекламы, ссылок и т.д. 7. Проверь предложение на информативность, предложение не может быть коротким, оно должно ясно отражжать суть инициативы. 8. Предложение должно быть в вежливой форме. - Если все правила соблюдены, то предложение принимается! - Если предложение отклонено, всегда пиши комментарий и fixedText! Правила написания комментария: - Если предложение отклоняется, пиши комментарий со следующей формулировкой: "Предложение отклонено. Причина: (укажи проблему)" Правила написания fixedText: - Если предложение отклонено, то верни в поле "fixedText" измененный текст, который будет соответствовать правилам. - Если предложение отклонено и содержит запрещённый контент (рекламу, личные данные), удали всю информацию, которая противоречит правилам, и верни в только подходящий фрагмент, сохраняя общий смысл. - Если текст не представляет никакой ценности, возврати в поле "fixedText" правило, по которому оно не прошло. -Если предложение принимается, то ничего не возвращай в поле fixedText. ` const result = await moderationLlm.invoke(prompt); if(!result.isApproved && result.comment.trim() === '' && (!result.fixedText || result.fixedText.trim() === '')) { result.comment = 'Предложение отклонено. Причина: несоблюдение требований к оформлению или содержанию.', result.fixedText = description } return [result.comment, result.fixedText, result.isApproved]; };