121 lines
4.9 KiB
TypeScript
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;
|
|
}
|
|
}
|