@notes-sync/service
Version:
Background service for AI-powered note synchronization
110 lines • 4.34 kB
JavaScript
;
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