95 lines
6.5 KiB
JavaScript
95 lines
6.5 KiB
JavaScript
import OpenAI from 'openai';
|
|
import { logger } from './index.js';
|
|
import { loadConfig } from './config.js';
|
|
/**
|
|
* Default base URLs for different routers
|
|
*/
|
|
const ROUTER_BASE_URLS = {
|
|
openrouter: 'https://openrouter.ai/api/v1',
|
|
openai: '', // OpenAI uses default URL
|
|
deepseek: 'https://api.deepseek.com',
|
|
huggingface: 'https://api-inference.huggingface.co',
|
|
ollama: 'http://localhost:11434', // Ollama's default local API endpoint
|
|
fireworks: 'https://api.fireworks.ai/v1', // Fireworks API endpoint
|
|
gemini: 'https://generativelanguage.googleapis.com/v1beta', // Gemini API base URL
|
|
xai: 'https://api.x.ai/v1', // XAI (Grok) API base URL
|
|
};
|
|
/**
|
|
* Default models for different routers
|
|
*/
|
|
const DEFAULT_MODELS = {
|
|
openrouter: 'anthropic/claude-3.5-sonnet',
|
|
openai: 'gpt-4o',
|
|
deepseek: 'deepseek-chat',
|
|
huggingface: 'meta-llama/2',
|
|
ollama: 'leonard', // Default Ollama model
|
|
fireworks: 'llama-v2-70b-chat', // Default Fireworks model
|
|
gemini: 'gemini-1.5-pro', // Default Gemini model
|
|
xai: 'grok-1' // Default XAI (Grok) model
|
|
};
|
|
/*
|
|
* Creates an OpenAI client instance based on the provided options.
|
|
* @param options - Configuration options for the client
|
|
* @returns OpenAI client instance or undefined if configuration is invalid
|
|
*/
|
|
export const createClient = (options) => {
|
|
// Load configuration from file
|
|
const config = loadConfig(options);
|
|
if (!config) {
|
|
logger.error("Config not found in $HOME/.osr/config.json. " +
|
|
"Optionally, export OSR_CONFIG with the path to the configuration file.");
|
|
return undefined;
|
|
}
|
|
// Determine router to use (defaults to 'openrouter')
|
|
const router = (options.router ?? 'openrouter');
|
|
// Initialize API key
|
|
let apiKey = options.api_key;
|
|
// Set API key based on router if not provided in options
|
|
if (!apiKey) {
|
|
switch (router) {
|
|
case 'openrouter':
|
|
apiKey = config?.openrouter?.key;
|
|
break;
|
|
case 'openai':
|
|
apiKey = config?.openai?.key;
|
|
break;
|
|
case 'deepseek':
|
|
apiKey = config?.deepseek?.key;
|
|
break;
|
|
case 'huggingface':
|
|
apiKey = config?.huggingface?.key;
|
|
break;
|
|
case 'ollama':
|
|
// Ollama doesn't require an API key when running locally
|
|
apiKey = 'ollama'; // Dummy key for Ollama
|
|
break;
|
|
case 'fireworks':
|
|
apiKey = config?.fireworks?.key;
|
|
break;
|
|
case 'gemini':
|
|
apiKey = config?.gemini?.key;
|
|
break;
|
|
case 'xai':
|
|
apiKey = config?.xai?.key;
|
|
break;
|
|
}
|
|
}
|
|
// Validate API key
|
|
if (!apiKey) {
|
|
logger.error(`No ${router} key found. Please provide an "api_key", set it in the config, or pass it via JSON config.`);
|
|
return undefined;
|
|
}
|
|
// Set default baseURL if not provided
|
|
const baseURL = options.baseURL ?? ROUTER_BASE_URLS[router];
|
|
// Set default model if not provided
|
|
if (!options.model) {
|
|
options.model = DEFAULT_MODELS[router];
|
|
}
|
|
logger.info(`Creating client with ${router} router, model ${options.model}, and API key ${apiKey} at ${baseURL}`);
|
|
// Create and return the OpenAI client instance
|
|
return new OpenAI({
|
|
apiKey,
|
|
baseURL,
|
|
});
|
|
};
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFRLE1BQU0sTUFBTyxRQUFRLENBQUE7QUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUNuQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBT3hDOztHQUVHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBK0I7SUFDakQsVUFBVSxFQUFFLDhCQUE4QjtJQUMxQyxNQUFNLEVBQUUsRUFBRSxFQUFFLDBCQUEwQjtJQUN0QyxRQUFRLEVBQUUsMEJBQTBCO0lBQ3BDLFdBQVcsRUFBRSxzQ0FBc0M7SUFDbkQsTUFBTSxFQUFFLHdCQUF3QixFQUFFLHNDQUFzQztJQUN4RSxTQUFTLEVBQUUsNkJBQTZCLEVBQUUseUJBQXlCO0lBQ25FLE1BQU0sRUFBRSxrREFBa0QsRUFBRSxzQkFBc0I7SUFDbEYsR0FBRyxFQUFFLHFCQUFxQixFQUFFLDBCQUEwQjtDQUN6RCxDQUFBO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLGNBQWMsR0FBK0I7SUFDL0MsVUFBVSxFQUFFLDZCQUE2QjtJQUN6QyxNQUFNLEVBQUUsUUFBUTtJQUNoQixRQUFRLEVBQUUsZUFBZTtJQUN6QixXQUFXLEVBQUUsY0FBYztJQUMzQixNQUFNLEVBQUUsU0FBUyxFQUFFLHVCQUF1QjtJQUMxQyxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsMEJBQTBCO0lBQzFELE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSx1QkFBdUI7SUFDakQsR0FBRyxFQUFFLFFBQVEsQ0FBQywyQkFBMkI7Q0FDNUMsQ0FBQTtBQUNEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxPQUFxQixFQUFFLEVBQUU7SUFDbEQsK0JBQStCO0lBQy9CLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDVixNQUFNLENBQUMsS0FBSyxDQUNSLDhDQUE4QztZQUM5Qyx3RUFBd0UsQ0FDM0UsQ0FBQztRQUNGLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxxREFBcUQ7SUFDckQsTUFBTSxNQUFNLEdBQWUsQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLFlBQVksQ0FBZSxDQUFDO0lBRTFFLHFCQUFxQjtJQUNyQixJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBRTdCLHlEQUF5RDtJQUN6RCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDVixRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2IsS0FBSyxZQUFZO2dCQUNiLE1BQU0sR0FBRyxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQztnQkFDakMsTUFBTTtZQUNWLEtBQUssUUFBUTtnQkFDVCxNQUFNLEdBQUcsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUM7Z0JBQzdCLE1BQU07WUFDVixLQUFLLFVBQVU7Z0JBQ1gsTUFBTSxHQUFHLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDO2dCQUMvQixNQUFNO1lBQ1YsS0FBSyxhQUFhO2dCQUNkLE1BQU0sR0FBRyxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQztnQkFDbEMsTUFBTTtZQUNWLEtBQUssUUFBUTtnQkFDVCx5REFBeUQ7Z0JBQ3pELE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyx1QkFBdUI7Z0JBQzFDLE1BQU07WUFDVixLQUFLLFdBQVc7Z0JBQ1osTUFBTSxHQUFHLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDO2dCQUNoQyxNQUFNO1lBQ1YsS0FBSyxRQUFRO2dCQUNULE1BQU0sR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQztnQkFDN0IsTUFBTTtZQUNWLEtBQUssS0FBSztnQkFDTixNQUFNLEdBQUcsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7Z0JBQzFCLE1BQU07UUFDZCxDQUFDO0lBQ0wsQ0FBQztJQUVELG1CQUFtQjtJQUNuQixJQUFJLENBQUMsTUFBTSxFQUFHLENBQUM7UUFDWCxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sTUFBTSw0RkFBNEYsQ0FBQyxDQUFDO1FBQ3ZILE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxzQ0FBc0M7SUFDdEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUUzRCxvQ0FBb0M7SUFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQixPQUFPLENBQUMsS0FBSyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUMxQyxDQUFDO0lBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsTUFBTSxrQkFBa0IsT0FBTyxDQUFDLEtBQUssaUJBQWlCLE1BQU0sT0FBTyxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBRWpILCtDQUErQztJQUMvQyxPQUFPLElBQUksTUFBTSxDQUFDO1FBQ2QsTUFBTTtRQUNOLE9BQU87S0FDVixDQUFDLENBQUE7QUFDTixDQUFDLENBQUEifQ==
|