add support ai-agent
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
# AI Support Agent
|
||||
|
||||
AI-агент поддержки интегрирован в существующий `supportApi.js`.
|
||||
|
||||
## Структура
|
||||
|
||||
```
|
||||
support-ai-agent/
|
||||
├── gigachat.ts # Конфигурация GigaChat
|
||||
├── support-agent.ts # Основной класс агента
|
||||
└── README.md # Документация
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
### POST `/support`
|
||||
Отправить сообщение в службу поддержки (теперь с AI-агентом).
|
||||
|
||||
**Запрос:**
|
||||
```json
|
||||
{
|
||||
"user_id": "string", // Обязательно
|
||||
"message": "string", // Обязательно
|
||||
"system_prompt": "string" // Опционально - настройка поведения агента
|
||||
}
|
||||
```
|
||||
|
||||
**Ответ:**
|
||||
```json
|
||||
{
|
||||
"reply": "Ответ AI-агента",
|
||||
"success": true
|
||||
}
|
||||
```
|
||||
|
||||
### POST `/support/configure`
|
||||
Настроить системный промпт для конкретного пользователя.
|
||||
|
||||
### DELETE `/support/history/:userId`
|
||||
Очистить историю диалога пользователя.
|
||||
|
||||
## Возможности
|
||||
|
||||
- 🤖 Интеллектуальные ответы на основе GigaChat
|
||||
- 💾 Сохранение всех сообщений в базу данных Supabase
|
||||
- 🧠 Память контекста диалога для каждого пользователя
|
||||
- ⚙️ Настраиваемые системные промпты
|
||||
- 📊 Поддержка множественных пользователей
|
||||
|
||||
## Примеры системных промптов
|
||||
|
||||
### Техническая поддержка
|
||||
```
|
||||
Ты - специалист технической поддержки мобильного приложения "Умный дом".
|
||||
Помогай пользователям решать проблемы, объясняй функции простым языком,
|
||||
проводи диагностику пошагово. Всегда будь дружелюбным и терпеливым.
|
||||
```
|
||||
|
||||
### Общая поддержка клиентов
|
||||
```
|
||||
Ты - профессиональный агент службы поддержки. Помогай решать вопросы
|
||||
пользователей, отвечай вежливо и по существу, проявляй эмпатию.
|
||||
```
|
||||
@@ -0,0 +1,18 @@
|
||||
import { Agent } from 'node:https';
|
||||
import { GigaChat } from 'langchain-gigachat';
|
||||
|
||||
const httpsAgent = new Agent({
|
||||
rejectUnauthorized: false,
|
||||
});
|
||||
|
||||
// Получаем GIGA_AUTH из переменной окружения (устанавливается в get-constants.js)
|
||||
export const gigachat = new GigaChat({
|
||||
model: 'GigaChat-2',
|
||||
temperature: 0.7,
|
||||
scope: 'GIGACHAT_API_PERS',
|
||||
streaming: false,
|
||||
credentials: process.env.GIGA_AUTH,
|
||||
httpsAgent
|
||||
});
|
||||
|
||||
export default gigachat;
|
||||
@@ -0,0 +1,131 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user