add support ai-agent

This commit is contained in:
Max
2025-06-12 20:58:54 +03:00
parent 7ecb73ac6e
commit ec6b30e220
7 changed files with 2611 additions and 116 deletions

View File

@@ -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
- 🧠 Память контекста диалога для каждого пользователя
- ⚙️ Настраиваемые системные промпты
- 📊 Поддержка множественных пользователей
## Примеры системных промптов
### Техническая поддержка
```
Ты - специалист технической поддержки мобильного приложения "Умный дом".
Помогай пользователям решать проблемы, объясняй функции простым языком,
проводи диагностику пошагово. Всегда будь дружелюбным и терпеливым.
```
### Общая поддержка клиентов
```
Ты - профессиональный агент службы поддержки. Помогай решать вопросы
пользователей, отвечай вежливо и по существу, проявляй эмпатию.
```

View File

@@ -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;

View File

@@ -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;
}
}