UNPKG

@notes-sync/service

Version:

Background service for AI-powered note synchronization

110 lines 4.34 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AIService = void 0; const shared_1 = require("@notes-sync/shared"); const gemini_provider_1 = require("./providers/gemini-provider"); const logger_1 = require("../logger"); const fallback_quotes_1 = require("./fallback-quotes"); class AIService { constructor(config) { this.config = config; this.lastQuoteTime = 0; this.quoteCooldownMs = 60000; // 1 minute cooldown between quotes if (config.enabled && config.apiKey) { this.initializeProvider(); } else if (config.enabled) { logger_1.Logger.log('AI enabled but no API key provided - quotes will be disabled'); } } initializeProvider() { try { switch (this.config.provider) { case 'gemini': this.provider = new gemini_provider_1.GeminiProvider(this.config.apiKey, this.config.model, this.config.features.dailyQuotes); logger_1.Logger.log(`AI Service initialized with ${this.config.provider} provider`); break; default: throw new Error(`Unsupported AI provider: ${this.config.provider}`); } } catch (error) { logger_1.Logger.error(`Failed to initialize AI provider: ${error.message}`); this.provider = undefined; } } isEnabled() { return this.config.enabled && !!this.provider; } isDailyQuotesEnabled() { return this.isEnabled() && this.config.features.dailyQuotes != undefined; } async generateDailyQuote(context) { if (!this.isDailyQuotesEnabled()) { return null; } // Rate limiting: don't generate quotes too frequently const now = Date.now(); if (now - this.lastQuoteTime < this.quoteCooldownMs) { logger_1.Logger.log('Skipping quote generation due to cooldown'); return null; } try { const request = { theme: 'productivity', context: context ? context.substring(0, 500) : undefined, // Limit context length }; const quote = await this.provider.generateQuote(request); this.lastQuoteTime = now; return quote; } catch (error) { if (error instanceof shared_1.AIError) { logger_1.Logger.error(`AI quote generation failed: ${error.message} (${error.provider})`); } else { logger_1.Logger.error(`Unexpected error generating quote: ${error.message}`); } // Return null instead of throwing - we don't want AI failures to break daily creation return null; } } // Fallback quotes for when AI is unavailable getFallbackQuote() { const randomIndex = Math.floor(Math.random() * fallback_quotes_1.FALLBACK_QUOTES.length); return fallback_quotes_1.FALLBACK_QUOTES[randomIndex]; } async generateQuoteWithFallback(context) { const aiQuote = await this.generateDailyQuote(context); if (aiQuote) { return aiQuote; } // Use fallback quote if AI is unavailable logger_1.Logger.log('Using fallback quote - AI unavailable'); return this.getFallbackQuote(); } async processQuery(prompt) { if (!this.isEnabled()) { throw new Error('AI query processing requires AI to be enabled'); } try { const request = { query: prompt, context: '', // Context is already in the prompt maxLength: 500, // Longer responses for analysis }; const response = await this.provider.processQuery(request); this.lastQuoteTime = Date.now(); // Update rate limiting return response.response; } catch (error) { logger_1.Logger.error(`AI query processing failed: ${error.message}`); if (error instanceof shared_1.AIError) { throw error; } throw new shared_1.AIError(error.message, this.config.provider); } } } exports.AIService = AIService; //# sourceMappingURL=ai-service.js.map