11import { OpenAI } from 'openai' ;
2+ import type { ChatModel } from 'openai/resources' ;
23
34import {
45 type AppUtils ,
6+ type Env ,
57 type EnvUtils ,
68 type GenerateCommitMessagesDto ,
79 InputTypeEnum ,
@@ -14,6 +16,16 @@ import { DEFAULT_N_COMMITS } from '@/constants';
1416export 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