Files
sless/internal/ai/provider.go
T

56 lines
2.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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: 05, если 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)
}
}