56 lines
2.4 KiB
Go
56 lines
2.4 KiB
Go
// 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)
|
||
}
|
||
}
|