pulse-ai-utils
Version:
Utility functions and helpers for AI-powered applications
172 lines • 7.53 kB
JavaScript
;
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