UNPKG

vibe-coder-mcp

Version:

Production-ready MCP server with complete agent integration, multi-transport support, and comprehensive development automation tools for AI-assisted workflows.

82 lines (81 loc) 3.69 kB
import fs from 'fs-extra'; import path from 'path'; import logger from '../logger.js'; export function loadLlmConfigMapping(fileName = 'llm_config.json') { let filePath = null; const defaultMapping = {}; if (process.env.LLM_CONFIG_PATH) { const envPath = process.env.LLM_CONFIG_PATH; if (fs.existsSync(envPath)) { logger.info(`Found LLM config path in environment variable: ${envPath}`); filePath = envPath; } else { logger.warn(`LLM_CONFIG_PATH environment variable set to ${envPath}, but file not found.`); } } if (!filePath) { const cwdPath = path.join(process.cwd(), fileName); if (fs.existsSync(cwdPath)) { logger.info(`Found LLM config in current working directory: ${cwdPath}`); filePath = cwdPath; } } if (filePath) { try { const fileContent = fs.readFileSync(filePath, 'utf-8'); const parsedConfig = JSON.parse(fileContent); if (parsedConfig && typeof parsedConfig.llm_mapping === 'object' && parsedConfig.llm_mapping !== null) { logger.info(`LLM config loaded successfully from ${filePath}`); for (const key in parsedConfig.llm_mapping) { if (typeof parsedConfig.llm_mapping[key] !== 'string') { logger.warn(`Invalid non-string value found for key "${key}" in ${filePath}. Skipping this key.`); delete parsedConfig.llm_mapping[key]; } } return parsedConfig.llm_mapping; } else { logger.error(`Invalid structure in ${filePath}. Expected 'llm_mapping' object. Using default empty mapping.`); return defaultMapping; } } catch (error) { logger.error({ err: error, filePath }, `Failed to load or parse LLM config from ${filePath}. Using default empty mapping.`); return defaultMapping; } } else { logger.error(`LLM config file "${fileName}" not found via environment variable or in CWD (${process.cwd()}). Using default empty LLM mapping.`); return defaultMapping; } } export function selectModelForTask(config, logicalTaskName, defaultModel) { logger.debug({ receivedConfig: config, receivedMapping: config?.llm_mapping, taskName: logicalTaskName }, 'selectModelForTask received config'); const mapping = config?.llm_mapping; if (!mapping || typeof mapping !== 'object') { logger.warn({ logicalTaskName, configProvided: !!config }, `LLM mapping object is missing or invalid in provided config. Falling back to default model: ${defaultModel}`); return defaultModel; } const mappingKeys = Object.keys(mapping); if (mappingKeys.length === 0) { logger.warn({ logicalTaskName }, `LLM mapping object is empty. Falling back to default model: ${defaultModel}`); return defaultModel; } const modelFromMapping = mapping[logicalTaskName]; const defaultFromMapping = mapping['default_generation']; logger.debug({ logicalTaskName, mappingKeys: mappingKeys, modelFromMapping: modelFromMapping, defaultFromMapping: defaultFromMapping, defaultModelProvided: defaultModel }, `Looking up model for task: ${logicalTaskName}`); const modelToUse = modelFromMapping || defaultFromMapping || defaultModel; logger.info({ logicalTaskName, modelFromMapping, defaultFromMapping, defaultModel, modelToUse }, 'Model selection decision for task'); return modelToUse; }