Files
DLE/backend/utils/ollamaRequestBuilder.js
2025-11-06 16:24:50 +03:00

83 lines
3.1 KiB
JavaScript

/**
* Copyright (c) 2024-2025 Тарабанов Александр Викторович
* All rights reserved.
*
* This software is proprietary and confidential.
* Unauthorized copying, modification, or distribution is prohibited.
*
* For licensing inquiries: info@hb3-accelerator.com
* Website: https://hb3-accelerator.com
* GitHub: https://github.com/VC-HB3-Accelerator
*/
/**
* Ollama Request Builder
* Утилита для формирования тела запроса к Ollama API
* Устраняет дублирование кода между ragService.js и ai-queue.js
*/
/**
* Построить тело запроса для Ollama API
* @param {Object} options - Опции запроса
* @param {Array} options.messages - Массив сообщений для LLM
* @param {string} options.model - Название модели (опционально, будет использован дефолтный)
* @param {Object} options.llmParameters - Параметры LLM (temperature, maxTokens, top_p, top_k, repeat_penalty)
* @param {Object} options.qwenParameters - Специфичные параметры qwen (format)
* @param {string} options.defaultModel - Дефолтная модель (если model не указан)
* @param {Array} options.tools - Массив определений функций для function calling (опционально)
* @param {string} options.tool_choice - Выбор функции ("auto", "none", или конкретная функция) (опционально)
* @param {boolean} options.stream - Потоковая передача (по умолчанию false)
* @returns {Object} Тело запроса для Ollama API
*/
function buildOllamaRequest(options = {}) {
const {
messages,
model,
llmParameters,
qwenParameters,
defaultModel,
tools = null,
tool_choice = null,
stream = false
} = options;
if (!messages || !Array.isArray(messages)) {
throw new Error('messages обязателен и должен быть массивом');
}
if (!llmParameters) {
throw new Error('llmParameters обязателен');
}
// Формируем базовое тело запроса
const requestBody = {
model: model || defaultModel,
messages: messages,
stream: stream,
// Общие параметры LLM
temperature: llmParameters.temperature,
num_predict: llmParameters.maxTokens, // Ollama использует num_predict вместо maxTokens
top_p: llmParameters.top_p,
top_k: llmParameters.top_k,
repeat_penalty: llmParameters.repeat_penalty
};
// Добавляем специфичные параметры qwen (если они заданы)
if (qwenParameters && qwenParameters.format !== null && qwenParameters.format !== undefined) {
requestBody.format = qwenParameters.format;
}
// Добавляем tools для function calling (если переданы)
if (tools && Array.isArray(tools) && tools.length > 0) {
requestBody.tools = tools;
requestBody.tool_choice = tool_choice || "auto";
}
return requestBody;
}
module.exports = {
buildOllamaRequest
};