From 3f739575d8632d623cc4bed3d8c597bd0402760e Mon Sep 17 00:00:00 2001 From: Ettore Di Giacinto Date: Wed, 17 May 2023 21:01:46 +0200 Subject: [PATCH] Minor fixes (#285) --- .github/workflows/bump_deps.yaml | 5 +- README.md | 8 ++- api/openai.go | 116 +++++++++++++++++-------------- 3 files changed, 70 insertions(+), 59 deletions(-) diff --git a/.github/workflows/bump_deps.yaml b/.github/workflows/bump_deps.yaml index a10d2af1..3c0f4202 100644 --- a/.github/workflows/bump_deps.yaml +++ b/.github/workflows/bump_deps.yaml @@ -9,9 +9,6 @@ jobs: fail-fast: false matrix: include: - - repository: "go-skynet/go-gpt4all-j.cpp" - variable: "GOGPT4ALLJ_VERSION" - branch: "master" - repository: "go-skynet/go-llama.cpp" variable: "GOLLAMA_VERSION" branch: "master" @@ -30,7 +27,7 @@ jobs: - repository: "go-skynet/bloomz.cpp" variable: "BLOOMZ_VERSION" branch: "main" - - repository: "go-skynet/gpt4all" + - repository: "nomic-ai/gpt4all" variable: "GPT4ALL_VERSION" branch: "main" runs-on: ubuntu-latest diff --git a/README.md b/README.md index d9986e6d..c538ab36 100644 --- a/README.md +++ b/README.md @@ -696,6 +696,8 @@ curl http://localhost:8080/v1/models ### Embeddings +OpenAI docs: https://platform.openai.com/docs/api-reference/embeddings +
The embedding endpoint is experimental and enabled only if the model is configured with `embeddings: true` in its `yaml` file, for example: @@ -742,6 +744,8 @@ curl http://localhost:8080/v1/audio/transcriptions -H "Content-Type: multipart/f ### Image generation +OpenAI docs: https://platform.openai.com/docs/api-reference/images/create + LocalAI supports generating images with Stable diffusion, running on CPU. | mode=0 | mode=1 (winograd/sgemm) | @@ -773,6 +777,8 @@ curl http://localhost:8080/v1/images/generations -H "Content-Type: application/j }' ``` +Note: image generator supports images up to 512x512. You can use other tools however to upscale the image, for instance: https://github.com/upscayl/upscayl. + #### Setup Note: In order to use the `images/generation` endpoint, you need to build LocalAI with `GO_TAGS=stablediffusion`. @@ -847,7 +853,7 @@ Yes! If the client uses OpenAI and supports setting a different base URL to send
-Not currently, as ggml doesn't support GPUs yet: https://github.com/ggerganov/llama.cpp/discussions/915. +There is partial GPU support, see build instructions above.
diff --git a/api/openai.go b/api/openai.go index 19284f24..52d65976 100644 --- a/api/openai.go +++ b/api/openai.go @@ -289,12 +289,14 @@ func chatEndpoint(cm ConfigMerger, debug bool, loader *model.ModelLoader, thread mess := []string{} for _, i := range input.Messages { + var content string r := config.Roles[i.Role] - if r == "" { - r = i.Role + if r != "" { + content = fmt.Sprint(r, " ", i.Content) + } else { + content = i.Content } - content := fmt.Sprint(r, " ", i.Content) mess = append(mess, content) } @@ -491,66 +493,72 @@ func imageEndpoint(cm ConfigMerger, debug bool, loader *model.ModelLoader, image var result []Item for _, i := range config.PromptStrings { - prompts := strings.Split(i, "|") - positive_prompt := prompts[0] - negative_prompt := "" - if len(prompts) > 1 { - negative_prompt = prompts[1] + n := input.N + if input.N == 0 { + n = 1 } + for j := 0; j < n; j++ { + prompts := strings.Split(i, "|") + positive_prompt := prompts[0] + negative_prompt := "" + if len(prompts) > 1 { + negative_prompt = prompts[1] + } - mode := 0 - step := 15 + mode := 0 + step := 15 - if input.Mode != 0 { - mode = input.Mode - } + if input.Mode != 0 { + mode = input.Mode + } - if input.Step != 0 { - step = input.Step - } + if input.Step != 0 { + step = input.Step + } - tempDir := "" - if !b64JSON { - tempDir = imageDir - } - // Create a temporary file - outputFile, err := ioutil.TempFile(tempDir, "b64") - if err != nil { - return err - } - outputFile.Close() - output := outputFile.Name() + ".png" - // Rename the temporary file - err = os.Rename(outputFile.Name(), output) - if err != nil { - return err - } - - baseURL := c.BaseURL() - - fn, err := ImageGeneration(height, width, mode, step, input.Seed, positive_prompt, negative_prompt, output, loader, *config) - if err != nil { - return err - } - if err := fn(); err != nil { - return err - } - - item := &Item{} - - if b64JSON { - defer os.RemoveAll(output) - data, err := os.ReadFile(output) + tempDir := "" + if !b64JSON { + tempDir = imageDir + } + // Create a temporary file + outputFile, err := ioutil.TempFile(tempDir, "b64") + if err != nil { + return err + } + outputFile.Close() + output := outputFile.Name() + ".png" + // Rename the temporary file + err = os.Rename(outputFile.Name(), output) if err != nil { return err } - item.B64JSON = base64.StdEncoding.EncodeToString(data) - } else { - base := filepath.Base(output) - item.URL = baseURL + "/generated-images/" + base - } - result = append(result, *item) + baseURL := c.BaseURL() + + fn, err := ImageGeneration(height, width, mode, step, input.Seed, positive_prompt, negative_prompt, output, loader, *config) + if err != nil { + return err + } + if err := fn(); err != nil { + return err + } + + item := &Item{} + + if b64JSON { + defer os.RemoveAll(output) + data, err := os.ReadFile(output) + if err != nil { + return err + } + item.B64JSON = base64.StdEncoding.EncodeToString(data) + } else { + base := filepath.Base(output) + item.URL = baseURL + "/generated-images/" + base + } + + result = append(result, *item) + } } resp := &OpenAIResponse{