56 lines
2.6 KiB
TypeScript
56 lines
2.6 KiB
TypeScript
import { StructuredTool, ToolRunnableConfig } from '@langchain/core/tools';
|
||
import { z } from 'zod';
|
||
import { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';
|
||
import { getSupabaseClient } from '../supabaseClient';
|
||
|
||
export class SupportContextTool extends StructuredTool {
|
||
name = 'get_support_context';
|
||
description = 'Получает последние 10 сообщений из истории поддержки для понимания контекста разговора. Используй этот инструмент в начале разговора.';
|
||
|
||
schema = z.object({});
|
||
|
||
private userId: string;
|
||
|
||
constructor(userId: string) {
|
||
super();
|
||
this.userId = userId;
|
||
}
|
||
|
||
protected async _call(
|
||
arg: z.infer<typeof this.schema>,
|
||
runManager?: CallbackManagerForToolRun,
|
||
parentConfig?: ToolRunnableConfig<Record<string, any>>
|
||
): Promise<string> {
|
||
try {
|
||
const supabase = getSupabaseClient();
|
||
|
||
const { data: messages, error } = await supabase
|
||
.from('support')
|
||
.select('message, is_from_user, created_at')
|
||
.eq('user_id', this.userId)
|
||
.order('created_at', { ascending: false })
|
||
.limit(10);
|
||
|
||
if (error) {
|
||
return 'Не удалось получить историю сообщений.';
|
||
}
|
||
|
||
if (!messages || messages.length === 0) {
|
||
return 'История сообщений поддержки пуста. Это первое обращение пользователя.';
|
||
}
|
||
|
||
const chronologicalMessages = messages.reverse();
|
||
|
||
const contextMessages = chronologicalMessages.map((msg, index) => {
|
||
const role = msg.is_from_user ? 'Пользователь' : 'Агент поддержки';
|
||
const time = new Date(msg.created_at).toLocaleString('ru-RU');
|
||
return `${index + 1}. [${time}] ${role}: ${msg.message}`;
|
||
}).join('\n');
|
||
|
||
return `Последние сообщения из истории поддержки (${messages.length} сообщений):\n\n${contextMessages}\n\nИспользуй этот контекст для понимания предыдущих обращений пользователя и предоставления более точных ответов.`;
|
||
|
||
} catch (error) {
|
||
return 'Произошла ошибка при получении истории сообщений.';
|
||
}
|
||
}
|
||
}
|