summaryrefslogtreecommitdiff
path: root/internal/image/registry.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/image/registry.go')
-rw-r--r--internal/image/registry.go29
1 files changed, 29 insertions, 0 deletions
diff --git a/internal/image/registry.go b/internal/image/registry.go
index 0338115..7b2a465 100644
--- a/internal/image/registry.go
+++ b/internal/image/registry.go
@@ -12,6 +12,9 @@ type Factory[C any] func(C) (ImageProvider, error)
// Config exposes the configured image provider name.
type Config interface {
ImageProviderName() string
+ GoogleAPIKey() string
+ ImageModel() string
+ ImageTextModel() string
}
// Registry resolves provider names to factories.
@@ -56,6 +59,12 @@ func (r *Registry[C]) Resolve(name string) (Factory[C], bool) {
return factory, ok
}
+// Has reports whether a factory is registered for name.
+func (r *Registry[C]) Has(name string) bool {
+ _, ok := r.Resolve(name)
+ return ok
+}
+
// New constructs a provider for name.
func (r *Registry[C]) New(name string, cfg C) (ImageProvider, error) {
var zero ImageProvider
@@ -74,6 +83,26 @@ func (r *Registry[C]) NewFromConfig(cfg C) (ImageProvider, error) {
return r.New(cfg.ImageProviderName(), cfg)
}
+// DefaultRegistry returns the built-in image provider registry.
+func DefaultRegistry() *Registry[Config] {
+ registry := NewRegistry[Config]()
+ registry.Register(Gemini, func(cfg Config) (ImageProvider, error) {
+ geminiProvider := NewGeminiProvider(&GeminiConfig{
+ APIKey: cfg.GoogleAPIKey(),
+ Model: cfg.ImageModel(),
+ TextModel: cfg.ImageTextModel(),
+ })
+ if err := geminiProvider.IsAvailable(); err != nil {
+ return nil, err
+ }
+ return geminiProvider, nil
+ })
+ registry.Register(OpenAI, func(Config) (ImageProvider, error) {
+ return nil, fmt.Errorf("image provider %q is not implemented", OpenAI)
+ })
+ return registry
+}
+
func isNilValue[T any](value T) bool {
v := reflect.ValueOf(value)
if !v.IsValid() {