KevinStephenson
Adding in weaviate code
b110593
raw
history blame
3.6 kB
// _ _
// __ _____ __ ___ ___ __ _| |_ ___
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
// \ 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)
}
}