UNPKG

node-gpt-cli

Version:

A NodeJS GPT-4 CLI client

105 lines (89 loc) 2.85 kB
import { readFileSync } from 'fs'; import { OpenAI } from 'openai'; import { fileURLToPath } from 'url'; import { dirname } from 'path'; // Configuration management function loadConfig() { const configPath = `${process.env.HOME}/.node-gpt-config.json`; try { return JSON.parse(readFileSync(configPath, 'utf8')); } catch (error) { throw new Error(`Error reading ${configPath}: ${error.message}`); } } function getApiKey(config) { const openaiKey = process.env.OPENAI_API_KEY; const deepinfraKey = process.env.DEEPINFRA_API_KEY; if (openaiKey || deepinfraKey) { return deepinfraKey || openaiKey; } return config.apiKey; } function validateConfig(config, apiKey) { if (!config.baseURL) { throw new Error('No API URL configured. Please run the installation script again.'); } const isOpenAI = config.baseURL.includes('openai.com'); const isDeepInfra = config.baseURL.includes('deepinfra.com'); if ((isOpenAI && !apiKey) || (isDeepInfra && !apiKey)) { const provider = isOpenAI ? 'OpenAI' : 'DeepInfra'; const envVar = isOpenAI ? 'OPENAI_API_KEY' : 'DEEPINFRA_API_KEY'; throw new Error( `${provider} API key not found. Set ${envVar} environment variable or update your config.` ); } } // OpenAI client setup function createOpenAIClient(config, apiKey) { return new OpenAI({ apiKey, baseURL: config.baseURL, organization: config.organization, }); } // Core functionality async function generateCompletion(client, config, prompt) { if (!prompt || typeof prompt !== 'string') { throw new Error('Prompt must be a non-empty string'); } try { const { model, max_tokens, temperature, top_p, frequency_penalty, presence_penalty, stream } = config; const response = await client.chat.completions.create({ messages: [{ role: 'user', content: prompt }], model, max_tokens, temperature, top_p, frequency_penalty, presence_penalty, stream, }); return response.choices[0].message.content.trim(); } catch (error) { throw new Error(`Failed to generate completion: ${error.message}`); } } // Main execution async function main() { try { const config = loadConfig(); const apiKey = getApiKey(config); validateConfig(config, apiKey); const client = createOpenAIClient(config, apiKey); const promptWords = process.argv.slice(2); if (promptWords.length === 0) { throw new Error('Please provide a prompt'); } const result = await generateCompletion(client, config, promptWords.join(' ')); process.stdout.write(result); } catch (error) { console.error(error.message); process.exit(1); } } // Run main if this is the main module const __filename = fileURLToPath(import.meta.url); if (process.argv[1] === __filename) { main(); }