From c63813aff4e5b9f08a43bc3433ef65e980320116 Mon Sep 17 00:00:00 2001 From: Adrien Date: Mon, 13 May 2024 20:14:25 +0200 Subject: [PATCH] QOL update --- Chat.go | 61 ++++++++++++++++++++++++ Request.go | 44 ++++++++--------- RequestAnthropic.go | 2 +- RequestGroq.go | 6 +-- RequestMistral.go | 2 +- RequestOpenai.go | 2 +- database.go | 30 +++++++++++- dbschema/default.esdl | 6 ++- dbschema/migrations/00021-m1uadgx.edgeql | 14 ++++++ login.go | 3 ++ main.go | 4 +- views/chat.html | 27 +++++++++-- views/partials/message-bot.html | 8 +++- views/partials/message-user.html | 16 ++++--- views/partials/popover-settings.html | 8 ++-- 15 files changed, 186 insertions(+), 47 deletions(-) create mode 100644 dbschema/migrations/00021-m1uadgx.edgeql diff --git a/Chat.go b/Chat.go index edeae79..27bda7c 100644 --- a/Chat.go +++ b/Chat.go @@ -258,8 +258,60 @@ func GetEditMessageFormHandler(c *fiber.Ctx) error { return c.SendString(out) } +func RedoMessageHandler(c *fiber.Ctx) error { + messageId := c.FormValue("id") + messageUUID, _ := edgedb.ParseUUID(messageId) + + // Delete messages + err := edgeClient.Execute(edgeCtx, ` + WITH + messageArea := (SELECT Message FILTER .id = $0).area + DELETE Area + FILTER .position > messageArea.position AND .conversation = messageArea.conversation; + `, messageUUID) + if err != nil { + fmt.Println("Error in edgeClient.Execute: in DeleteMessageHandler") + fmt.Println(err) + } + + messageOut, err := botTmpl.Execute(pongo2.Context{"IsPlaceholder": true}) + if err != nil { + c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ + "error": "Error rendering template", + }) + } + + selectedModelIds := []string{} + for ModelInfo := range ModelsInfos { + out := c.FormValue("model-check-" + ModelsInfos[ModelInfo].ID) + if out != "" { + selectedModelIds = append(selectedModelIds, ModelsInfos[ModelInfo].ID) + } + } + lastSelectedModelIds = selectedModelIds + + return c.SendString(messageOut) +} + +func ClearChatHandler(c *fiber.Ctx) error { + // Delete the default conversation + err := edgeClient.Execute(edgeCtx, ` + DELETE Conversation + FILTER .user = global currentUser AND .name = "Default"; + `) + if err != nil { + fmt.Println("Error in edgeClient.Execute: in ClearChatHandler") + fmt.Println(err) + } + + return c.SendString(generateChatHTML()) +} + // Popover stuff func LoadUsageKPIHandler(c *fiber.Ctx) error { + if !checkIfLogin() { + return c.SendString("") + } var TotalUsage float32 // Using the database. Get the sum of all usage.inputCost and outputCost err := edgeClient.QuerySingle(edgeCtx, ` @@ -326,6 +378,9 @@ func LoadUsageKPIHandler(c *fiber.Ctx) error { } func LoadKeysHandler(c *fiber.Ctx) error { + if !checkIfLogin() { + return c.SendString("") + } openaiExists, anthropicExists, mistralExists, groqExists := getExistingKeys() out, err := pongo2.Must(pongo2.FromFile("views/partials/popover-keys.html")).Execute(pongo2.Context{"IsLogin": checkIfLogin(), "OpenaiExists": openaiExists, "AnthropicExists": anthropicExists, "MistralExists": mistralExists, "GroqExists": groqExists}) @@ -338,6 +393,9 @@ func LoadKeysHandler(c *fiber.Ctx) error { } func LoadModelSelectionHandler(c *fiber.Ctx) error { + if !checkIfLogin() { + return c.SendString("") + } openaiExists, anthropicExists, mistralExists, groqExists := getExistingKeys() var CompanyInfosAvailable []CompanyInfo @@ -398,6 +456,9 @@ func LoadModelSelectionHandler(c *fiber.Ctx) error { } func LoadSettingsHandler(c *fiber.Ctx) error { + if !checkIfLogin() { + return c.SendString("") + } out, err := pongo2.Must(pongo2.FromFile("views/partials/popover-settings.html")).Execute(pongo2.Context{"IsLogin": checkIfLogin()}) if err != nil { c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ diff --git a/Request.go b/Request.go index 752bd23..4ec679c 100644 --- a/Request.go +++ b/Request.go @@ -103,34 +103,34 @@ func GenerateMultipleMessages(c *fiber.Ctx) error { return c.SendString(generateChatHTML()) } -func RequestMultipleMessages(c *fiber.Ctx) error { - message := c.FormValue("message") - if chatString, commandExecuted := DetectCommand(message, c); commandExecuted { - return c.SendString(chatString) - } - - // Add an Area with the user message inside - insertArea() - messageID := insertUserMessage(message) +func RequestMultipleMessagesHandler(c *fiber.Ctx) error { + message := c.FormValue("message", "") selectedModelIds := []string{} - for CompanyInfo := range CompanyInfos { - for ModelInfo := range CompanyInfos[CompanyInfo].ModelInfos { - out := c.FormValue("model-check-" + CompanyInfos[CompanyInfo].ModelInfos[ModelInfo].ID) - if out != "" { - selectedModelIds = append(selectedModelIds, CompanyInfos[CompanyInfo].ModelInfos[ModelInfo].ID) - } + for ModelInfo := range ModelsInfos { + out := c.FormValue("model-check-" + ModelsInfos[ModelInfo].ID) + if out != "" { + selectedModelIds = append(selectedModelIds, ModelsInfos[ModelInfo].ID) } } lastSelectedModelIds = selectedModelIds - out := "" - - messageOut, _ := userTmpl.Execute(pongo2.Context{"Content": markdownToHTML(message), "ID": messageID.String()}) - out += messageOut - - messageOut, _ = botTmpl.Execute(pongo2.Context{"IsPlaceholder": true, "SelectedModelIds": selectedModelIds, "Message": message}) - out += messageOut + out := RequestMultipleMessages(message, selectedModelIds) return c.SendString(out) } + +func RequestMultipleMessages(message string, selectedModelIds []string) string { + // Add an Area with the user message inside + insertArea() + messageID := insertUserMessage(message) + + out := "" + messageOut, _ := userTmpl.Execute(pongo2.Context{"Content": markdownToHTML(message), "ID": messageID.String()}) + out += messageOut + + messageOut, _ = botTmpl.Execute(pongo2.Context{"IsPlaceholder": true}) + out += messageOut + + return out +} diff --git a/RequestAnthropic.go b/RequestAnthropic.go index 1685d88..3c8ee85 100644 --- a/RequestAnthropic.go +++ b/RequestAnthropic.go @@ -85,7 +85,7 @@ func init() { } func addAnthropicMessage(modelID string, selected bool) edgedb.UUID { - Messages := getAllMessages() + Messages := getAllSelectedMessages() chatCompletion, err := RequestAnthropic(modelID, Messages, 2048, 0.7) // TODO CHange parameters if err != nil { diff --git a/RequestGroq.go b/RequestGroq.go index 7a929e4..6327665 100644 --- a/RequestGroq.go +++ b/RequestGroq.go @@ -47,7 +47,7 @@ func init() { modelInfo := ModelInfo{ ID: "llama3-8b-8192", - Name: "Llama 8B", + Name: "Llama 3 8B", Icon: "groq", MaxToken: 8192, InputPrice: 0.00 / 1000000, @@ -58,7 +58,7 @@ func init() { modelInfo = ModelInfo{ ID: "llama3-70b-8192", - Name: "Llama 70B", + Name: "Llama 3 70B", Icon: "groq", MaxToken: 8192, InputPrice: 0.00 / 1000000, @@ -88,7 +88,7 @@ func init() { } func addGroqMessage(modelID string, selected bool) edgedb.UUID { - Messages := getAllMessages() + Messages := getAllSelectedMessages() chatCompletion, err := RequestGroq(modelID, Messages, 0.7) if err != nil { diff --git a/RequestMistral.go b/RequestMistral.go index 6238f4e..dc72b22 100644 --- a/RequestMistral.go +++ b/RequestMistral.go @@ -121,7 +121,7 @@ func init() { } func addMistralMessage(modelID string, selected bool) edgedb.UUID { - Messages := getAllMessages() + Messages := getAllSelectedMessages() chatCompletion, err := RequestMistral(modelID, Messages, 0.7) if err != nil { diff --git a/RequestOpenai.go b/RequestOpenai.go index 51ab154..4aa2846 100644 --- a/RequestOpenai.go +++ b/RequestOpenai.go @@ -77,7 +77,7 @@ func init() { } func addOpenaiMessage(modelID string, selected bool) edgedb.UUID { - Messages := getAllMessages() + Messages := getAllSelectedMessages() chatCompletion, err := RequestOpenai(modelID, Messages, 0.7) if err != nil { diff --git a/database.go b/database.go index 12d23d7..29dae1f 100644 --- a/database.go +++ b/database.go @@ -178,7 +178,8 @@ func insertUserMessage(content string) edgedb.UUID { SELECT Conversation FILTER .name = 'Default' AND .user = global currentUser LIMIT 1 - ) + ), + selected := true } `, &inserted, "user", content, lastAreaID) if err != nil { @@ -243,6 +244,33 @@ func getAllMessages() []Message { return messages } +func getAllSelectedMessages() []Message { + // If no CurrentUser, return an empty array + if !checkIfLogin() { + return []Message{} + } + + var messages []Message + + err := edgeClient.Query(edgeCtx, ` + SELECT Message { + id, + model_id, + selected, + role, + content, + date + } FILTER .conversation.name = 'Default' AND .conversation.user = global currentUser AND .selected = true + ORDER BY .date ASC + `, &messages) + if err != nil { + fmt.Println("Error in edgedb.Query: in getAllMessages") + fmt.Println(err) + } + + return messages +} + func getCurrentUserKeys() []Key { var result []Key err := edgeClient.Query(edgeCtx, "SELECT global currentUser.setting.keys", &result) diff --git a/dbschema/default.esdl b/dbschema/default.esdl index 72d578b..77442e6 100644 --- a/dbschema/default.esdl +++ b/dbschema/default.esdl @@ -32,7 +32,7 @@ module default { type Conversation { required name: str; required user: User { - on target delete delete source; + on target delete allow; }; required date: datetime { default := datetime_current(); @@ -54,7 +54,9 @@ module default { required area: Area { on target delete delete source; }; - required conversation: Conversation; + required conversation: Conversation { + on target delete delete source; + }; required date: datetime { default := datetime_current(); } diff --git a/dbschema/migrations/00021-m1uadgx.edgeql b/dbschema/migrations/00021-m1uadgx.edgeql new file mode 100644 index 0000000..6086e8f --- /dev/null +++ b/dbschema/migrations/00021-m1uadgx.edgeql @@ -0,0 +1,14 @@ +CREATE MIGRATION m1uadgxoeuekkwaessyysetg27ov3wcdfmach7cq5k7vvqn6x6zmrq + ONTO m1nsazfltqdfklverxefbbufjwcq5gorhbovfeeugd7q67txrihd2q +{ + ALTER TYPE default::Conversation { + ALTER LINK user { + ON TARGET DELETE ALLOW; + }; + }; + ALTER TYPE default::Message { + ALTER LINK conversation { + ON TARGET DELETE DELETE SOURCE; + }; + }; +}; diff --git a/login.go b/login.go index b27a15f..07d73ee 100644 --- a/login.go +++ b/login.go @@ -32,6 +32,8 @@ func generatePKCE() (string, string) { func handleUiSignIn(c *fiber.Ctx) error { verifier, challenge := generatePKCE() + fmt.Println("Challenge: ", challenge) + c.Cookie(&fiber.Cookie{ Name: "jade-edgedb-pkce-verifier", Value: verifier, @@ -121,6 +123,7 @@ func handleCallback(c *fiber.Ctx) error { verifier := c.Cookies("jade-edgedb-pkce-verifier") if verifier == "" { + fmt.Println("Could not find 'verifier' in the cookie store. Is this the same user agent/browser that started the authorization flow?") return c.Status(fiber.StatusBadRequest).SendString("Could not find 'verifier' in the cookie store. Is this the same user agent/browser that started the authorization flow?") } diff --git a/main.go b/main.go index ca1e114..7022165 100644 --- a/main.go +++ b/main.go @@ -37,11 +37,13 @@ func main() { app.Get("/loadChat", LoadChatHandler) // Chat routes - app.Post("/requestMultipleMessages", RequestMultipleMessages) + app.Post("/requestMultipleMessages", RequestMultipleMessagesHandler) app.Post("/deleteMessage", DeleteMessageHandler) app.Get("/generateMultipleMessages", GenerateMultipleMessages) app.Get("/messageContent", GetMessageContentHandler) app.Get("/editMessageForm", GetEditMessageFormHandler) + app.Post("/redoMessage", RedoMessageHandler) + app.Post("/clearChat", ClearChatHandler) // Settings routes app.Post("/addKeys", addKeys) diff --git a/views/chat.html b/views/chat.html index a99b1f3..038af50 100644 --- a/views/chat.html +++ b/views/chat.html @@ -4,12 +4,20 @@
+ placeholder="Type your message here..." name="message" oninput="toggleSendButton(this)" + id="chat-input-textarea">
+
+ {% if not IsPlaceholder %}
{% for message in Messages %} @@ -50,7 +56,7 @@ {% endfor %} {% endif %} - {% if IsPlaceholder %} + {% elif IsPlaceholder %} diff --git a/views/partials/message-user.html b/views/partials/message-user.html index 70aa646..f75adf2 100644 --- a/views/partials/message-user.html +++ b/views/partials/message-user.html @@ -22,7 +22,15 @@
- + -
diff --git a/views/partials/popover-settings.html b/views/partials/popover-settings.html index 248e25d..d5171c1 100644 --- a/views/partials/popover-settings.html +++ b/views/partials/popover-settings.html @@ -7,13 +7,13 @@