feat: AI-анализ terraform plan (уровни 0-5, Google Gemini)

This commit is contained in:
Naeel
2026-03-12 08:29:05 +03:00
parent a7fc960c82
commit d5ce8c2fac
6 changed files with 529 additions and 0 deletions
+53
View File
@@ -0,0 +1,53 @@
// internal/ai/provider.go
// Дата: 2026-03-12
// Интерфейс LLMProvider — абстракция над любым LLM-бэкендом.
// Сейчас реализован Google Gemini. В будущем — облачный LLM (drop-in замена).
package ai
import "context"
// LLMProvider — единственный интерфейс для всех LLM-провайдеров.
// Менять провайдер = менять одну env-переменную AI_PROVIDER.
type LLMProvider interface {
// Analyze отправляет промпт в LLM и возвращает текстовый ответ.
Analyze(ctx context.Context, prompt string) (string, error)
// Name возвращает имя провайдера для логирования.
Name() string
}
// Config — конфигурация анализатора, читается из env-переменных.
type Config struct {
// Provider: "google" или "cloud" (в будущем)
Provider string
// HintLevel: 0–5, если 0 — AI не вызывается
HintLevel int
// Google Gemini
GoogleAPIKey string
GoogleModel string // по умолчанию "gemini-pro"
// Будущий облачный LLM
CloudEndpoint string
CloudToken string
}
// NewProvider — фабрика провайдеров. Выбор по Config.Provider.
// При добавлении нового провайдера — только сюда добавить case.
func NewProvider(cfg Config) (LLMProvider, error) {
switch cfg.Provider {
case "google":
model := cfg.GoogleModel
if model == "" {
model = "gemini-2.0-flash"
}
return NewGeminiProvider(cfg.GoogleAPIKey, model)
case "cloud":
return NewCloudLLMProvider(cfg.CloudEndpoint, cfg.CloudToken)
default:
// По умолчанию google, если AI_PROVIDER не задан
model := cfg.GoogleModel
if model == "" {
model = "gemini-2.0-flash"
}
return NewGeminiProvider(cfg.GoogleAPIKey, model)
}
}