yao/kb/providers/factory/factory.go
Max 6acea5b004 Refactor extractor to extraction provider and update related configurations
- Renamed extractor provider to extraction provider across the codebase for consistency and clarity.
- Updated references in configuration files, provider factories, and asset management to reflect the new terminology.
- Removed the extractor provider implementation and associated test files, streamlining the provider structure.
- Adjusted test cases and documentation to align with the new extraction provider framework.
2025-08-13 16:32:30 +08:00

151 lines
4.3 KiB
Go

package factory
import (
"fmt"
"github.com/yaoapp/gou/graphrag/types"
kbtypes "github.com/yaoapp/yao/kb/types"
)
// ProviderType is a type for provider types
type ProviderType string
const (
// ProviderTypeChunking is a type for chunking providers
ProviderTypeChunking ProviderType = "chunking"
// ProviderTypeConverter is a type for converter providers
ProviderTypeConverter ProviderType = "converter"
// ProviderTypeEmbedding is a type for embedding providers
ProviderTypeEmbedding ProviderType = "embedding"
// ProviderTypeExtraction is a type for extraction providers
ProviderTypeExtraction ProviderType = "extraction"
// ProviderTypeFetcher is a type for fetcher providers
ProviderTypeFetcher ProviderType = "fetcher"
)
// DetectMatch is a match for auto detect
type DetectMatch struct {
ID string
Priority int
}
// Chunkings is a map of chunking providers
var Chunkings = map[string]Chunking{}
// Converters is a map of converter providers
var Converters = map[string]Converter{}
// Embeddings is a map of embedding providers
var Embeddings = map[string]Embedding{}
// Extractions is a map of extraction providers
var Extractions = map[string]Extraction{}
// Fetchers is a map of fetcher providers
var Fetchers = map[string]Fetcher{}
// === Chunking API ===
// MakeChunking creates a new chunking provider
func MakeChunking(id string, option *kbtypes.ProviderOption) (types.Chunking, error) {
chunking, ok := Chunkings[id]
if !ok {
return nil, fmt.Errorf("chunking provider %s not found", id)
}
return chunking.Make(option)
}
// ChunkingOptions returns the options for a chunking provider
func ChunkingOptions(id string, option *kbtypes.ProviderOption) (*types.ChunkingOptions, error) {
chunking, ok := Chunkings[id]
if !ok {
return nil, fmt.Errorf("chunking provider %s not found", id)
}
return chunking.Options(option)
}
// === Converter API ===
// MakeConverter creates a new converter provider
func MakeConverter(id string, option *kbtypes.ProviderOption) (types.Converter, error) {
converter, ok := Converters[id]
if !ok {
return nil, fmt.Errorf("converter provider %s not found", id)
}
return converter.Make(option)
}
// AutoDetectConverter detects the converter based on the filename and content types
// return matched, id, error
func AutoDetectConverter(filename, contentType string) (bool, string, error) {
var highestPriority int = 0
var highestID string = ""
for id, converter := range Converters {
ok, priority, err := converter.AutoDetect(filename, contentType)
if err != nil {
continue
}
if ok && priority > highestPriority {
highestPriority = priority
highestID = id
}
}
return highestID != "", highestID, nil
}
// === Embedding API ===
// MakeEmbedding creates a new embedding provider
func MakeEmbedding(id string, option *kbtypes.ProviderOption) (types.Embedding, error) {
embedding, ok := Embeddings[id]
if !ok {
return nil, fmt.Errorf("embedding provider %s not found", id)
}
return embedding.Make(option)
}
// === Extraction API ===
// MakeExtraction creates a new extraction provider
func MakeExtraction(id string, option *kbtypes.ProviderOption) (types.Extraction, error) {
extraction, ok := Extractions[id]
if !ok {
return nil, fmt.Errorf("extraction provider %s not found", id)
}
return extraction.Make(option)
}
// === Fetcher API ===
// MakeFetcher creates a new fetcher provider
func MakeFetcher(id string, option *kbtypes.ProviderOption) (types.Fetcher, error) {
fetcher, ok := Fetchers[id]
if !ok {
return nil, fmt.Errorf("fetcher provider %s not found", id)
}
return fetcher.Make(option)
}
// === Schema API ===
// GetSchema returns the schema for a provider
func GetSchema(typ ProviderType, provider *kbtypes.Provider, locale string) (*kbtypes.ProviderSchema, error) {
var schema Schema = nil
var exists bool = false
switch typ {
case ProviderTypeChunking:
schema, exists = Chunkings[provider.ID]
case ProviderTypeConverter:
schema, exists = Converters[provider.ID]
case ProviderTypeEmbedding:
schema, exists = Embeddings[provider.ID]
case ProviderTypeExtraction:
schema, exists = Extractions[provider.ID]
case ProviderTypeFetcher:
schema, exists = Fetchers[provider.ID]
}
if !exists {
return nil, fmt.Errorf("%s provider %s not found", typ, provider.ID)
}
return schema.Schema(provider, locale)
}