yao/kb/providers/converters/vision.go

98 lines
2.9 KiB
Go

package converters
import (
"strings"
"github.com/yaoapp/gou/graphrag/converter"
"github.com/yaoapp/gou/graphrag/types"
kbtypes "github.com/yaoapp/yao/kb/types"
)
// Vision is a converter provider for vision files
type Vision struct {
Autodetect []string `json:"autodetect" yaml:"autodetect"` // Optional, default is empty, if not set, will not use autodetect
MatchPriority int `json:"match_priority" yaml:"match_priority"` // Optional, default is 0, the higher the number, the higher the priority
}
// Make creates a new Vision converter
func (vision *Vision) Make(option *kbtypes.ProviderOption) (types.Converter, error) {
// Start with default values
visionOption := converter.VisionOption{
ConnectorName: "", // Will be set from option
Model: "", // Will use default from connector
Prompt: "", // Will use default
CompressSize: 512, // Default compression size
Language: "Auto", // Default language
Options: nil, // Additional options
}
// Extract values from Properties map
if option != nil && option.Properties != nil {
if connector, ok := option.Properties["connector"]; ok {
if connectorStr, ok := connector.(string); ok {
visionOption.ConnectorName = connectorStr
}
}
if model, ok := option.Properties["model"]; ok {
if modelStr, ok := model.(string); ok {
visionOption.Model = modelStr
}
}
if prompt, ok := option.Properties["prompt"]; ok {
if promptStr, ok := prompt.(string); ok {
visionOption.Prompt = promptStr
}
}
if compressSize, ok := option.Properties["compress_size"]; ok {
if sizeInt, ok := compressSize.(int); ok {
visionOption.CompressSize = int64(sizeInt)
} else if sizeFloat, ok := compressSize.(float64); ok {
visionOption.CompressSize = int64(sizeFloat)
}
}
if language, ok := option.Properties["language"]; ok {
if langStr, ok := language.(string); ok {
visionOption.Language = langStr
}
}
if options, ok := option.Properties["options"]; ok {
if optionsMap, ok := options.(map[string]interface{}); ok {
visionOption.Options = optionsMap
}
}
}
return converter.NewVision(visionOption)
}
// AutoDetect detects the converter based on the filename and content types
func (vision *Vision) AutoDetect(filename, contentTypes string) (bool, int, error) {
// If autodetect is empty, return false
if vision.Autodetect == nil {
return false, 0, nil
}
// Check if the filename matches the autodetect
for _, autodetect := range vision.Autodetect {
if strings.HasSuffix(filename, autodetect) {
return true, vision.MatchPriority, nil
}
// Check if the content types matches the autodetect
if strings.Contains(contentTypes, autodetect) {
return true, vision.MatchPriority, nil
}
}
return false, 0, nil
}
// Schema returns the schema for the Vision converter
func (vision *Vision) Schema(provider *kbtypes.Provider) (*kbtypes.ProviderSchema, error) {
return nil, nil
}