77 lines
1.7 KiB
Go
77 lines
1.7 KiB
Go
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{
|
|
{Value: "anthropic", Label: "Anthropic"},
|
|
{Value: "openai", Label: "OpenAI"},
|
|
{Value: "ollama", Label: "Ollama"},
|
|
{Value: "openaicomp", Label: "OpenAI compatible"},
|
|
{Value: "openrouter", Label: "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
|
|
}
|