UNPKG

ai-content-wizard

Version:

A powerful AI-powered content generation tool using Groq's API

170 lines (149 loc) 5.62 kB
const https = require('https'); class AIProvider { constructor() { if (!process.env.GROQ_API_KEY || process.env.GROQ_API_KEY === 'your_groq_api_key_here') { throw new Error('GROQ_API_KEY is not properly configured in .env file.'); } this.apiKey = process.env.GROQ_API_KEY; this.validModels = ['llama3-8b-8192', 'llama3-70b-8192']; this.config = { model: 'llama3-8b-8192', temperature: Math.min(Math.max(parseFloat(process.env.TEMPERATURE) || 0.7, 0), 1), max_tokens: Math.min(parseInt(process.env.MAX_TOKENS) || 2048, 8192), }; // Debug logging if (process.env.DEBUG_GROQ) { console.log('[DEBUG] AI Provider initialized with config:', { model: this.config.model, temperature: this.config.temperature, max_tokens: this.config.max_tokens, validModels: this.validModels, hasApiKey: !!this.apiKey }); } } async generateText(prompt, options = {}) { const config = { ...this.config, ...options }; // Validate model if (!this.validModels.includes(config.model)) { throw new Error(`Invalid model: ${config.model}. Valid models are: ${this.validModels.join(', ')}`); } // Prepare the request data const postData = JSON.stringify({ model: config.model, messages: [ { role: 'user', content: prompt } ], temperature: Math.max(0, Math.min(1, config.temperature)), // Ensure between 0 and 1 max_tokens: Math.max(1, Math.min(8192, config.max_tokens)) // Ensure reasonable limits }); if (process.env.DEBUG_GROQ) { console.log('[DEBUG] Sending request to Groq API with model:', config.model); console.log('[DEBUG] Request payload:', postData); } const requestOptions = { hostname: 'api.groq.com', path: '/openai/v1/chat/completions', method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${this.apiKey}`, 'Content-Length': Buffer.byteLength(postData) } }; // Debug logging can be enabled by setting DEBUG_GROQ environment variable if (process.env.DEBUG_GROQ) { console.log('[DEBUG] Sending request to Groq API...'); console.log(`[DEBUG] Request URL: https://${requestOptions.hostname}${requestOptions.path}`); } return new Promise((resolve, reject) => { const req = https.request(requestOptions, (res) => { let data = ''; if (process.env.DEBUG_GROQ) { console.log(`[DEBUG] Response status: ${res.statusCode}`); } res.on('data', (chunk) => { data += chunk; }); res.on('end', () => { try { const response = JSON.parse(data); if (response.error) { const errorMsg = response.error.message || 'Error from Groq API'; if (process.env.DEBUG_GROQ) { console.error('[DEBUG] API Error:', response.error); } reject(new Error(errorMsg)); return; } if (response.choices?.[0]?.message?.content) { if (process.env.DEBUG_GROQ) { console.log('[DEBUG] Successfully processed Groq API response'); } resolve(response.choices[0].message.content); } else { const errorMsg = 'Unexpected response format from Groq API'; if (process.env.DEBUG_GROQ) { console.error('[DEBUG] Unexpected response format:', JSON.stringify(response, null, 2)); } reject(new Error(errorMsg)); } } catch (e) { console.error('Error parsing Groq API response:', e); console.log('Raw response that caused error:', data); reject(e); } }); }); req.on('error', (error) => { if (process.env.DEBUG_GROQ) { console.error('[DEBUG] Request error:', { message: error.message, code: error.code, stack: process.env.DEBUG_GROQ_VERBOSE ? error.stack : undefined }); } reject(error); }); // Handle timeout const timeoutMs = parseInt(process.env.GROQ_TIMEOUT_MS, 10) || 30000; req.setTimeout(timeoutMs, () => { const timeoutError = new Error(`Request timeout after ${timeoutMs}ms`); timeoutError.code = 'ETIMEDOUT'; if (process.env.DEBUG_GROQ) { console.error('[DEBUG] Request timed out'); } req.destroy(timeoutError); }); // Log request headers and body in debug mode if (process.env.DEBUG_GROQ) { console.log('[DEBUG] Request Headers:', requestOptions.headers); console.log('[DEBUG] Request Body:', postData); } // Handle response req.on('response', (res) => { if (process.env.DEBUG_GROQ) { console.log(`[DEBUG] Response Status: ${res.statusCode} ${res.statusMessage}`); console.log('[DEBUG] Response Headers:', res.headers); } }); req.on('error', (error) => { if (process.env.DEBUG_GROQ) { console.error('[DEBUG] Request Error:', { message: error.message, code: error.code, stack: process.env.DEBUG_GROQ_VERBOSE ? error.stack : undefined }); } reject(error); }); // Send the request req.write(postData); req.end(); }); } } module.exports = new AIProvider();