1
0
mirror of https://github.com/securego/gosec.git synced 2025-11-23 22:15:04 +02:00
Files
gosec/autofix/gemini.go
Matteo Calabrò 64ebfc0106 feat(autofix): update gemini sdk and add anthropic claude
* upgrade gemini sdk to google.golang.org/genai v1.25.0
* support newer gemini models
* add anthropic claude
2025-09-22 08:24:39 +00:00

92 lines
2.2 KiB
Go

package autofix
import (
"context"
"errors"
"fmt"
"google.golang.org/genai"
)
// https://ai.google.dev/gemini-api/docs/models
type GenAIModel string
const (
ModelGeminiPro2_5 GenAIModel = "gemini-2.5-pro"
ModelGeminiFlash2_5 GenAIModel = "gemini-2.5-flash"
ModelGeminiFlash2_5Lite GenAIModel = "gemini-2.5-flash-lite"
ModelGeminiFlash2_0 GenAIModel = "gemini-2.0-flash"
ModelGeminiFlash2_0Lite GenAIModel = "gemini-2.0-flash-lite"
// Deprecated: Use Gemini 2.x models.
ModelGeminiFlash1_5 GenAIModel = "gemini-1.5-flash"
)
var _ GenAIClient = (*geminiWrapper)(nil)
type geminiWrapper struct {
client *genai.Client
model GenAIModel
}
func NewGeminiClient(model, apiKey string) (GenAIClient, error) {
ctx := context.Background()
genaiModel, err := parseGeminiModel(model)
if err != nil {
return nil, err
}
config := genai.ClientConfig{
APIKey: apiKey,
Backend: genai.BackendUnspecified,
}
client, err := genai.NewClient(ctx, &config)
if err != nil {
return nil, fmt.Errorf("creating gemini client: %w", err)
}
return &geminiWrapper{
client: client,
model: genaiModel,
}, nil
}
func (g *geminiWrapper) GenerateSolution(ctx context.Context, prompt string) (string, error) {
var config genai.GenerateContentConfig
resp, err := g.client.Models.GenerateContent(ctx, string(g.model), genai.Text(prompt), &config)
if err != nil {
return "", fmt.Errorf("generating autofix: %w", err)
}
if resp == nil || len(resp.Candidates) == 0 {
return "", errors.New("no autofix returned by gemini")
}
if len(resp.Candidates[0].Content.Parts) == 0 {
return "", errors.New("nothing found in the first autofix returned by gemini")
}
return resp.Text(), nil
}
func parseGeminiModel(model string) (GenAIModel, error) {
switch model {
case "gemini-2.5-pro":
return ModelGeminiPro2_5, nil
case "gemini-2.5-flash":
return ModelGeminiFlash2_5, nil
case "gemini-2.5-flash-lite":
return ModelGeminiFlash2_5Lite, nil
case "gemini-2.0-flash":
return ModelGeminiFlash2_0, nil
case "gemini-2.0-flash-lite", "gemini": // Default
return ModelGeminiFlash2_0Lite, nil
case "gemini-1.5-flash":
return ModelGeminiFlash1_5, nil
}
return "", fmt.Errorf("unsupported gemini model: %s", model)
}