55 lines
1.4 KiB
Go
55 lines
1.4 KiB
Go
package integration
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
)
|
|
|
|
type Kind string
|
|
|
|
const (
|
|
KindSource Kind = "source"
|
|
KindRetrievalBackend Kind = "retrieval_backend"
|
|
KindArtifactStore Kind = "artifact_store"
|
|
KindEmbeddingProvider Kind = "embedding_provider"
|
|
KindRerankProvider Kind = "rerank_provider"
|
|
KindGenerationProvider Kind = "generation_provider"
|
|
KindExecutor Kind = "executor"
|
|
)
|
|
|
|
type Manifest struct {
|
|
Name string `json:"name"`
|
|
Kind Kind `json:"kind"`
|
|
SchemaVersion string `json:"schema_version"`
|
|
Capabilities map[string]bool `json:"capabilities"`
|
|
}
|
|
|
|
type Factory interface {
|
|
Manifest() Manifest
|
|
Build(context.Context, json.RawMessage, string) (any, error)
|
|
}
|
|
|
|
type Registry struct {
|
|
factories map[string]Factory
|
|
}
|
|
|
|
func NewRegistry(factories ...Factory) (*Registry, error) {
|
|
registry := &Registry{factories: make(map[string]Factory, len(factories))}
|
|
for _, factory := range factories {
|
|
name := factory.Manifest().Name
|
|
if name == "" {
|
|
return nil, errors.New("integration manifest name is required")
|
|
}
|
|
if _, exists := registry.factories[name]; exists {
|
|
return nil, errors.New("duplicate integration factory: " + name)
|
|
}
|
|
registry.factories[name] = factory
|
|
}
|
|
return registry, nil
|
|
}
|
|
|
|
func (registry *Registry) Get(name string) (Factory, bool) {
|
|
factory, ok := registry.factories[name]
|
|
return factory, ok
|
|
}
|