@justinechang39/maki
Version:
AI-powered CLI agent for file operations, CSV manipulation, todo management, and web content fetching using OpenRouter
73 lines (72 loc) • 2.9 kB
JavaScript
import { API_URL, OPENROUTER_API_KEY, SELECTED_MODEL } from './config.js';
export async function callOpenRouterAPI(messages, tools) {
// Create an AbortController for timeout handling
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 60000); // 60 second timeout
try {
const response = await fetch(API_URL, {
method: 'POST',
headers: {
Authorization: `Bearer ${OPENROUTER_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: SELECTED_MODEL,
messages,
tools,
tool_choice: 'auto',
temperature: 0.1
}),
signal: controller.signal
});
clearTimeout(timeoutId);
if (!response.ok) {
let errorMessage;
try {
const errorData = await response.json();
errorMessage =
errorData.error?.message ||
errorData.message ||
`${response.status} ${response.statusText}`;
}
catch {
errorMessage = `${response.status} ${response.statusText}`;
}
// Handle specific error types
if (response.status === 429) {
throw new Error(`Rate limit exceeded. Please wait a moment before trying again.`);
}
else if (response.status === 401) {
throw new Error(`Invalid API key. Please check your OPENROUTER_API_KEY.`);
}
else if (response.status === 403) {
throw new Error(`Access forbidden. Your API key may not have permission for this model.`);
}
else if (response.status >= 500) {
throw new Error(`OpenRouter server error (${response.status}). Please try again later.`);
}
else {
throw new Error(`OpenRouter API error: ${errorMessage}`);
}
}
const data = await response.json();
// Validate response structure
if (!data ||
!data.choices ||
!Array.isArray(data.choices) ||
data.choices.length === 0) {
throw new Error('OpenRouter returned an empty or invalid response. Please try again.');
}
return data;
}
catch (error) {
clearTimeout(timeoutId);
if (error.name === 'AbortError') {
throw new Error('Request timed out. The AI model is taking too long to respond. Please try again.');
}
if (error.message.includes('fetch')) {
throw new Error('Network error. Please check your internet connection and try again.');
}
throw error; // Re-throw other errors as-is
}
}