import { StructuredTool, ToolRunnableConfig } from '@langchain/core/tools'; import { z } from 'zod'; import { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager'; import { getSupabaseClient } from '../supabaseClient'; export class CreateTicketTool extends StructuredTool { name = 'create_ticket'; description = 'Создает заявку в системе. ВАЖНО: используй этот инструмент ТОЛЬКО после получения явного согласия пользователя на создание заявки с конкретным текстом.'; schema = z.object({ title: z.string().describe('Заголовок заявки'), description: z.string().describe('Подробное описание проблемы'), category: z.string().describe('Категория заявки (например: ремонт, уборка, техническая_поддержка, жалоба)'), }); private userId: string; private apartmentId: string; constructor(userId: string, apartmentId: string) { super(); this.userId = userId; this.apartmentId = apartmentId; } protected async _call( arg: z.infer, runManager?: CallbackManagerForToolRun, parentConfig?: ToolRunnableConfig> ): Promise { try { if (!this.apartmentId) { return 'Не удалось определить вашу квартиру. Обратитесь к администратору для создания заявки.'; } const supabase = getSupabaseClient(); const { data: ticket, error } = await supabase .from('tickets') .insert({ user_id: this.userId, apartment_id: this.apartmentId, title: arg.title, description: arg.description, category: arg.category, status: 'open' }) .select() .single(); if (error) { return 'Произошла ошибка при создании заявки. Попробуйте позже или обратитесь к администратору.'; } return `Заявка успешно создана! Номер заявки: ${ticket.id} Заголовок: ${ticket.title} Статус: Открыта Дата создания: ${new Date(ticket.created_at).toLocaleString('ru-RU')} Ваша заявка принята в работу. Мы свяжемся с вами в ближайшее время.`; } catch (error) { return 'Произошла техническая ошибка при создании заявки. Пожалуйста, попробуйте позже.'; } } }