feat: новая функция

This commit is contained in:
2025-11-06 16:24:50 +03:00
parent b3620b264b
commit 714a3f55c7
34 changed files with 5436 additions and 2433 deletions

View File

@@ -15,6 +15,8 @@ const logger = require('../utils/logger');
const axios = require('axios');
const ollamaConfig = require('./ollamaConfig');
const aiCache = require('./ai-cache');
const aiConfigService = require('./aiConfigService');
const { buildOllamaRequest } = require('../utils/ollamaRequestBuilder');
class AIQueue extends EventEmitter {
constructor() {
@@ -237,25 +239,56 @@ class AIQueue extends EventEmitter {
return;
}
// 2. Вызываем Ollama API
// 2. Загружаем параметры LLM и qwen из настроек
const llmParameters = task.request.llmParameters || await aiConfigService.getLLMParameters();
const qwenParameters = task.request.qwenParameters || await aiConfigService.getQwenSpecificParameters();
const ollamaConfig_data = await ollamaConfig.getConfigAsync();
// 3. Формируем тело запроса (используем утилиту)
const requestBody = buildOllamaRequest({
messages: task.request.messages,
model: task.request.model,
llmParameters: llmParameters,
qwenParameters: qwenParameters,
defaultModel: ollamaConfig_data.defaultModel,
tools: task.request.tools || null,
tool_choice: task.request.tool_choice || null,
stream: false
});
// 4. Вызываем Ollama API
const ollamaUrl = ollamaConfig.getBaseUrl();
const timeouts = ollamaConfig.getTimeouts();
const response = await axios.post(`${ollamaUrl}/api/chat`, {
model: task.request.model || ollamaConfig.getDefaultModel(),
messages: task.request.messages,
stream: false
}, {
logger.info(`[AIQueue] Отправка запроса в Ollama с параметрами:`, {
model: requestBody.model,
temperature: requestBody.temperature,
num_predict: requestBody.num_predict,
format: requestBody.format || 'не задан',
hasTools: !!requestBody.tools
});
const response = await axios.post(`${ollamaUrl}/api/chat`, requestBody, {
timeout: timeouts.ollamaChat
});
const result = response.data.message.content;
// Обработка function calls (если есть)
// ВАЖНО: Function calling в очереди не поддерживается, т.к. нужен userId
// Если ИИ запросил функции - возвращаем ответ без их выполнения
let result;
if (response.data.message.tool_calls && response.data.message.tool_calls.length > 0) {
logger.warn(`[AIQueue] ИИ запросил выполнение ${response.data.message.tool_calls.length} функций, но function calling в очереди не поддерживается`);
result = response.data.message.content || 'Функции не выполнены (не поддерживается в очереди)';
} else {
result = response.data.message.content;
}
const responseTime = Date.now() - startTime;
// 3. Сохраняем в кэш
// 4. Сохраняем в кэш
aiCache.set(cacheKey, result);
// 4. Обновляем статус
// 5. Обновляем статус
this.updateRequestStatus(task.id, 'completed', result, null, responseTime);
this.emit(`task_${task.id}_completed`, { response: result, fromCache: false });
@@ -273,4 +306,5 @@ class AIQueue extends EventEmitter {
}
}
module.exports = AIQueue;
module.exports = AIQueue;