import { intro, outro } from '@clack/prompts'; import { AxiosError } from 'axios'; import chalk from 'chalk'; import { ChatCompletionRequestMessage, Configuration as OpenAiApiConfiguration, OpenAIApi } from 'openai'; import { CONFIG_MODES, getConfig } from './commands/config'; const config = getConfig(); let apiKey = config?.OPENAI_API_KEY; const [command, mode] = process.argv.slice(2); if (!apiKey && command !== 'config' && mode !== CONFIG_MODES.set) { intro('opencommit'); outro( 'OPENAI_API_KEY is not set, please run `oc config set OPENAI_API_KEY=. Make sure you add payment details, so API works.`' ); outro( 'For help look into README https://github.com/di-sukharev/opencommit#setup' ); process.exit(1); } class OpenAi { private openAiApiConfiguration = new OpenAiApiConfiguration({ apiKey: apiKey }); private openAI = new OpenAIApi(this.openAiApiConfiguration); public generateCommitMessage = async ( messages: Array ): Promise => { try { const { data } = await this.openAI.createChatCompletion({ model: 'gpt-3.5-turbo', messages, temperature: 0, top_p: 0.1, max_tokens: 196 }); const message = data.choices[0].message; return message?.content; } catch (error: any) { outro(`${chalk.red('✖')} ${error}`); if (error.isAxiosError && error.response?.status === 401) { const err = error as AxiosError; const openAiError = ( err.response?.data as { error?: { message: string } } ).error; if (openAiError?.message) outro(openAiError.message); outro( 'For help look into README https://github.com/di-sukharev/opencommit#setup' ); } process.exit(1); } }; } export const api = new OpenAi();