weaviate
109 строк · 2.7 Кб
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
12package clients
13
14import (
15"context"
16"encoding/json"
17"fmt"
18"io"
19"net/http"
20"strings"
21"sync"
22
23enterrors "github.com/weaviate/weaviate/entities/errors"
24
25"github.com/pkg/errors"
26"github.com/weaviate/weaviate/modules/text2vec-transformers/ent"
27)
28
29func (v *vectorizer) MetaInfo() (map[string]interface{}, error) {
30type nameMetaErr struct {
31name string
32meta map[string]interface{}
33err error
34}
35
36endpoints := map[string]string{}
37if v.originPassage != v.originQuery {
38endpoints["passage"] = v.urlPassage("/meta", ent.VectorizationConfig{})
39endpoints["query"] = v.urlQuery("/meta", ent.VectorizationConfig{})
40} else {
41endpoints[""] = v.urlPassage("/meta", ent.VectorizationConfig{})
42}
43
44var wg sync.WaitGroup
45ch := make(chan nameMetaErr, len(endpoints))
46for serviceName, endpoint := range endpoints {
47serviceName, endpoint := serviceName, endpoint
48wg.Add(1)
49enterrors.GoWrapper(func() {
50defer wg.Done()
51meta, err := v.metaInfo(endpoint)
52ch <- nameMetaErr{serviceName, meta, err}
53}, v.logger)
54}
55wg.Wait()
56close(ch)
57
58metas := map[string]interface{}{}
59var errs []string
60for nme := range ch {
61if nme.err != nil {
62prefix := ""
63if nme.name != "" {
64prefix = "[" + nme.name + "] "
65}
66errs = append(errs, fmt.Sprintf("%s%v", prefix, nme.err.Error()))
67}
68if nme.meta != nil {
69metas[nme.name] = nme.meta
70}
71}
72
73if len(errs) > 0 {
74return nil, errors.Errorf(strings.Join(errs, ", "))
75}
76if len(metas) == 1 {
77for _, meta := range metas {
78return meta.(map[string]interface{}), nil
79}
80}
81return metas, nil
82}
83
84func (v *vectorizer) metaInfo(endpoint string) (map[string]interface{}, error) {
85req, err := http.NewRequestWithContext(context.Background(), "GET", endpoint, nil)
86if err != nil {
87return nil, errors.Wrap(err, "create GET meta request")
88}
89
90res, err := v.httpClient.Do(req)
91if err != nil {
92return nil, errors.Wrap(err, "send GET meta request")
93}
94defer res.Body.Close()
95if !(res.StatusCode >= http.StatusOK && res.StatusCode < http.StatusMultipleChoices) {
96return nil, errors.Errorf("unexpected status code '%d' of meta request", res.StatusCode)
97}
98
99bodyBytes, err := io.ReadAll(res.Body)
100if err != nil {
101return nil, errors.Wrap(err, "read meta response body")
102}
103
104var resBody map[string]interface{}
105if err := json.Unmarshal(bodyBytes, &resBody); err != nil {
106return nil, errors.Wrap(err, "unmarshal meta response body")
107}
108return resBody, nil
109}
110