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'; export interface SupportAgentConfig { temperature?: number; threadId?: 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; if (config.temperature !== undefined) { this.llm.temperature = config.temperature; } const tools = [ new SupportContextTool(this.userId) ]; this.agent = createReactAgent({ llm: this.llm, tools: tools, checkpointSaver: this.memorySaver }); } private getDefaultSystemPrompt(): string { return `Ты - профессиональный агент службы поддержки. Твои основные задачи: - Помогать пользователям решать их вопросы и проблемы - Отвечать вежливо, профессионально и по существу - Предоставлять четкие и понятные инструкции - Проявлять эмпатию к проблемам пользователей - Если не знаешь ответ, честно сообщить об этом и предложить альтернативные способы получения помощи ВАЖНО: У тебя есть доступ к инструменту get_support_context, который позволяет получить историю предыдущих сообщений пользователя. ВСЕГДА используй этот инструмент ПЕРВЫМ ДЕЛОМ при получении каждого нового сообщения, чтобы понять контекст и предыдущие обращения пользователя. Только после получения контекста отвечай на вопрос пользователя. Если в истории есть предыдущие обращения, обязательно ссылайся на них в своем ответе, показывая что помнишь предыдущее общение. Всегда отвечай на русском языке и старайся быть максимально полезным.`; } public async processMessage(userMessage: string): Promise { try { const messages: BaseMessage[] = []; if (this.isFirstMessage) { messages.push(new SystemMessage(this.systemPrompt)); this.isFirstMessage = false; } messages.push(new HumanMessage(userMessage)); const response = await this.agent.invoke({ messages: messages }, { configurable: { thread_id: this.threadId } }); const lastMessage = response.messages[response.messages.length - 1]; return { content: 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) ]; this.agent = createReactAgent({ llm: this.llm, tools: tools, checkpointSaver: this.memorySaver }); this.isFirstMessage = true; } }