66 lines
2.9 KiB
TypeScript
66 lines
2.9 KiB
TypeScript
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<typeof this.schema>,
|
||
runManager?: CallbackManagerForToolRun,
|
||
parentConfig?: ToolRunnableConfig<Record<string, any>>
|
||
): Promise<string> {
|
||
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 'Произошла техническая ошибка при создании заявки. Пожалуйста, попробуйте позже.';
|
||
}
|
||
}
|
||
}
|