UNPKG

pulse-ai-utils

Version:

Utility functions and helpers for AI-powered applications

172 lines 7.53 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const openai_1 = __importDefault(require("openai")); const llm_base_1 = require("./llm-base"); const env_loader_1 = require("../config/env-loader"); const firebase_config_1 = require("../config/firebase-config"); /** * OpenRouter Helper - Can use any model via OpenRouter API * Supports: Gemini, Claude, GPT, Llama, and many others * OpenRouter provides access to multiple model providers through a unified API */ class OpenRouter extends llm_base_1.LLMBase { constructor(apiKey, openaiInstance, baseURL, model, providerKey // For BYOK (Bring Your Own Key) with specific providers ) { const config = { model: model || (0, env_loader_1.getEnvVar)('OPENROUTER_MODEL') || 'google/gemini-2.0-flash-exp', apiKey: apiKey || (0, env_loader_1.getEnvVar)('OPENROUTER_API_KEY'), baseURL: baseURL || (0, env_loader_1.getEnvVar)('OPENROUTER_BASE_URL') || 'https://openrouter.ai/api/v1', headers: {} }; // Add provider-specific headers for BYOK if (providerKey) { if (model?.includes('gemini')) { config.headers['X-Google-API-Key'] = providerKey; } else if (model?.includes('claude')) { config.headers['X-Anthropic-API-Key'] = providerKey; } } else { // Auto-add provider keys from environment if available if (model?.includes('gemini')) { const geminiKey = (0, env_loader_1.getEnvVar)('GEMINI_API_KEY'); if (geminiKey) { config.headers['X-Google-API-Key'] = geminiKey; } } else if (model?.includes('claude')) { const claudeKey = (0, env_loader_1.getEnvVar)('CLAUDE_API_KEY'); if (claudeKey) { config.headers['X-Anthropic-API-Key'] = claudeKey; } } } super(config, openaiInstance); } createOpenAIInstance(config) { if (!config.apiKey) { config.apiKey = this.getApiKey(); } return new openai_1.default({ apiKey: config.apiKey, baseURL: config.baseURL, defaultHeaders: { 'HTTP-Referer': 'https://pulse-ai.dev', // Optional: Your site URL 'X-Title': 'Pulse AI', // Optional: Your app name ...config.headers } }); } getApiKey() { if (this.isTestMode()) { return super.getApiKey(); } const apiKey = (0, env_loader_1.getEnvVar)('OPENROUTER_API_KEY'); if (!apiKey) { throw new Error('OpenRouter API key is required. Set OPENROUTER_API_KEY environment variable in your project root .env file.'); } return apiKey; } getProviderName() { return 'openrouter'; } // OpenRouter-specific methods async getAvailableModels() { if (this.isTestMode()) { return [ { id: 'google/gemini-2.0-flash-exp', name: 'Gemini 2.0 Flash', provider: 'Google' }, { id: 'anthropic/claude-3.5-sonnet', name: 'Claude 3.5 Sonnet', provider: 'Anthropic' }, { id: 'openai/gpt-4o', name: 'GPT-4o', provider: 'OpenAI' } ]; } try { // OpenRouter models endpoint const response = await fetch('https://openrouter.ai/api/v1/models', { headers: { 'Authorization': `Bearer ${this.openai.apiKey}` } }); const data = await response.json(); return data.data?.map((model) => ({ id: model.id, name: model.name, provider: model.id.split('/')[0] })) || []; } catch (error) { console.warn('Could not fetch OpenRouter models:', error); return []; } } /** * Create OpenRouter with model from remote config * Falls back to env vars and defaults if remote config fails */ static async createWithRemoteConfig(openRouterKey, providerKey, baseURL) { try { const remoteModel = await (0, firebase_config_1.getOpenRouterModel)(); return new OpenRouter(openRouterKey, undefined, baseURL, remoteModel, providerKey); } catch (error) { console.warn('Failed to fetch OpenRouter model from remote config, using defaults:', error); return new OpenRouter(openRouterKey, undefined, baseURL, undefined, providerKey); } } /** * Create OpenRouter specifically optimized for web fetching scenarios * Uses pulse-ai-web-openrouter-model remote config */ static async createForWebFetching(openRouterKey, providerKey, baseURL) { try { const webModel = await (0, firebase_config_1.getWebOpenRouterModel)(); return new OpenRouter(openRouterKey, undefined, baseURL, webModel, providerKey); } catch (error) { console.warn('Failed to fetch web OpenRouter model from remote config, using defaults:', error); return await OpenRouter.createWithRemoteConfig(openRouterKey, providerKey, baseURL); } } /** * Update the model from remote config * Useful for long-running instances that need to pick up config changes */ async updateModelFromRemoteConfig(useWebModel = false) { try { const remoteModel = useWebModel ? await (0, firebase_config_1.getWebOpenRouterModel)() : await (0, firebase_config_1.getOpenRouterModel)(); this.defaultModel = remoteModel; } catch (error) { console.warn('Failed to update model from remote config:', error); } } // Create specialized instances for different providers // If no keys provided, will auto-load from root .env file static forGemini(openRouterKey, geminiKey, model = 'google/gemini-2.0-flash-exp') { return new OpenRouter(openRouterKey || (0, env_loader_1.getEnvVar)('OPENROUTER_API_KEY'), undefined, undefined, model, geminiKey || (0, env_loader_1.getEnvVar)('GEMINI_API_KEY')); } /** * Create Gemini helper with model from remote config */ static async forGeminiWithRemoteConfig(openRouterKey, geminiKey) { try { const remoteModel = await (0, firebase_config_1.getGeminiModel)(); return OpenRouter.forGemini(openRouterKey, geminiKey, remoteModel); } catch (error) { console.warn('Failed to fetch Gemini model from remote config, using defaults:', error); return OpenRouter.forGemini(openRouterKey, geminiKey); } } static forClaude(openRouterKey, claudeKey, model = 'anthropic/claude-3.5-sonnet') { return new OpenRouter(openRouterKey || (0, env_loader_1.getEnvVar)('OPENROUTER_API_KEY'), undefined, undefined, model, claudeKey || (0, env_loader_1.getEnvVar)('CLAUDE_API_KEY')); } static forGPT(openRouterKey, model = 'openai/gpt-4o') { return new OpenRouter(openRouterKey || (0, env_loader_1.getEnvVar)('OPENROUTER_API_KEY'), undefined, undefined, model); } } exports.default = OpenRouter; //# sourceMappingURL=openrouter.js.map