mono/packages/kbot/dist-in/client.js
2025-03-24 20:59:20 +01:00

80 lines
5.6 KiB
JavaScript

import OpenAI from 'openai';
import { logger } from './index.js';
import { loadConfig } from './config.js';
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
};
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) => {
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;
}
const router = (options.router ?? 'openrouter');
let apiKey = options.api_key;
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;
}
}
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;
}
const baseURL = options.baseURL ?? ROUTER_BASE_URLS[router];
if (!options.model) {
options.model = DEFAULT_MODELS[router];
}
return new OpenAI({
apiKey,
baseURL,
});
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFRLE1BQU0sTUFBTyxRQUFRLENBQUE7QUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUNuQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBS3hDLE1BQU0sZ0JBQWdCLEdBQStCO0lBQ2pELFVBQVUsRUFBRSw4QkFBOEI7SUFDMUMsTUFBTSxFQUFFLEVBQUUsRUFBRSwwQkFBMEI7SUFDdEMsUUFBUSxFQUFFLDBCQUEwQjtJQUNwQyxXQUFXLEVBQUUsc0NBQXNDO0lBQ25ELE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxzQ0FBc0M7SUFDeEUsU0FBUyxFQUFFLDZCQUE2QixFQUFFLHlCQUF5QjtJQUNuRSxNQUFNLEVBQUUsa0RBQWtELEVBQUUsc0JBQXNCO0lBQ2xGLEdBQUcsRUFBRSxxQkFBcUIsRUFBRSwwQkFBMEI7Q0FDekQsQ0FBQTtBQUVELE1BQU0sY0FBYyxHQUErQjtJQUMvQyxVQUFVLEVBQUUsNkJBQTZCO0lBQ3pDLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLFFBQVEsRUFBRSxlQUFlO0lBQ3pCLFdBQVcsRUFBRSxjQUFjO0lBQzNCLE1BQU0sRUFBRSxTQUFTLEVBQUUsdUJBQXVCO0lBQzFDLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSwwQkFBMEI7SUFDMUQsTUFBTSxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QjtJQUNqRCxHQUFHLEVBQUUsUUFBUSxDQUFDLDJCQUEyQjtDQUM1QyxDQUFBO0FBQ0Q7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLE9BQXFCLEVBQUUsRUFBRTtJQUNsRCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1YsTUFBTSxDQUFDLEtBQUssQ0FDUiw4Q0FBOEM7WUFDOUMsd0VBQXdFLENBQzNFLENBQUM7UUFDRixPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQWUsQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLFlBQVksQ0FBZSxDQUFDO0lBRTFFLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFFN0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1YsUUFBUSxNQUFNLEVBQUUsQ0FBQztZQUNiLEtBQUssWUFBWTtnQkFDYixNQUFNLEdBQUcsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUM7Z0JBQ2pDLE1BQU07WUFDVixLQUFLLFFBQVE7Z0JBQ1QsTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDO2dCQUM3QixNQUFNO1lBQ1YsS0FBSyxVQUFVO2dCQUNYLE1BQU0sR0FBRyxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQztnQkFDL0IsTUFBTTtZQUNWLEtBQUssYUFBYTtnQkFDZCxNQUFNLEdBQUcsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUM7Z0JBQ2xDLE1BQU07WUFDVixLQUFLLFFBQVE7Z0JBQ1QseURBQXlEO2dCQUN6RCxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUMsdUJBQXVCO2dCQUMxQyxNQUFNO1lBQ1YsS0FBSyxXQUFXO2dCQUNaLE1BQU0sR0FBRyxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQztnQkFDaEMsTUFBTTtZQUNWLEtBQUssUUFBUTtnQkFDVCxNQUFNLEdBQUcsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUM7Z0JBQzdCLE1BQU07WUFDVixLQUFLLEtBQUs7Z0JBQ04sTUFBTSxHQUFHLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO2dCQUMxQixNQUFNO1FBQ2QsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLENBQUMsTUFBTSxFQUFHLENBQUM7UUFDWCxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sTUFBTSw0RkFBNEYsQ0FBQyxDQUFDO1FBQ3ZILE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRTNELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakIsT0FBTyxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDMUMsQ0FBQztJQUNELE9BQU8sSUFBSSxNQUFNLENBQUM7UUFDZCxNQUFNO1FBQ04sT0FBTztLQUNWLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQSJ9