Spaces:
Sleeping
Sleeping
| // _ _ | |
| // __ _____ __ ___ ___ __ _| |_ ___ | |
| // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
| // \ V V / __/ (_| |\ V /| | (_| | || __/ | |
| // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| | |
| // | |
| // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. | |
| // | |
| // CONTACT: [email protected] | |
| // | |
| package main | |
| import ( | |
| "encoding/json" | |
| "fmt" | |
| "io" | |
| "log" | |
| "net/http" | |
| "os" | |
| "strings" | |
| "github.com/pkg/errors" | |
| ) | |
| const configurationAPIOrigin = "https://configuration.semi.technology" | |
| func main() { | |
| version := os.Getenv("VERSION") | |
| languages, err := getLanguages() | |
| fatal(err) | |
| languages, err = getModels(languages) | |
| fatal(err) | |
| printRelaeseNotes(languages, version) | |
| } | |
| type language struct { | |
| code string | |
| label string | |
| model string | |
| } | |
| func printRelaeseNotes(languages []language, version string) { | |
| fmt.Printf("Docker image/tag: `semitechnologies/weaviate:%s`\n", version) | |
| fmt.Printf("See also: example docker-compose files in %s. ", makeLinks(languages, version)) | |
| fmt.Printf("If you need to configure additional settings, you can also generate " + | |
| "a custom `docker-compose.yml` file [using the documentation]" + | |
| "(https://weaviate.io/developers/weaviate/installation/docker-compose).") | |
| fmt.Printf("\n## Breaking Changes\n*none*\n") | |
| fmt.Printf("\n## New Features\n*none*\n") | |
| fmt.Printf("\n## Fixes\n*none*\n") | |
| } | |
| func makeLinks(languages []language, version string) string { | |
| var out string | |
| for i, lang := range languages { | |
| if i != 0 { | |
| out += ", " | |
| } | |
| link := fmt.Sprintf("%s/docker-compose?weaviate_version=%s&language=%s&contextionary_model=%s", | |
| configurationAPIOrigin, version, lang.code, lang.model) | |
| out += fmt.Sprintf("[%s](%s)", lang.label, link) | |
| } | |
| return out | |
| } | |
| func getModels(languages []language) ([]language, error) { | |
| for i, lang := range languages { | |
| resp, err := http.Get(fmt.Sprintf( | |
| "%s/docker-compose/parameters/contextionary-models?language=%s", | |
| configurationAPIOrigin, lang.code)) | |
| if err != nil { | |
| return nil, errors.Wrapf(err, "language %s", lang.label) | |
| } | |
| defer resp.Body.Close() | |
| bytes, err := io.ReadAll(resp.Body) | |
| if err != nil { | |
| return nil, errors.Wrapf(err, "language %s", lang.label) | |
| } | |
| model, err := extractModel(bytes) | |
| if err != nil { | |
| return nil, errors.Wrapf(err, "language %s", lang.label) | |
| } | |
| languages[i].model = model | |
| } | |
| return languages, nil | |
| } | |
| func extractModel(in []byte) (string, error) { | |
| var payload map[string]interface{} | |
| err := json.Unmarshal(in, &payload) | |
| if err != nil { | |
| return "", err | |
| } | |
| options := payload["items"].([]interface{}) | |
| if len(options) < 1 { | |
| return "", fmt.Errorf("no model options for this language") | |
| } | |
| return options[0].(map[string]interface{})["value"].(string), nil | |
| } | |
| func getLanguages() ([]language, error) { | |
| codes := strings.Split(os.Getenv("LANGUAGES"), " ") | |
| out := make([]language, len(codes)) | |
| for i, code := range codes { | |
| label, err := languageFullName(code) | |
| if err != nil { | |
| return nil, err | |
| } | |
| out[i] = language{ | |
| code: code, | |
| label: label, | |
| } | |
| } | |
| return out, nil | |
| } | |
| func fatal(err error) { | |
| if err != nil { | |
| log.Fatal(err) | |
| } | |
| } | |
| func languageFullName(code string) (string, error) { | |
| switch code { | |
| case "en": | |
| return "English", nil | |
| case "de": | |
| return "German", nil | |
| case "it": | |
| return "Italian", nil | |
| case "cs": | |
| return "Czech", nil | |
| case "nl": | |
| return "Dutch", nil | |
| default: | |
| return "", fmt.Errorf("unknown language %s", code) | |
| } | |
| } | |