Files
multy-stub/server/routers/kfu-m-24-1/sber_mobile/support-ai-agent/support-agent.ts
T
2025-06-13 22:31:32 +03:00

121 lines
4.9 KiB
TypeScript

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<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();
const tools = [
new SupportContextTool(this.userId)
];
this.agent = createReactAgent({
llm: this.llm,
tools: tools,
checkpointSaver: this.memorySaver
});
this.isFirstMessage = true;
}
}