Skip to content

Commit 254f296

Browse files
committed
feat: add chat model selection to OpenAI provider configuration
1 parent 0a1757b commit 254f296

File tree

2 files changed

+34
-5
lines changed

2 files changed

+34
-5
lines changed

src/providers/openai.provider.spec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ describe('OpenAIProvider', () => {
132132

133133
vi.spyOn(inputUtils, 'prompt')
134134
.mockResolvedValueOnce('new-api-key')
135+
.mockResolvedValueOnce('chat-model')
135136
.mockResolvedValueOnce('3');
136137

137138
const loggerMessageSpy = vi.spyOn(appUtils.logger, 'message');
@@ -144,6 +145,7 @@ describe('OpenAIProvider', () => {
144145

145146
expect(envUtils.update).toHaveBeenCalledWith({
146147
...DEFAULT_ENV,
148+
OPENAI_CHAT_MODEL: 'chat-model',
147149
OPENAI_API_KEY: 'new-api-key',
148150
OPENAI_N_COMMITS: 3,
149151
PROVIDER: ProviderEnum.OpenAI,

src/providers/openai.provider.ts

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { OpenAI } from 'openai';
2+
import type { ChatModel } from 'openai/resources';
23

34
import {
45
type AppUtils,
6+
type Env,
57
type EnvUtils,
68
type GenerateCommitMessagesDto,
79
InputTypeEnum,
@@ -14,6 +16,16 @@ import { DEFAULT_N_COMMITS } from '@/constants';
1416
export class OpenAIProvider implements Provider {
1517
private openai: OpenAI;
1618

19+
private readonly defaultChatModel: ChatModel = 'gpt-4o-mini';
20+
private readonly chatModels: ChatModel[] = [
21+
'gpt-4o',
22+
'gpt-4o-mini',
23+
'gpt-4-turbo',
24+
'gpt-4-vision-preview',
25+
'gpt-4',
26+
'gpt-3.5-turbo',
27+
];
28+
1729
constructor(
1830
private readonly envUtils: EnvUtils,
1931
private readonly inputUtils: InputUtils,
@@ -52,6 +64,18 @@ export class OpenAIProvider implements Provider {
5264
type: InputTypeEnum.Input,
5365
});
5466

67+
const chatModel = await this.inputUtils.prompt<ChatModel>({
68+
default: env.OPENAI_CHAT_MODEL || this.defaultChatModel,
69+
message:
70+
'Choose your OpenAI language model (https://platform.openai.com/docs/models):',
71+
type: 'list',
72+
choices: this.chatModels.map((model) => ({
73+
value: model,
74+
short: model,
75+
name: model,
76+
})),
77+
});
78+
5579
const numberOfCommits = await this.inputUtils.prompt({
5680
default: env.OPENAI_N_COMMITS ? String(env.OPENAI_N_COMMITS) : '2',
5781
message: 'Enter the number of commits to generate:',
@@ -62,6 +86,7 @@ export class OpenAIProvider implements Provider {
6286
...env,
6387
OPENAI_N_COMMITS: Number(numberOfCommits),
6488
PROVIDER: ProviderEnum.OpenAI,
89+
OPENAI_CHAT_MODEL: chatModel,
6590
OPENAI_API_KEY: apiKey,
6691
});
6792

@@ -92,14 +117,16 @@ export class OpenAIProvider implements Provider {
92117
diff,
93118
}: GenerateCommitMessagesDto): Promise<string[]> {
94119
try {
95-
this.checkRequiredEnvVars();
120+
const env = this.envUtils.variables();
121+
122+
this.checkRequiredEnvVars(env);
96123

97124
const chatCompletion = await this.client.chat.completions.create({
98125
messages: [
99126
{ role: 'user', content: prompt },
100-
{ role: 'user', content: diff },
127+
{ role: 'user', content: `git diff:\n${diff}` },
101128
],
102-
model: 'gpt-3.5-turbo',
129+
model: env.OPENAI_CHAT_MODEL || this.defaultChatModel,
103130
max_tokens: 50,
104131
n,
105132
});
@@ -125,8 +152,8 @@ export class OpenAIProvider implements Provider {
125152
}
126153
}
127154

128-
private checkRequiredEnvVars(): void {
129-
if (!this.envUtils.variables().OPENAI_API_KEY) {
155+
private checkRequiredEnvVars(env: Env): void {
156+
if (!env.OPENAI_API_KEY) {
130157
this.appUtils.logger.error('OPENAI_API_KEY is required');
131158
this.appUtils.logger.message("Run 'commitfy setup' to set up.");
132159
process.exit(0);

0 commit comments

Comments
 (0)