()
| 9862 | console.error('Error generating tags:', error); |
| 9863 | // Re-throw rate limit errors so user is notified |
| 9864 | if (error.message && error.message.includes('Rate limit')) { |
| 9865 | throw error; |
| 9866 | } |
| 9867 | return []; // Return empty tags array instead of throwing |
| 9868 | } |
| 9869 | } catch (error) { |
| 9870 | console.error('Error generating tags:', error); |
| 9871 | throw error; |
| 9872 | } |
| 9873 | }); |
| 9874 | |
| 9875 | // Add this helper function (if it doesn't already exist) near the top of main.js |
| 9876 | function getSettings() { |
| 9877 | const apiKeyRow = db.prepare('SELECT value FROM settings WHERE key = ?').get('apiKey'); |
| 9878 | const apiEndpointRow = db.prepare('SELECT value FROM settings WHERE key = ?').get('apiEndpoint'); |
| 9879 | const aiModelRow = db.prepare('SELECT value FROM settings WHERE key = ?').get('aiModel'); |
| 9880 | const aiServiceRow = db.prepare('SELECT value FROM settings WHERE key = ?').get('aiService'); |
| 9881 | const aiTagMaxTagsRow = db.prepare('SELECT value FROM settings WHERE key = ?').get('aiTagMaxTags'); |
| 9882 | const aiTagUseCategoriesRow = db.prepare('SELECT value FROM settings WHERE key = ?').get('aiTagUseCategories'); |
| 9883 | const aiTagMergeStrategyRow = db.prepare('SELECT value FROM settings WHERE key = ?').get('aiTagMergeStrategy'); |
| 9884 | const aiTagAllowRetaggingRow = db.prepare('SELECT value FROM settings WHERE key = ?').get('aiTagAllowRetagging'); |
| 9885 | const aiTagConcurrencyRow = db.prepare('SELECT value FROM settings WHERE key = ?').get('aiTagConcurrency'); |
| 9886 | const aiTagDetailLevelRow = db.prepare('SELECT value FROM settings WHERE key = ?').get('aiTagDetailLevel'); |
| 9887 | const aiTagPromptRow = db.prepare('SELECT value FROM settings WHERE key = ?').get('aiTagPrompt'); |
| 9888 | |
| 9889 | return { |
| 9890 | apiKey: apiKeyRow ? apiKeyRow.value : null, |
| 9891 | apiEndpoint: apiEndpointRow ? apiEndpointRow.value : 'https://js.puter.com/v2/', |
| 9892 | aiModel: aiModelRow ? aiModelRow.value : 'gpt-5-nano', |
| 9893 | aiService: aiServiceRow ? aiServiceRow.value : 'puter', |
| 9894 | aiTagMaxTags: aiTagMaxTagsRow ? parseInt(aiTagMaxTagsRow.value) || 10 : 10, |
| 9895 | aiTagUseCategories: aiTagUseCategoriesRow ? aiTagUseCategoriesRow.value === '1' : false, |
| 9896 | aiTagUseJsonResponse: true, // Always use JSON response format |
| 9897 | aiTagMergeStrategy: aiTagMergeStrategyRow ? aiTagMergeStrategyRow.value : 'merge', |
| 9898 | aiTagAllowRetagging: aiTagAllowRetaggingRow ? aiTagAllowRetaggingRow.value === '1' : false, |
| 9899 | aiTagConcurrency: aiTagConcurrencyRow ? parseInt(aiTagConcurrencyRow.value) || 3 : 3, |
| 9900 | aiTagDetailLevel: aiTagDetailLevelRow ? aiTagDetailLevelRow.value : 'medium', |
no outgoing calls
no test coverage detected