From 1aa1968747c9b8e842f255966fbe135b7b83ba37 Mon Sep 17 00:00:00 2001 From: Adrien Date: Wed, 22 May 2024 17:41:21 +0200 Subject: [PATCH] Added Creation and delete of LLM --- Chat.go | 30 ++- LLM.go | 76 ++++-- Request.go | 2 - dbschema/default.esdl | 11 +- dbschema/migrations/00030-m1qq2mn.edgeql | 12 + dbschema/migrations/00031-m1q5wil.edgeql | 9 + dbschema/migrations/00032-m1nonmd.edgeql | 9 + main.go | 2 +- utils.go | 19 ++ views/chat.html | 2 +- views/partials/popover-models.html | 283 +++++++++++++++-------- views/partials/popover-settings.html | 47 +++- 12 files changed, 365 insertions(+), 137 deletions(-) create mode 100644 dbschema/migrations/00030-m1qq2mn.edgeql create mode 100644 dbschema/migrations/00031-m1q5wil.edgeql create mode 100644 dbschema/migrations/00032-m1nonmd.edgeql diff --git a/Chat.go b/Chat.go index 5f1f31e..4749d38 100644 --- a/Chat.go +++ b/Chat.go @@ -43,6 +43,8 @@ func DeleteMessageHandler(c *fiber.Ctx) error { } func LoadChatHandler(c *fiber.Ctx) error { + deleteLLMtoDelete() + if checkIfLogin() { if getCurrentUserKeys() == nil { return c.SendString(generateEnterKeyChatHTML()) @@ -134,6 +136,7 @@ func GetMessageContentHandler(c *fiber.Ctx) error { SELECT Message { content, llm : { + name, modelInfo : { modelID, name, @@ -153,7 +156,7 @@ func GetMessageContentHandler(c *fiber.Ctx) error { out := "
" out += "

" - out += selectedMessage.LLM.Model.Name + out += "" + selectedMessage.LLM.Name + " " + selectedMessage.LLM.Model.ModelID + "" out += "

" out += "
" out += "
" @@ -222,9 +225,11 @@ func generatePricingTableChatHTML() string { closeBtn := ` ` @@ -425,10 +430,7 @@ func LoadKeysHandler(c *fiber.Ctx) error { return c.SendString(out) } -func LoadModelSelectionHandler(c *fiber.Ctx) error { - if !checkIfLogin() || !checkIfHaveKey() { - return c.SendString("") - } +func GenerateModelPopoverHTML(refresh bool) string { openaiExists, anthropicExists, mistralExists, groqExists, gooseaiExists, googleExists := getExistingKeys() var llms []LLM @@ -447,7 +449,7 @@ func LoadModelSelectionHandler(c *fiber.Ctx) error { } } } - FILTER .user = global currentUser AND .name != 'none' + FILTER .user = global currentUser AND .name != 'none' AND .to_delete = false `, &llms) if err != nil { panic(err) @@ -460,6 +462,8 @@ func LoadModelSelectionHandler(c *fiber.Ctx) error { // } //} + modelInfos := GetAvailableModels() + out, err := pongo2.Must(pongo2.FromFile("views/partials/popover-models.html")).Execute(pongo2.Context{ "IsLogin": checkIfLogin(), "OpenaiExists": openaiExists, @@ -470,12 +474,20 @@ func LoadModelSelectionHandler(c *fiber.Ctx) error { "GoogleExists": googleExists, "AnyExists": openaiExists || anthropicExists || mistralExists || groqExists || gooseaiExists || googleExists, "LLMs": llms, + "ModelInfos": modelInfos, + "DeleteUpdate": refresh, }) if err != nil { panic(err) } + return out +} - return c.SendString(out) +func LoadModelSelectionHandler(c *fiber.Ctx) error { + if !checkIfLogin() || !checkIfHaveKey() { + return c.SendString("") + } + return c.SendString(GenerateModelPopoverHTML(false)) } func LoadSettingsHandler(c *fiber.Ctx) error { diff --git a/LLM.go b/LLM.go index d223d98..2c5ecee 100644 --- a/LLM.go +++ b/LLM.go @@ -1,31 +1,77 @@ package main import ( + "encoding/json" + "github.com/edgedb/edgedb-go" - "github.com/flosch/pongo2" "github.com/gofiber/fiber/v2" ) // LLM stuff func deleteLLM(c *fiber.Ctx) error { - id := c.FormValue("id") - idUUID, _ := edgedb.ParseUUID(id) + var selectedLLMIds []string + err := json.Unmarshal([]byte(c.FormValue("selectedLLMIds")), &selectedLLMIds) + if err != nil { + // Handle the error + panic(err) + } + for _, id := range selectedLLMIds { + idUUID, _ := edgedb.ParseUUID(id) + err := edgeClient.Execute(edgeCtx, ` + UPDATE LLM + FILTER .id = $0 AND .user = global currentUser + SET { + to_delete := true + }; + `, idUUID) + if err != nil { + panic(err) + } + } + + deleteLLMtoDelete() + + return c.SendString(GenerateModelPopoverHTML(true)) +} + +func deleteLLMtoDelete() { err := edgeClient.Execute(edgeCtx, ` - DELETE LLM - FILTER .id = $0; - `, idUUID) + delete LLM + filter .to_delete = true and not exists( + select Message filter .llm = LLM + ); + `) + if err != nil { + panic(err) + } +} + +func createLLM(c *fiber.Ctx) error { + name := c.FormValue("model-name-input") + modelID := c.FormValue("selectedLLMId") + temperature := c.FormValue("temperature-slider") + systemPrompt := c.FormValue("model-prompt-input") + + // Transform the temperature to a float + temperatureparsed, err := json.Marshal(temperature) + if err != nil { + panic(err) + } + temperatureFloat := float32(temperatureparsed[1]) + + err = edgeClient.Execute(edgeCtx, ` + INSERT LLM { + name := $0, + context := $1, + temperature := $2, + modelInfo := (SELECT ModelInfo FILTER .modelID = $3 LIMIT 1), + user := global currentUser + } + `, name, systemPrompt, temperatureFloat, modelID) if err != nil { panic(err) } - return c.SendString("") -} - -func openLlmModal(c *fiber.Ctx) error { - out, err := pongo2.Must(pongo2.FromFile("views/partials/modal-llm-setting.html")).Execute(pongo2.Context{}) - if err != nil { - panic(err) - } - return c.SendString(out) + return c.SendString(GenerateModelPopoverHTML(true)) } diff --git a/Request.go b/Request.go index d9f5a5a..1dce59c 100644 --- a/Request.go +++ b/Request.go @@ -32,8 +32,6 @@ func GeneratePlaceholderHandler(c *fiber.Ctx) error { panic(err) } - fmt.Println("SelectedLLMIds:", selectedLLMIds) - var selectedLLMs []LLM var selectedLLM LLM diff --git a/dbschema/default.esdl b/dbschema/default.esdl index fe91123..7cb99e4 100644 --- a/dbschema/default.esdl +++ b/dbschema/default.esdl @@ -78,8 +78,15 @@ module default { required name: str; required context: str; required temperature: float32; - required modelInfo: ModelInfo; - required user: User; + required to_delete: bool { + default := false; + }; + required modelInfo: ModelInfo { + on target delete allow; + }; + required user: User { + on target delete allow; + }; } type Company { diff --git a/dbschema/migrations/00030-m1qq2mn.edgeql b/dbschema/migrations/00030-m1qq2mn.edgeql new file mode 100644 index 0000000..7b80f40 --- /dev/null +++ b/dbschema/migrations/00030-m1qq2mn.edgeql @@ -0,0 +1,12 @@ +CREATE MIGRATION m1qq2mnk2l2bepeoatd2gxq2ygi73apnxwojog2g533h36e576rx6q + ONTO m1cokoqujl36nbvnldmofdwszcmsp6ulre23r5gx52d65aqnr64cca +{ + ALTER TYPE default::LLM { + ALTER LINK modelInfo { + ON TARGET DELETE ALLOW; + }; + ALTER LINK user { + ON TARGET DELETE ALLOW; + }; + }; +}; diff --git a/dbschema/migrations/00031-m1q5wil.edgeql b/dbschema/migrations/00031-m1q5wil.edgeql new file mode 100644 index 0000000..2f7807d --- /dev/null +++ b/dbschema/migrations/00031-m1q5wil.edgeql @@ -0,0 +1,9 @@ +CREATE MIGRATION m1q5wildsqhzj62drznyoi2bahpej6errkzhol7xs2qwootecjlcdq + ONTO m1qq2mnk2l2bepeoatd2gxq2ygi73apnxwojog2g533h36e576rx6q +{ + ALTER TYPE default::LLM { + CREATE REQUIRED PROPERTY to_delete: std::bool { + SET REQUIRED USING ({false}); + }; + }; +}; diff --git a/dbschema/migrations/00032-m1nonmd.edgeql b/dbschema/migrations/00032-m1nonmd.edgeql new file mode 100644 index 0000000..b79466c --- /dev/null +++ b/dbschema/migrations/00032-m1nonmd.edgeql @@ -0,0 +1,9 @@ +CREATE MIGRATION m1nonmddagbu3p7dcqmy3bvxkwinjfosg7iuna5xxwruig4rcnr4yq + ONTO m1q5wildsqhzj62drznyoi2bahpej6errkzhol7xs2qwootecjlcdq +{ + ALTER TYPE default::LLM { + ALTER PROPERTY to_delete { + SET default := false; + }; + }; +}; diff --git a/main.go b/main.go index a2d3e74..8675c2a 100644 --- a/main.go +++ b/main.go @@ -77,7 +77,6 @@ func main() { // Settings routes app.Post("/addKeys", addKeys) - app.Get("/modal", openLlmModal) // Popovers app.Get("/loadModelSelection", LoadModelSelectionHandler) @@ -93,6 +92,7 @@ func main() { // LLM app.Get("deleteLLM", deleteLLM) + app.Post("/createLLM", createLLM) app.Get("/test", func(c *fiber.Ctx) error { fmt.Println("Hello from test") diff --git a/utils.go b/utils.go index 9ef453d..a967dbd 100644 --- a/utils.go +++ b/utils.go @@ -133,3 +133,22 @@ func Message2RequestMessage(messages []Message) []RequestMessage { } return m } + +func GetAvailableModels() []ModelInfo { + // TODO Filter if key is not available + var models []ModelInfo + err := edgeClient.Query(edgeCtx, ` + SELECT ModelInfo { + modelID, + name, + company : { + name, + icon + } + } FILTER .modelID != 'none' + `, &models) + if err != nil { + panic(err) + } + return models +} diff --git a/views/chat.html b/views/chat.html index 6b491f5..c68bb59 100644 --- a/views/chat.html +++ b/views/chat.html @@ -3,7 +3,7 @@
-
diff --git a/views/partials/popover-models.html b/views/partials/popover-models.html index 0f232c7..3b4cc07 100644 --- a/views/partials/popover-models.html +++ b/views/partials/popover-models.html @@ -1,4 +1,4 @@ -