ваше сообщение коммита
This commit is contained in:
@@ -34,30 +34,51 @@ class AIAssistant {
|
||||
}
|
||||
|
||||
// Основной метод для получения ответа
|
||||
async getResponse(message, language = 'auto') {
|
||||
async getResponse(message, language = 'auto', history = null, systemPrompt = '', rules = null) {
|
||||
try {
|
||||
console.log('getResponse called with:', { message, language });
|
||||
console.log('getResponse called with:', { message, language, history, systemPrompt, rules });
|
||||
|
||||
// Определяем язык, если не указан явно
|
||||
const detectedLanguage = language === 'auto' ? this.detectLanguage(message) : language;
|
||||
|
||||
console.log('Detected language:', detectedLanguage);
|
||||
|
||||
// Сначала пробуем прямой API запрос
|
||||
// Формируем system prompt с учётом правил
|
||||
let fullSystemPrompt = systemPrompt || '';
|
||||
if (rules && typeof rules === 'object') {
|
||||
fullSystemPrompt += '\n' + JSON.stringify(rules, null, 2);
|
||||
}
|
||||
|
||||
// Формируем массив сообщений для Qwen2.5/OpenAI API
|
||||
const messages = [];
|
||||
if (fullSystemPrompt) {
|
||||
messages.push({ role: 'system', content: fullSystemPrompt });
|
||||
}
|
||||
if (Array.isArray(history) && history.length > 0) {
|
||||
for (const msg of history) {
|
||||
if (msg.role && msg.content) {
|
||||
messages.push({ role: msg.role, content: msg.content });
|
||||
}
|
||||
}
|
||||
}
|
||||
// Добавляем текущее сообщение пользователя
|
||||
messages.push({ role: 'user', content: message });
|
||||
|
||||
// Пробуем прямой API запрос (OpenAI-совместимый endpoint)
|
||||
try {
|
||||
console.log('Trying direct API request...');
|
||||
const response = await this.fallbackRequest(message, detectedLanguage);
|
||||
const response = await this.fallbackRequestOpenAI(messages, detectedLanguage);
|
||||
console.log('Direct API response received:', response);
|
||||
return response;
|
||||
} catch (error) {
|
||||
console.error('Error in direct API request:', error);
|
||||
}
|
||||
|
||||
// Если прямой запрос не удался, пробуем через ChatOllama
|
||||
// Если прямой запрос не удался, пробуем через ChatOllama (склеиваем сообщения в текст)
|
||||
const chat = this.createChat(detectedLanguage);
|
||||
try {
|
||||
const prompt = messages.map(m => `${m.role === 'user' ? 'Пользователь' : m.role === 'assistant' ? 'Ассистент' : 'Система'}: ${m.content}`).join('\n');
|
||||
console.log('Sending request to ChatOllama...');
|
||||
const response = await chat.invoke(message);
|
||||
const response = await chat.invoke(prompt);
|
||||
console.log('ChatOllama response:', response);
|
||||
return response.content;
|
||||
} catch (error) {
|
||||
@@ -70,24 +91,17 @@ class AIAssistant {
|
||||
}
|
||||
}
|
||||
|
||||
// Альтернативный метод запроса через прямой API
|
||||
async fallbackRequest(message, language) {
|
||||
// Новый метод для OpenAI/Qwen2.5 совместимого endpoint
|
||||
async fallbackRequestOpenAI(messages, language) {
|
||||
try {
|
||||
console.log('Using fallback request method with:', { message, language });
|
||||
|
||||
const systemPrompt =
|
||||
language === 'ru'
|
||||
? 'Вы - полезный ассистент. Отвечайте на русском языке.'
|
||||
: 'You are a helpful assistant. Respond in English.';
|
||||
|
||||
console.log('Sending request to Ollama API...');
|
||||
const response = await fetch(`${this.baseUrl}/api/generate`, {
|
||||
console.log('Using fallbackRequestOpenAI with:', { messages, language });
|
||||
const model = this.defaultModel;
|
||||
const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
model: this.defaultModel,
|
||||
prompt: message,
|
||||
system: systemPrompt,
|
||||
model,
|
||||
messages,
|
||||
stream: false,
|
||||
options: {
|
||||
temperature: 0.7,
|
||||
@@ -95,16 +109,17 @@ class AIAssistant {
|
||||
},
|
||||
}),
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`HTTP error! status: ${response.status}`);
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
console.log('Ollama API response:', data);
|
||||
return data.response;
|
||||
// Qwen2.5/OpenAI API возвращает ответ в data.choices[0].message.content
|
||||
if (data.choices && data.choices[0] && data.choices[0].message && data.choices[0].message.content) {
|
||||
return data.choices[0].message.content;
|
||||
}
|
||||
return data.response || '';
|
||||
} catch (error) {
|
||||
console.error('Error in fallback request:', error);
|
||||
console.error('Error in fallbackRequestOpenAI:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
35
backend/services/aiAssistantRulesService.js
Normal file
35
backend/services/aiAssistantRulesService.js
Normal file
@@ -0,0 +1,35 @@
|
||||
const db = require('../db');
|
||||
const TABLE = 'ai_assistant_rules';
|
||||
|
||||
async function getAllRules() {
|
||||
const { rows } = await db.getQuery()(`SELECT * FROM ${TABLE} ORDER BY id`);
|
||||
return rows;
|
||||
}
|
||||
|
||||
async function getRuleById(id) {
|
||||
const { rows } = await db.getQuery()(`SELECT * FROM ${TABLE} WHERE id = $1`, [id]);
|
||||
return rows[0] || null;
|
||||
}
|
||||
|
||||
async function createRule({ name, description, rules }) {
|
||||
const { rows } = await db.getQuery()(
|
||||
`INSERT INTO ${TABLE} (name, description, rules, created_at, updated_at)
|
||||
VALUES ($1, $2, $3, NOW(), NOW()) RETURNING *`,
|
||||
[name, description, rules]
|
||||
);
|
||||
return rows[0];
|
||||
}
|
||||
|
||||
async function updateRule(id, { name, description, rules }) {
|
||||
const { rows } = await db.getQuery()(
|
||||
`UPDATE ${TABLE} SET name = $1, description = $2, rules = $3, updated_at = NOW() WHERE id = $4 RETURNING *`,
|
||||
[name, description, rules, id]
|
||||
);
|
||||
return rows[0];
|
||||
}
|
||||
|
||||
async function deleteRule(id) {
|
||||
await db.getQuery()(`DELETE FROM ${TABLE} WHERE id = $1`, [id]);
|
||||
}
|
||||
|
||||
module.exports = { getAllRules, getRuleById, createRule, updateRule, deleteRule };
|
||||
48
backend/services/aiAssistantSettingsService.js
Normal file
48
backend/services/aiAssistantSettingsService.js
Normal file
@@ -0,0 +1,48 @@
|
||||
const db = require('../db');
|
||||
const TABLE = 'ai_assistant_settings';
|
||||
|
||||
async function getSettings() {
|
||||
const { rows } = await db.getQuery()(`SELECT * FROM ${TABLE} ORDER BY id LIMIT 1`);
|
||||
const settings = rows[0] || null;
|
||||
if (!settings) return null;
|
||||
|
||||
// Получаем связанные данные из telegram_settings и email_settings
|
||||
let telegramBot = null;
|
||||
let supportEmail = null;
|
||||
if (settings.telegram_settings_id) {
|
||||
const tg = await db.getQuery()('SELECT * FROM telegram_settings WHERE id = $1', [settings.telegram_settings_id]);
|
||||
telegramBot = tg.rows[0] || null;
|
||||
}
|
||||
if (settings.email_settings_id) {
|
||||
const em = await db.getQuery()('SELECT * FROM email_settings WHERE id = $1', [settings.email_settings_id]);
|
||||
supportEmail = em.rows[0] || null;
|
||||
}
|
||||
return {
|
||||
...settings,
|
||||
telegramBot,
|
||||
supportEmail
|
||||
};
|
||||
}
|
||||
|
||||
async function upsertSettings({ system_prompt, selected_rag_tables, languages, model, rules, updated_by, telegram_settings_id, email_settings_id, system_message }) {
|
||||
const { rows } = await db.getQuery()(
|
||||
`INSERT INTO ${TABLE} (id, system_prompt, selected_rag_tables, languages, model, rules, updated_at, updated_by, telegram_settings_id, email_settings_id, system_message)
|
||||
VALUES (1, $1, $2, $3, $4, $5, NOW(), $6, $7, $8, $9)
|
||||
ON CONFLICT (id) DO UPDATE SET
|
||||
system_prompt = EXCLUDED.system_prompt,
|
||||
selected_rag_tables = EXCLUDED.selected_rag_tables,
|
||||
languages = EXCLUDED.languages,
|
||||
model = EXCLUDED.model,
|
||||
rules = EXCLUDED.rules,
|
||||
updated_at = NOW(),
|
||||
updated_by = EXCLUDED.updated_by,
|
||||
telegram_settings_id = EXCLUDED.telegram_settings_id,
|
||||
email_settings_id = EXCLUDED.email_settings_id,
|
||||
system_message = EXCLUDED.system_message
|
||||
RETURNING *`,
|
||||
[system_prompt, selected_rag_tables, languages, model, rules, updated_by, telegram_settings_id, email_settings_id, system_message]
|
||||
);
|
||||
return rows[0];
|
||||
}
|
||||
|
||||
module.exports = { getSettings, upsertSettings };
|
||||
Reference in New Issue
Block a user