1// Package providers provides a registry of inference providers
 2package providers
 3
 4import (
 5	_ "embed"
 6	"encoding/json"
 7	"log"
 8
 9	"github.com/charmbracelet/fur/pkg/provider"
10)
11
12//go:embed configs/openai.json
13var openAIConfig []byte
14
15//go:embed configs/anthropic.json
16var anthropicConfig []byte
17
18//go:embed configs/gemini.json
19var geminiConfig []byte
20
21//go:embed configs/openrouter.json
22var openRouterConfig []byte
23
24//go:embed configs/azure.json
25var azureConfig []byte
26
27//go:embed configs/vertexai.json
28var vertexAIConfig []byte
29
30//go:embed configs/xai.json
31var xAIConfig []byte
32
33//go:embed configs/bedrock.json
34var bedrockConfig []byte
35
36// ProviderFunc is a function that returns a Provider.
37type ProviderFunc func() provider.Provider
38
39var providerRegistry = []ProviderFunc{
40	anthropicProvider,
41	openAIProvider,
42	geminiProvider,
43	azureProvider,
44	bedrockProvider,
45	vertexAIProvider,
46	xAIProvider,
47	openRouterProvider,
48}
49
50// GetAll returns all registered providers.
51func GetAll() []provider.Provider {
52	providers := make([]provider.Provider, 0, len(providerRegistry))
53	for _, providerFunc := range providerRegistry {
54		providers = append(providers, providerFunc())
55	}
56	return providers
57}
58
59func loadProviderFromConfig(configData []byte) provider.Provider {
60	var p provider.Provider
61	if err := json.Unmarshal(configData, &p); err != nil {
62		log.Printf("Error loading provider config: %v", err)
63		return provider.Provider{}
64	}
65	return p
66}
67
68func openAIProvider() provider.Provider {
69	return loadProviderFromConfig(openAIConfig)
70}
71
72func anthropicProvider() provider.Provider {
73	return loadProviderFromConfig(anthropicConfig)
74}
75
76func geminiProvider() provider.Provider {
77	return loadProviderFromConfig(geminiConfig)
78}
79
80func azureProvider() provider.Provider {
81	return loadProviderFromConfig(azureConfig)
82}
83
84func bedrockProvider() provider.Provider {
85	return loadProviderFromConfig(bedrockConfig)
86}
87
88func vertexAIProvider() provider.Provider {
89	return loadProviderFromConfig(vertexAIConfig)
90}
91
92func xAIProvider() provider.Provider {
93	return loadProviderFromConfig(xAIConfig)
94}
95
96func openRouterProvider() provider.Provider {
97	return loadProviderFromConfig(openRouterConfig)
98}