131 lines
4.8 KiB
TypeScript
131 lines
4.8 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';
|
||
|
||
export interface SupportAgentConfig {
|
||
systemPrompt?: string;
|
||
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;
|
||
|
||
constructor(config: SupportAgentConfig = {}) {
|
||
this.systemPrompt = config.systemPrompt || this.getDefaultSystemPrompt();
|
||
this.threadId = config.threadId || 'default';
|
||
this.memorySaver = new MemorySaver();
|
||
|
||
// Настраиваем модель с заданной температурой
|
||
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 updateSystemPrompt(newPrompt: string): void {
|
||
this.systemPrompt = newPrompt;
|
||
}
|
||
|
||
/**
|
||
* Получить текущий системный промпт
|
||
*/
|
||
public getSystemPrompt(): string {
|
||
return this.systemPrompt;
|
||
}
|
||
|
||
/**
|
||
* Обработать сообщение пользователя и получить ответ
|
||
*/
|
||
public async processMessage(userMessage: string): Promise<SupportResponse> {
|
||
try {
|
||
// Создаем сообщения с системным промптом
|
||
const messages = [
|
||
new SystemMessage(this.systemPrompt),
|
||
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
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Изменить ID потока (для работы с разными пользователями)
|
||
*/
|
||
public setThreadId(threadId: string): void {
|
||
this.threadId = threadId;
|
||
}
|
||
}
|