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.

59 lines (58 loc) 2.98 kB
import axios from 'axios'; import logger from '../logger.js'; import { ApiError, ParsingError, AppError, ConfigurationError } from './errors.js'; import { selectModelForTask } from './configLoader.js'; export async function performResearchQuery(query, config) { const logicalTaskName = 'research_query'; logger.debug({ query, model: config.perplexityModel }, "Performing Perplexity research query"); if (!config.apiKey) { throw new ConfigurationError("OpenRouter API key (OPENROUTER_API_KEY) is not configured."); } const defaultModel = config.perplexityModel || "perplexity/sonar"; const modelToUse = selectModelForTask(config, logicalTaskName, defaultModel); try { const response = await axios.post(`${config.baseUrl}/chat/completions`, { model: modelToUse, messages: [ { role: "system", content: "You are a sophisticated AI research assistant using Perplexity Sonar Deep Research. Provide comprehensive, accurate, and up-to-date information. Research the user's query thoroughly." }, { role: "user", content: query } ], max_tokens: 8000, temperature: 0.1 }, { headers: { "Content-Type": "application/json", "Authorization": `Bearer ${config.apiKey}`, "HTTP-Referer": "https://vibe-coder-mcp.local" }, timeout: 90000 }); if (response.data?.choices?.[0]?.message?.content) { logger.debug({ query, modelUsed: modelToUse }, "Research query successful"); return response.data.choices[0].message.content.trim(); } else { logger.warn({ query, responseData: response.data, modelUsed: modelToUse }, "Received empty or unexpected response structure from research call"); throw new ParsingError("Invalid API response structure received from research call", { query, responseData: response.data, modelUsed: modelToUse }); } } catch (error) { logger.error({ err: error, query, modelUsed: modelToUse }, "Research API call failed"); if (axios.isAxiosError(error)) { const axiosError = error; const status = axiosError.response?.status; const responseData = axiosError.response?.data; const apiMessage = `Research API Error: Status ${status || 'N/A'}. ${axiosError.message}`; throw new ApiError(apiMessage, status, { query, modelUsed: modelToUse, responseData }, axiosError); } else if (error instanceof AppError) { throw error; } else if (error instanceof Error) { throw new AppError(`Research failed: ${error.message}`, { query, modelUsed: modelToUse }, error); } else { throw new AppError(`Unknown error during research.`, { query, modelUsed: modelToUse, thrownValue: String(error) }); } } }