feature/worker #111

Merged
primakov merged 190 commits from feature/worker into master 2025-12-05 16:59:42 +03:00
3 changed files with 20 additions and 127 deletions
Showing only changes of commit 3af82f7478 - Show all commits

View File

@@ -1,63 +0,0 @@
# 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

@@ -5,7 +5,6 @@ import { MemorySaver } from '@langchain/langgraph';
import gigachat from './gigachat';
export interface SupportAgentConfig {
systemPrompt?: string;
temperature?: number;
threadId?: string;
}
@@ -22,11 +21,13 @@ export class SupportAgent {
private agent: any;
private systemPrompt: string;
private threadId: string;
private isFirstMessage: boolean;
constructor(config: SupportAgentConfig = {}) {
this.systemPrompt = config.systemPrompt || this.getDefaultSystemPrompt();
this.systemPrompt = this.getDefaultSystemPrompt();
this.threadId = config.threadId || 'default';
this.memorySaver = new MemorySaver();
this.isFirstMessage = true;
// Настраиваем модель с заданной температурой
this.llm = gigachat;
@@ -58,30 +59,24 @@ export class SupportAgent {
Всегда отвечай на русском языке и старайся быть максимально полезным.`;
}
/**
* Обновить системный промпт
*/
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 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({
@@ -120,12 +115,9 @@ export class SupportAgent {
tools: [],
checkpointSaver: this.memorySaver
});
// Сбрасываем флаг первого сообщения
this.isFirstMessage = true;
}
/**
* Изменить ID потока (для работы с разными пользователями)
*/
public setThreadId(threadId: string): void {
this.threadId = threadId;
}
}

View File

@@ -8,15 +8,12 @@ const userAgents = new Map();
/**
* Получить или создать агента для пользователя
*/
function getUserAgent(userId, systemPrompt) {
function getUserAgent(userId) {
if (!userAgents.has(userId)) {
const config = {
threadId: userId,
temperature: 0.7
};
if (systemPrompt) {
config.systemPrompt = systemPrompt;
}
userAgents.set(userId, new SupportAgent(config));
}
return userAgents.get(userId);
@@ -25,7 +22,7 @@ function getUserAgent(userId, systemPrompt) {
// POST /api/support
router.post('/support', async (req, res) => {
const supabase = getSupabaseClient();
const { user_id, message, system_prompt } = req.body;
const { user_id, message } = req.body;
if (!user_id || !message) {
return res.status(400).json({ error: 'user_id и message обязательны' });
@@ -42,12 +39,7 @@ router.post('/support', async (req, res) => {
}
// Получаем агента для пользователя
const agent = getUserAgent(user_id, system_prompt);
// Обновляем системный промпт если передан
if (system_prompt) {
agent.updateSystemPrompt(system_prompt);
}
const agent = getUserAgent(user_id);
// Получаем ответ от AI-агента
const aiResponse = await agent.processMessage(message);
@@ -89,35 +81,7 @@ router.post('/support', async (req, res) => {
}
});
// POST /api/support/configure - Настройка системного промпта
router.post('/support/configure', async (req, res) => {
const { user_id, system_prompt } = req.body;
if (!user_id) {
return res.status(400).json({ error: 'user_id обязателен' });
}
try {
const agent = getUserAgent(user_id, system_prompt);
if (system_prompt) {
agent.updateSystemPrompt(system_prompt);
}
res.json({
message: 'Конфигурация агента обновлена',
current_system_prompt: agent.getSystemPrompt(),
success: true
});
} catch (error) {
console.error('Ошибка в /support/configure:', error);
res.status(500).json({
error: 'Внутренняя ошибка сервера',
success: false
});
}
});
// DELETE /api/support/history/:userId - Очистка истории диалога
router.delete('/support/history/:userId', async (req, res) => {