From b975ae7dc92db0573b3d703dd9a3928733a0a3d8 Mon Sep 17 00:00:00 2001 From: ribeirogab Date: Thu, 28 Nov 2024 12:27:42 -0300 Subject: [PATCH 1/4] feat: add openai chat model type to env configuration --- src/interfaces/utils/env.utils.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/interfaces/utils/env.utils.ts b/src/interfaces/utils/env.utils.ts index f3e4597..68e7320 100644 --- a/src/interfaces/utils/env.utils.ts +++ b/src/interfaces/utils/env.utils.ts @@ -1,11 +1,15 @@ +import type { ChatModel } from 'openai/resources'; + import type { SetupContextEnum } from '../commands/setup'; import type { ProviderEnum } from '../provider'; export type Env = { PROVIDER?: ProviderEnum; + SETUP_CONTEXT: SetupContextEnum; + OPENAI_API_KEY?: string; OPENAI_N_COMMITS?: number | string; - SETUP_CONTEXT: SetupContextEnum; + OPENAI_CHAT_MODEL?: ChatModel; CONFIG_COMMIT_LANGUAGE: string; CONFIG_MAX_COMMIT_CHARACTERS: string | number; From 0a1757b163f4a5752b5414f2eb7a063fff3e5272 Mon Sep 17 00:00:00 2001 From: ribeirogab Date: Thu, 28 Nov 2024 12:31:06 -0300 Subject: [PATCH 2/4] feat: update prompt method to use generic type for return value --- src/interfaces/utils/input.utils.ts | 2 +- src/utils/input.utils.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/interfaces/utils/input.utils.ts b/src/interfaces/utils/input.utils.ts index ca4987b..872e919 100644 --- a/src/interfaces/utils/input.utils.ts +++ b/src/interfaces/utils/input.utils.ts @@ -29,5 +29,5 @@ export interface InputList extends DefaultInput { export type InputPromptDto = Input | InputList; export interface InputUtils { - prompt(input: InputPromptDto): Promise; + prompt(input: InputPromptDto): Promise; } diff --git a/src/utils/input.utils.ts b/src/utils/input.utils.ts index 318405c..66c82f2 100644 --- a/src/utils/input.utils.ts +++ b/src/utils/input.utils.ts @@ -8,7 +8,7 @@ import { } from '@/interfaces'; export class InputUtils implements InputUtilsInterface { - public async prompt(input: InputPromptDto) { + public async prompt(input: InputPromptDto) { try { const promptDto = [{ name: 'data', ...input }]; @@ -24,7 +24,7 @@ export class InputUtils implements InputUtilsInterface { Object.assign(promptDto[0], { choices: choicesWithCustom }); } - const { data } = await inquirer.prompt(promptDto as never); + const { data } = await inquirer.prompt<{ data: T }>(promptDto as never); return data; } catch (error) { From 254f2961d1815713e81b6fb2d067f7cc4de1b3fa Mon Sep 17 00:00:00 2001 From: ribeirogab Date: Thu, 28 Nov 2024 12:32:03 -0300 Subject: [PATCH 3/4] feat: add chat model selection to OpenAI provider configuration --- src/providers/openai.provider.spec.ts | 2 ++ src/providers/openai.provider.ts | 37 +++++++++++++++++++++++---- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/providers/openai.provider.spec.ts b/src/providers/openai.provider.spec.ts index 02026d4..07f27aa 100644 --- a/src/providers/openai.provider.spec.ts +++ b/src/providers/openai.provider.spec.ts @@ -132,6 +132,7 @@ describe('OpenAIProvider', () => { vi.spyOn(inputUtils, 'prompt') .mockResolvedValueOnce('new-api-key') + .mockResolvedValueOnce('chat-model') .mockResolvedValueOnce('3'); const loggerMessageSpy = vi.spyOn(appUtils.logger, 'message'); @@ -144,6 +145,7 @@ describe('OpenAIProvider', () => { expect(envUtils.update).toHaveBeenCalledWith({ ...DEFAULT_ENV, + OPENAI_CHAT_MODEL: 'chat-model', OPENAI_API_KEY: 'new-api-key', OPENAI_N_COMMITS: 3, PROVIDER: ProviderEnum.OpenAI, diff --git a/src/providers/openai.provider.ts b/src/providers/openai.provider.ts index 1256e18..2681a14 100644 --- a/src/providers/openai.provider.ts +++ b/src/providers/openai.provider.ts @@ -1,7 +1,9 @@ import { OpenAI } from 'openai'; +import type { ChatModel } from 'openai/resources'; import { type AppUtils, + type Env, type EnvUtils, type GenerateCommitMessagesDto, InputTypeEnum, @@ -14,6 +16,16 @@ import { DEFAULT_N_COMMITS } from '@/constants'; export class OpenAIProvider implements Provider { private openai: OpenAI; + private readonly defaultChatModel: ChatModel = 'gpt-4o-mini'; + private readonly chatModels: ChatModel[] = [ + 'gpt-4o', + 'gpt-4o-mini', + 'gpt-4-turbo', + 'gpt-4-vision-preview', + 'gpt-4', + 'gpt-3.5-turbo', + ]; + constructor( private readonly envUtils: EnvUtils, private readonly inputUtils: InputUtils, @@ -52,6 +64,18 @@ export class OpenAIProvider implements Provider { type: InputTypeEnum.Input, }); + const chatModel = await this.inputUtils.prompt({ + default: env.OPENAI_CHAT_MODEL || this.defaultChatModel, + message: + 'Choose your OpenAI language model (https://platform.openai.com/docs/models):', + type: 'list', + choices: this.chatModels.map((model) => ({ + value: model, + short: model, + name: model, + })), + }); + const numberOfCommits = await this.inputUtils.prompt({ default: env.OPENAI_N_COMMITS ? String(env.OPENAI_N_COMMITS) : '2', message: 'Enter the number of commits to generate:', @@ -62,6 +86,7 @@ export class OpenAIProvider implements Provider { ...env, OPENAI_N_COMMITS: Number(numberOfCommits), PROVIDER: ProviderEnum.OpenAI, + OPENAI_CHAT_MODEL: chatModel, OPENAI_API_KEY: apiKey, }); @@ -92,14 +117,16 @@ export class OpenAIProvider implements Provider { diff, }: GenerateCommitMessagesDto): Promise { try { - this.checkRequiredEnvVars(); + const env = this.envUtils.variables(); + + this.checkRequiredEnvVars(env); const chatCompletion = await this.client.chat.completions.create({ messages: [ { role: 'user', content: prompt }, - { role: 'user', content: diff }, + { role: 'user', content: `git diff:\n${diff}` }, ], - model: 'gpt-3.5-turbo', + model: env.OPENAI_CHAT_MODEL || this.defaultChatModel, max_tokens: 50, n, }); @@ -125,8 +152,8 @@ export class OpenAIProvider implements Provider { } } - private checkRequiredEnvVars(): void { - if (!this.envUtils.variables().OPENAI_API_KEY) { + private checkRequiredEnvVars(env: Env): void { + if (!env.OPENAI_API_KEY) { this.appUtils.logger.error('OPENAI_API_KEY is required'); this.appUtils.logger.message("Run 'commitfy setup' to set up."); process.exit(0); From edb72e3dbe48850f070c38d1812a436a9a2a4c2c Mon Sep 17 00:00:00 2001 From: ribeirogab Date: Thu, 28 Nov 2024 12:33:59 -0300 Subject: [PATCH 4/4] chore: update version to 0.3.0 in package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b3d683e..d0b6438 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "commitfy", - "version": "0.2.3", + "version": "0.3.0", "main": "lib/index.js", "repository": "https://github.com/ribeirogab/commitfy.git", "author": "ribeirogab ",