Skip to content

Commit 6a57e4a

Browse files
committed
refactor(provider): extract common commit generation logic
1 parent 63c9851 commit 6a57e4a

3 files changed

Lines changed: 65 additions & 85 deletions

File tree

internal/provider/common.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package provider
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"strings"
7+
8+
"github.com/openai/openai-go"
9+
)
10+
11+
// commonProvider holds the common fields and methods for OpenAI-compatible providers.
12+
type commonProvider struct {
13+
client *openai.Client
14+
model string
15+
}
16+
17+
// generateCommitMessages is a helper function to generate commit messages using the OpenAI API.
18+
func (c *commonProvider) generateCommitMessages(ctx context.Context, diff string) ([]string, error) {
19+
if diff == "" {
20+
return nil, fmt.Errorf("no diff provided")
21+
}
22+
23+
prompt := fmt.Sprintf("Based on the following git diff, generate 10 conventional commit messages. Each message should be on a new line, without any numbering or bullet points:\n\n%s", diff)
24+
25+
params := openai.ChatCompletionNewParams{
26+
Model: openai.ChatModel(c.model),
27+
Messages: []openai.ChatCompletionMessageParamUnion{
28+
{OfSystem: &openai.ChatCompletionSystemMessageParam{Content: openai.ChatCompletionSystemMessageParamContentUnion{OfString: openai.String("You are a helpful assistant that generates git commit messages.")}}},
29+
{OfUser: &openai.ChatCompletionUserMessageParam{Content: openai.ChatCompletionUserMessageParamContentUnion{OfString: openai.String(prompt)}}},
30+
},
31+
}
32+
33+
resp, err := c.client.Chat.Completions.New(ctx, params)
34+
if err != nil {
35+
return nil, fmt.Errorf("error making request to OpenAI compatible API: %w", err)
36+
}
37+
38+
if len(resp.Choices) == 0 {
39+
return nil, fmt.Errorf("no commit messages generated")
40+
}
41+
42+
content := resp.Choices[0].Message.Content
43+
messages := strings.Split(content, "\n")
44+
var cleanMessages []string
45+
for _, msg := range messages {
46+
if strings.TrimSpace(msg) != "" {
47+
cleanMessages = append(cleanMessages, strings.TrimSpace(msg))
48+
}
49+
}
50+
return cleanMessages, nil
51+
}

internal/provider/openai.go

Lines changed: 7 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,15 @@ package provider
33
import (
44
"context"
55
"fmt"
6-
"strings"
76

87
"github.com/openai/openai-go"
98
"github.com/openai/openai-go/option"
109
)
1110

12-
1311
type OpenAIProvider struct {
14-
client *openai.Client
15-
model string
12+
commonProvider
1613
}
1714

