mirror of
https://github.com/securego/gosec.git
synced 2025-11-23 22:15:04 +02:00
* upgrade gemini sdk to google.golang.org/genai v1.25.0 * support newer gemini models * add anthropic claude
92 lines
2.2 KiB
Go
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)
|
|
}
|