/**
 * Copyright (c) 2024-2026 Тарабанов Александр Викторович
 * 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
};

