Files
multy-stub/server/routers/kfu-m-24-1/sber_mobile/support-ai-agent/support-agent.ts
2025-06-13 19:44:45 +03:00

123 lines
4.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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';
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;
constructor(config: SupportAgentConfig = {}) {
this.systemPrompt = this.getDefaultSystemPrompt();
this.threadId = config.threadId || 'default';
this.memorySaver = new MemorySaver();
this.isFirstMessage = true;
// Настраиваем модель с заданной температурой
this.llm = gigachat;
if (config.temperature !== undefined) {
this.llm.temperature = config.temperature;
}
// Создаем агента без инструментов для простого чата
this.agent = createReactAgent({
llm: this.llm,
tools: [],
checkpointSaver: this.memorySaver
});
}
/**
* Получить системный промпт по умолчанию для агента поддержки
*/
private getDefaultSystemPrompt(): string {
return `Ты - профессиональный агент службы поддержки.
Твои основные задачи:
- Помогать пользователям решать их вопросы и проблемы
- Отвечать вежливо, профессионально и по существу
- Предоставлять четкие и понятные инструкции
- Проявлять эмпатию к проблемам пользователей
- Если не знаешь ответ, честно сообщить об этом и предложить альтернативные способы получения помощи
Всегда отвечай на русском языке и старайся быть максимально полезным.`;
}
/**
* Обработать сообщение пользователя и получить ответ
*/
public async processMessage(userMessage: string): Promise<SupportResponse> {
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<void> {
this.memorySaver = new MemorySaver();
this.agent = createReactAgent({
llm: this.llm,
tools: [],
checkpointSaver: this.memorySaver
});
// Сбрасываем флаг первого сообщения
this.isFirstMessage = true;
}
}