18-
1915
func NewOpenAIProvider(apiKey, model string) *OpenAIProvider {
2016
if model == "" {
2117
model = "gpt-3.5-turbo"
@@ -24,15 +20,15 @@ func NewOpenAIProvider(apiKey, model string) *OpenAIProvider {
2420
option.WithAPIKey(apiKey),
2521
)
2622
return &OpenAIProvider{
27-
client: &client,
28-
model: model,
23+
commonProvider: commonProvider{
24+
client: &client,
25+
model: model,
26+
},
2927
}
3028
}
3129

32-
33-
3430
func (o *OpenAIProvider) GenerateCommitMessage(ctx context.Context, diff string) (string, error) {
35-
messages, err := o.GenerateCommitMessages(ctx, diff)
31+
messages, err := o.generateCommitMessages(ctx, diff)
3632
if err != nil {
3733
return "", err
3834
}
@@ -42,42 +38,6 @@ func (o *OpenAIProvider) GenerateCommitMessage(ctx context.Context, diff string)
4238
return messages[0], nil
4339
}
4440

45-
4641
func (o *OpenAIProvider) GenerateCommitMessages(ctx context.Context, diff string) ([]string, error) {
47-
if diff == "" {
48-
return nil, fmt.Errorf("no diff provided")
49-
}
50-
51-
52-
prompt := fmt.Sprintf("Based on the following git diff, generate 10 conventional commit messages. Each message should be on a new line, without any numbering or bullet points:\n\n%s", diff)
53-
54-
55-
params := openai.ChatCompletionNewParams{
56-
Model: openai.ChatModel(o.model),
57-
Messages: []openai.ChatCompletionMessageParamUnion{
58-
{OfSystem: &openai.ChatCompletionSystemMessageParam{Content: openai.ChatCompletionSystemMessageParamContentUnion{OfString: openai.String("You are a helpful assistant that generates git commit messages.")}}},
59-
{OfUser: &openai.ChatCompletionUserMessageParam{Content: openai.ChatCompletionUserMessageParamContentUnion{OfString: openai.String(prompt)}}},
60-
},
61-
}
62-
63-
64-
resp, err := o.client.Chat.Completions.New(ctx, params)
65-
if err != nil {
66-
return nil, fmt.Errorf("error making request to OpenAI: %w", err)
67-
}
68-
69-
if len(resp.Choices) == 0 {
70-
return nil, fmt.Errorf("no commit messages generated")
71-
}
72-
73-
74-
content := resp.Choices[0].Message.Content
75-
messages := strings.Split(content, "\n")
76-
var cleanMessages []string
77-
for _, msg := range messages {
78-
if strings.TrimSpace(msg) != "" {
79-
cleanMessages = append(cleanMessages, strings.TrimSpace(msg))
80-
}
81-
}
82-
return cleanMessages, nil
42+
return o.generateCommitMessages(ctx, diff)
8343
}

internal/provider/openrouter.go

Lines changed: 7 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,13 @@ package provider
33
import (
44
"context"
55
"fmt"
6-
"strings"
76

87
"github.com/openai/openai-go"
98
"github.com/openai/openai-go/option"
109
)
1110

1211
type OpenRouterProvider struct {
13-
client *openai.Client
14-
model string
12+
commonProvider
1513
}
1614

1715
func NewOpenRouterProvider(apiKey, model string) *OpenRouterProvider {
@@ -26,13 +24,15 @@ func NewOpenRouterProvider(apiKey, model string) *OpenRouterProvider {
2624
option.WithHeaderAdd("X-Title", "LazyCommit"),
2725
)
2826
return &OpenRouterProvider{
29-
client: &client,
30-
model: model,
27+
commonProvider: commonProvider{
28+
client: &client,
29+
model: model,
30+
},
3131
}
3232
}
3333

3434
func (o *OpenRouterProvider) GenerateCommitMessage(ctx context.Context, diff string) (string, error) {
35-
messages, err := o.GenerateCommitMessages(ctx, diff)
35+
messages, err := o.generateCommitMessages(ctx, diff)
3636
if err != nil {
3737
return "", err
3838
}
@@ -43,36 +43,5 @@ func (o *OpenRouterProvider) GenerateCommitMessage(ctx context.Context, diff str
4343
}
4444

4545
func (o *OpenRouterProvider) GenerateCommitMessages(ctx context.Context, diff string) ([]string, error) {
46-
if diff == "" {
47-
return nil, fmt.Errorf("no diff provided")
48-
}
49-
50-
prompt := fmt.Sprintf("Based on the following git diff, generate 10 conventional commit messages. Each message should be on a new line, without any numbering or bullet points:\n\n%s", diff)
51-
52-
params := openai.ChatCompletionNewParams{
53-
Model: openai.ChatModel(o.model),
54-
Messages: []openai.ChatCompletionMessageParamUnion{
55-
{OfSystem: &openai.ChatCompletionSystemMessageParam{Content: openai.ChatCompletionSystemMessageParamContentUnion{OfString: openai.String("You are a helpful assistant that generates git commit messages.")}}},
56-
{OfUser: &openai.ChatCompletionUserMessageParam{Content: openai.ChatCompletionUserMessageParamContentUnion{OfString: openai.String(prompt)}}},
57-
},
58-
}
59-
60-
resp, err := o.client.Chat.Completions.New(ctx, params)
61-
if err != nil {
62-
return nil, fmt.Errorf("error making request to OpenAI: %w", err)
63-
}
64-
65-
if len(resp.Choices) == 0 {
66-
return nil, fmt.Errorf("no commit messages generated")
67-
}
68-
69-
content := resp.Choices[0].Message.Content
70-
messages := strings.Split(content, "\n")
71-
var cleanMessages []string
72-
for _, msg := range messages {
73-
if strings.TrimSpace(msg) != "" {
74-
cleanMessages = append(cleanMessages, strings.TrimSpace(msg))
75-
}
76-
}
77-
return cleanMessages, nil
46+
return o.generateCommitMessages(ctx, diff)
7847
}

0 commit comments

Comments
 (0)