github.com/weaviate/weaviate@v1.24.6/modules/img2vec-neural/module.go (about) 1 // _ _ 2 // __ _____ __ ___ ___ __ _| |_ ___ 3 // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ 4 // \ V V / __/ (_| |\ V /| | (_| | || __/ 5 // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| 6 // 7 // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. 8 // 9 // CONTACT: hello@weaviate.io 10 // 11 12 package modimage 13 14 import ( 15 "context" 16 "net/http" 17 "os" 18 "time" 19 20 "github.com/pkg/errors" 21 "github.com/sirupsen/logrus" 22 "github.com/weaviate/weaviate/entities/models" 23 "github.com/weaviate/weaviate/entities/modulecapabilities" 24 "github.com/weaviate/weaviate/entities/moduletools" 25 "github.com/weaviate/weaviate/modules/img2vec-neural/clients" 26 "github.com/weaviate/weaviate/modules/img2vec-neural/vectorizer" 27 ) 28 29 func New() *ImageModule { 30 return &ImageModule{} 31 } 32 33 type ImageModule struct { 34 vectorizer imageVectorizer 35 graphqlProvider modulecapabilities.GraphQLArguments 36 searcher modulecapabilities.Searcher 37 } 38 39 type imageVectorizer interface { 40 Object(ctx context.Context, object *models.Object, comp moduletools.VectorizablePropsComparator, 41 cfg moduletools.ClassConfig) ([]float32, models.AdditionalProperties, error) 42 VectorizeImage(ctx context.Context, 43 id, image string, cfg moduletools.ClassConfig) ([]float32, error) 44 } 45 46 func (m *ImageModule) Name() string { 47 return "img2vec-neural" 48 } 49 50 func (m *ImageModule) Type() modulecapabilities.ModuleType { 51 return modulecapabilities.Img2Vec 52 } 53 54 func (m *ImageModule) Init(ctx context.Context, 55 params moduletools.ModuleInitParams, 56 ) error { 57 if err := m.initVectorizer(ctx, params.GetConfig().ModuleHttpClientTimeout, params.GetLogger()); err != nil { 58 return errors.Wrap(err, "init vectorizer") 59 } 60 61 if err := m.initNearImage(); err != nil { 62 return errors.Wrap(err, "init near text") 63 } 64 65 return nil 66 } 67 68 func (m *ImageModule) initVectorizer(ctx context.Context, timeout time.Duration, 69 logger logrus.FieldLogger, 70 ) error { 71 // TODO: proper config management 72 uri := os.Getenv("IMAGE_INFERENCE_API") 73 if uri == "" { 74 return errors.Errorf("required variable IMAGE_INFERENCE_API is not set") 75 } 76 77 client := clients.New(uri, timeout, logger) 78 if err := client.WaitForStartup(ctx, 1*time.Second); err != nil { 79 return errors.Wrap(err, "init remote vectorizer") 80 } 81 82 m.vectorizer = vectorizer.New(client) 83 84 return nil 85 } 86 87 func (m *ImageModule) RootHandler() http.Handler { 88 // TODO: remove once this is a capability interface 89 return nil 90 } 91 92 func (m *ImageModule) VectorizeObject(ctx context.Context, 93 obj *models.Object, comp moduletools.VectorizablePropsComparator, cfg moduletools.ClassConfig, 94 ) ([]float32, models.AdditionalProperties, error) { 95 return m.vectorizer.Object(ctx, obj, comp, cfg) 96 } 97 98 func (m *ImageModule) MetaInfo() (map[string]interface{}, error) { 99 return map[string]interface{}{}, nil 100 } 101 102 // verify we implement the modules.Module interface 103 var ( 104 _ = modulecapabilities.Module(New()) 105 _ = modulecapabilities.Vectorizer(New()) 106 )