// internal/ai/provider.go // Дата: 2026-03-12 (обновлён 2026-03-12: добавлен Groq / OpenAI-compat) // Интерфейс LLMProvider — абстракция над любым LLM-бэкендом. // Реализации: Google Gemini, Groq (OpenAI-compat), облачный LLM (stub). 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: "groq" (по умолчанию), "google", "cloud" Provider string // HintLevel: 0–5, если 0 — AI не вызывается HintLevel int // Groq / OpenAI-совместимые провайдеры GroqAPIKey string GroqModel string // по умолчанию "llama-3.3-70b-versatile" GroqEndpoint string // по умолчанию https://api.groq.com/openai/v1/chat/completions // Google Gemini (геоблок в РФ) GoogleAPIKey string GoogleModel string // по умолчанию "gemini-2.0-flash" // Будущий облачный LLM CloudEndpoint string CloudToken string } // NewProvider — фабрика провайдеров. Выбор по Config.Provider. // При добавлении нового провайдера — только сюда добавить case. func NewProvider(cfg Config) (LLMProvider, error) { switch cfg.Provider { case "groq": return NewOpenAICompatProvider(cfg.GroqEndpoint, cfg.GroqAPIKey, cfg.GroqModel) 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: // По умолчанию groq — работает из РФ без геоблоков return NewOpenAICompatProvider(cfg.GroqEndpoint, cfg.GroqAPIKey, cfg.GroqModel) } }