node-gpt-cli
Version:
A NodeJS GPT-4 CLI client
105 lines (89 loc) • 2.85 kB
JavaScript
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();
}