-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathgemini_service.go
99 lines (87 loc) · 4.62 KB
/
gemini_service.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package service
import (
"context"
"fmt"
"strings"
"github.com/google/generative-ai-go/genai"
"github.com/spf13/viper"
"google.golang.org/api/option"
)
type GeminiService struct{}
func NewGeminiService() *GeminiService {
return &GeminiService{}
}
func (g *GeminiService) AnalyzeChanges(
ctx context.Context,
diff string,
userContext *string,
relatedFiles *map[string]string,
) (string, error) {
client, err := genai.NewClient(
ctx,
option.WithAPIKey(viper.GetString("api.key")),
)
if err != nil {
fmt.Println("Error:", err)
return "", err
}
defer client.Close()
// format relatedFiles to be dir : files
relatedFilesArray := make([]string, 0, len(*relatedFiles))
for dir, ls := range *relatedFiles {
relatedFilesArray = append(relatedFilesArray, fmt.Sprintf("%s:%s", dir, ls))
}
model := client.GenerativeModel("gemini-pro")
resp, err := model.GenerateContent(
ctx,
genai.Text(
fmt.Sprintf(
`let's assume you're an automated AI that will generate a conventional git commit message based on this diff changes:
%s
and this user context "%s".
The commit message must follow this format:
"<type>(<scope>): <description>
[optional body]
[optional footer(s)]"
Neighboring Files:
%s
Type must be one of the following:
- build: changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)
- ci: changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)
- docs: documentation only changes
- feat: a new feature
- fix: a bug fix
- perf: a code change that improves performance
- refactor: a code change that neither fixes a bug nor adds a feature
- style: changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc. Changes to web styling do not fall into this category )
- test: adding missing tests or correcting existing tests
Specification:
- Commits MUST be prefixed with a type, which consists of a noun, feat, fix, etc., followed by the OPTIONAL scope, OPTIONAL !, and REQUIRED terminal colon and space.
- A scope MAY be provided after a type. A scope MUST consist of a noun describing a section of the codebase surrounded by parenthesis, e.g., fix(parser):
- A description MUST immediately follow the colon and space after the type/scope prefix. The description is a short summary of the code changes, e.g., fix: array parsing issue when multiple spaces were contained in string.
- A description MUST started with lowercase.
- Descriptions CANNOT use past tense verbs.
- A longer commit body MAY be provided after the short description, providing additional contextual information about the code changes. The body MUST begin one blank line after the description.
- A commit body is free-form and MAY consist of any number of newline separated paragraphs.
- One or more footers MAY be provided one blank line after the body. Each footer MUST consist of a word token, followed by either a :<space> or <space># separator, followed by a string value (this is inspired by the git trailer convention).
- A footer’s token MUST use - in place of whitespace characters, e.g., Acked-by (this helps differentiate the footer section from a multi-paragraph body). An exception is made for BREAKING CHANGE, which MAY also be used as a token.
- A footer’s value MAY contain spaces and newlines, and parsing MUST terminate when the next valid footer token/separator pair is observed.
- Breaking changes MUST be indicated in the type/scope prefix of a commit, or as an entry in the footer.
- If included as a footer, a breaking change MUST consist of the uppercase text BREAKING CHANGE, followed by a colon, space, and description, e.g., BREAKING CHANGE: environment variables now take precedence over config files.
- If included in the type/scope prefix, breaking changes MUST be indicated by a ! immediately before the :. If ! is used, BREAKING CHANGE: MAY be omitted from the footer section, and the commit description SHALL be used to describe the breaking change.
- Types other than feat and fix MAY be used in your commit messages, e.g., docs: update ref docs.
- The units of information that make up Conventional Commits MUST NOT be treated as case sensitive by implementors, with the exception of BREAKING CHANGE which MUST be uppercase.
- BREAKING-CHANGE MUST be synonymous with BREAKING CHANGE, when used as a token in a footer.
Exclude anything unnecessary, because your entire response will be passed directly into git commit`,
diff,
*userContext,
strings.Join(relatedFilesArray, ", "),
),
),
)
if err != nil {
fmt.Println("Error:", err)
return "", nil
}
return fmt.Sprintf("%v", resp.Candidates[0].Content.Parts[0]), nil
}