import { StructuredTool, ToolRunnableConfig } from '@langchain/core/tools'; import { z } from 'zod'; import { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager'; import { getSupabaseClient } from '../supabaseClient'; export class SupportContextTool extends StructuredTool { name = 'get_support_context'; description = 'Получает последние 10 сообщений из истории поддержки для понимания контекста разговора. Используй этот инструмент в начале разговора.'; schema = z.object({}); private userId: string; constructor(userId: string) { super(); this.userId = userId; } protected async _call( arg: z.infer, runManager?: CallbackManagerForToolRun, parentConfig?: ToolRunnableConfig> ): Promise { try { const supabase = getSupabaseClient(); const { data: messages, error } = await supabase .from('support') .select('message, is_from_user, created_at') .eq('user_id', this.userId) .order('created_at', { ascending: false }) .limit(10); if (error) { return 'Не удалось получить историю сообщений.'; } if (!messages || messages.length === 0) { return 'История сообщений поддержки пуста. Это первое обращение пользователя.'; } const chronologicalMessages = messages.reverse(); const contextMessages = chronologicalMessages.map((msg, index) => { const role = msg.is_from_user ? 'Пользователь' : 'Агент поддержки'; const time = new Date(msg.created_at).toLocaleString('ru-RU'); return `${index + 1}. [${time}] ${role}: ${msg.message}`; }).join('\n'); return `Последние сообщения из истории поддержки (${messages.length} сообщений):\n\n${contextMessages}\n\nИспользуй этот контекст для понимания предыдущих обращений пользователя и предоставления более точных ответов.`; } catch (error) { return 'Произошла ошибка при получении истории сообщений.'; } } }