package llm import ( "context" "fmt" anyllm "github.com/mozilla-ai/any-llm-go" "github.com/mozilla-ai/any-llm-go/providers/anthropic" "github.com/mozilla-ai/any-llm-go/providers/ollama" "github.com/mozilla-ai/any-llm-go/providers/openai" "trankilou.fr/lassistanoque/backend/internal/domain" ) var providerTypes = []domain.Item{ {ID: "anthropic", Text: "Anthropic"}, {ID: "openai", Text: "OpenAI"}, {ID: "ollama", Text: "Ollama"}, {ID: "openaicomp", Text: "OpenAI compatible"}, {ID: "openrouter", Text: "Openrouter"}, } type AnyLLMEngine struct { } func NewAnyLLMEngine() *AnyLLMEngine { return &AnyLLMEngine{} } func (e *AnyLLMEngine) ListProviderTypes() []domain.Item { return providerTypes } func providerFactory(provider *domain.Provider) (anyllm.Provider, error) { switch provider.Type { case "ollama": return ollama.New( anyllm.WithBaseURL(provider.URL), ) case "openai": return openai.New( anyllm.WithAPIKey(provider.APIKey), ) case "openaicomp": return openai.New( anyllm.WithBaseURL(provider.URL), anyllm.WithAPIKey(provider.APIKey), ) case "anthropic": return anthropic.New( anyllm.WithAPIKey(provider.APIKey), ) } return nil, fmt.Errorf("unknown provider type: %s", provider.Type) } func (e *AnyLLMEngine) ListModelsFromProvider(ctx context.Context, provider *domain.Provider) ([]string, error) { models := make([]string, 0) prov, err := providerFactory(provider) if err != nil { return nil, err } if lister, ok := prov.(anyllm.ModelLister); ok { response, err := lister.ListModels(ctx) if err != nil { return nil, err } for _, m := range response.Data { models = append(models, m.ID) } } else { models = append(models, "Default") } return models, nil }