import { HumanMessage, AIMessage, SystemMessage, BaseMessage } from '@langchain/core/messages'; import { ChatPromptTemplate, MessagesPlaceholder } from '@langchain/core/prompts'; import { createReactAgent } from '@langchain/langgraph/prebuilt'; import { MemorySaver } from '@langchain/langgraph'; import gigachat from './gigachat'; import { SupportContextTool } from './support-context-tool'; import { KnowledgeBaseTool } from './knowledge-base-tool'; import { CreateTicketTool } from './create-ticket-tool'; export interface SupportAgentConfig { temperature?: number; threadId?: string; GIGA_AUTH?: string; } export interface SupportResponse { content: string; success: boolean; error?: string; } export class SupportAgent { private llm: any; private memorySaver: MemorySaver; private agent: any; private systemPrompt: string; private threadId: string; private isFirstMessage: boolean; private userId: string; constructor(config: SupportAgentConfig = {}) { this.systemPrompt = this.getDefaultSystemPrompt(); this.threadId = config.threadId || 'default'; this.userId = this.threadId; this.memorySaver = new MemorySaver(); this.isFirstMessage = true; this.llm = gigachat(config.GIGA_AUTH); if (config.temperature !== undefined) { this.llm.temperature = config.temperature; } const tools = [ new SupportContextTool(this.userId), new KnowledgeBaseTool() ]; this.agent = createReactAgent({ llm: this.llm, tools: tools, checkpointSaver: this.memorySaver }); } private getDefaultSystemPrompt(): string { return `Ты - профессиональный агент службы поддержки управляющей компании. ОСНОВНЫЕ ПРИНЦИПЫ: - Помогай только с реальными проблемами и вопросами, связанными с ЖКХ, управляющей компанией и приложением - Будь вежливым, профессиональным и по существу - Если вопрос неуместен, не связан с твоими обязанностями или является развлекательным - вежливо откажись и перенаправь к основным темам ДОСТУПНЫЕ ИНСТРУМЕНТЫ: 1. get_support_context - получает историю сообщений пользователя ВСЕГДА используй ПЕРВЫМ при каждом новом сообщении 2. search_knowledge_base - поиск в базе знаний компании Используй ТОЛЬКО для серьезных вопросов о: - Процессах оплаты ЖКХ и тарифах - Подаче заявок и документообороте - Правилах и регламентах УК - Технических вопросах приложения - Процедурах и инструкциях компании 3. create_ticket - создание заявки в системе Используй ТОЛЬКО когда: - Пользователь сообщает о реальной проблеме (поломка, неисправность, жалоба) - Проблема требует вмешательства УК или технических служб - ОБЯЗАТЕЛЬНО сначала покажи пользователю полный текст заявки - Получи ЯВНОЕ согласие пользователя перед созданием - НЕ создавай заявки для консультационных вопросов ПРАВИЛА ИСПОЛЬЗОВАНИЯ ИНСТРУМЕНТОВ: - НЕ используй search_knowledge_base и create_ticket для: * Общих вопросов и болтовни * Развлекательных запросов * Вопросов не по теме ЖКХ/УК * Простых консультаций, которые можно решить обычным ответом АЛГОРИТМ РАБОТЫ: 1. Получи контекст истории сообщений 2. Определи, является ли вопрос уместным и серьезным 3. Если нужна специфическая информация - найди в базе знаний 4. Если нужно создать заявку - покажи текст и получи согласие 5. Дай полный и полезный ответ Всегда отвечай на русском языке и фокусируйся на помощи с реальными проблемами ЖКХ.`; } public async processMessage(userMessage: string, apartmentId?: string): Promise { try { const messages: BaseMessage[] = []; if (this.isFirstMessage) { messages.push(new SystemMessage(this.systemPrompt)); this.isFirstMessage = false; } messages.push(new HumanMessage(userMessage)); // Создаем инструменты с актуальным apartmentId const tools = [ new SupportContextTool(this.userId), new KnowledgeBaseTool(), new CreateTicketTool(this.userId, apartmentId || '') ]; // Пересоздаем агента с обновленными инструментами const tempAgent = createReactAgent({ llm: this.llm, tools: tools, checkpointSaver: this.memorySaver }); const response = await tempAgent.invoke({ messages: messages }, { configurable: { thread_id: this.threadId } }); const lastMessage = response.messages[response.messages.length - 1]; return { content: typeof lastMessage.content === 'string' ? lastMessage.content : 'Извините, не удалось сформировать ответ.', success: true }; } catch (error) { console.error('Ошибка при обработке сообщения:', error); return { content: 'Извините, произошла ошибка при обработке вашего запроса. Попробуйте позже.', success: false, error: error instanceof Error ? error.message : 'Неизвестная ошибка' }; } } public async clearHistory(): Promise { this.memorySaver = new MemorySaver(); const tools = [ new SupportContextTool(this.userId), new KnowledgeBaseTool() ]; this.agent = createReactAgent({ llm: this.llm, tools: tools, checkpointSaver: this.memorySaver }); this.isFirstMessage = true; } }