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
JavaScript
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) });
}
}
}