Selection button event now send an htmx request

This commit is contained in:
Adrien Bouvais 2024-06-16 13:44:28 +02:00
parent 5b7c4988d4
commit 99019595a2
4 changed files with 91 additions and 60 deletions

104
Chat.go
View File

@ -18,30 +18,6 @@ func ChatPageHandler(c *fiber.Ctx) error {
return c.Render("chat", fiber.Map{}, "layouts/main")
}
func DeleteMessageHandler(c *fiber.Ctx) error {
messageId := c.FormValue("id")
messageUUID, err := edgedb.ParseUUID(messageId)
if err != nil {
fmt.Println("Error parsing UUID")
panic(err)
}
// Delete all messages
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token")}).Execute(edgeCtx, `
WITH
messageArea := (SELECT Message FILTER .id = <uuid>$0).area
DELETE Area
FILTER .position >= messageArea.position AND .conversation = messageArea.conversation;
`, messageUUID)
if err != nil {
fmt.Println("Error deleting messages")
panic(err)
}
return c.SendString(generateChatHTML(c))
}
func LoadChatHandler(c *fiber.Ctx) error {
deleteLLMtoDelete(c)
@ -531,7 +507,87 @@ func generateLimitReachedChatHTML(c *fiber.Ctx) string {
return htmlString
}
func GetSelectionBtnHandler(c *fiber.Ctx) error {
messageId := c.FormValue("id")
messageUUID, err := edgedb.ParseUUID(messageId)
if err != nil {
fmt.Println("Error parsing UUID")
panic(err)
}
var message Message
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token")}).QuerySingle(edgeCtx, `
SELECT Message {
id,
content,
area : {
id,
position
},
llm : {
modelInfo : {
modelID,
name,
company : {
icon,
}
}
}
}
FILTER .id = <uuid>$0;
`, &message, messageUUID)
if err != nil {
fmt.Println("Error getting message")
panic(err)
}
templateMessage := TemplateMessage{
Icon: message.LLM.Model.Company.Icon,
Content: message.Content,
Hidden: false,
Id: message.ID.String(),
Name: message.LLM.Model.Name,
ModelID: message.LLM.Model.ModelID,
}
outBtn, err := selectBtnTmpl.Execute(map[string]interface{}{
"message": templateMessage,
"ConversationAreaId": message.Area.Position,
})
if err != nil {
fmt.Println("Error generating HTML content")
panic(err)
}
outBtn = strings.ReplaceAll(outBtn, "\n", "")
return c.SendString(outBtn)
}
// Button actions
func DeleteMessageHandler(c *fiber.Ctx) error {
messageId := c.FormValue("id")
messageUUID, err := edgedb.ParseUUID(messageId)
if err != nil {
fmt.Println("Error parsing UUID")
panic(err)
}
// Delete all messages
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token")}).Execute(edgeCtx, `
WITH
messageArea := (SELECT Message FILTER .id = <uuid>$0).area
DELETE Area
FILTER .position >= messageArea.position AND .conversation = messageArea.conversation;
`, messageUUID)
if err != nil {
fmt.Println("Error deleting messages")
panic(err)
}
return c.SendString(generateChatHTML(c))
}
func GetEditMessageFormHandler(c *fiber.Ctx) error {
id := c.FormValue("id")
idUUID, _ := edgedb.ParseUUID(id)

View File

@ -14,7 +14,6 @@ import (
"context"
"encoding/json"
"fmt"
"strings"
"sync"
"time"
@ -199,15 +198,6 @@ func GenerateMultipleMessagesHandler(c *fiber.Ctx) error {
panic(err)
}
templateMessage := TemplateMessage{
Icon: message.LLM.Model.Company.Icon,
Content: message.Content,
Hidden: false,
Id: message.ID.String(),
Name: message.LLM.Model.Name,
ModelID: message.LLM.Model.ModelID,
}
// Check if the context's deadline is exceeded
select {
case <-ctx.Done():
@ -219,16 +209,6 @@ func GenerateMultipleMessagesHandler(c *fiber.Ctx) error {
case firstDone <- idx:
// Generate the HTML content
outBtn, err := selectBtnTmpl.Execute(map[string]interface{}{
"message": templateMessage,
"ConversationAreaId": message.Area.Position,
})
if err != nil {
fmt.Println("Error generating HTML content")
panic(err)
}
outBtn = strings.ReplaceAll(outBtn, "\n", "")
outIcon := `<img src="` + selectedLLMs[idx].Model.Company.Icon + `" alt="User Image" id="selectedIcon-` + fmt.Sprintf("%d", message.Area.Position) + `">`
go func() {
@ -241,7 +221,7 @@ func GenerateMultipleMessagesHandler(c *fiber.Ctx) error {
sendEvent(
user.ID.String(),
"swapSelectionBtn-"+selectedLLMs[idx].ID.String(),
outBtn,
`<hx hx-get="/selectionBtn?id=`+message.ID.String()+`" hx-trigger="load" hx-swap="outerHTML"></hx>`,
)
sendEvent(
user.ID.String(),
@ -250,24 +230,12 @@ func GenerateMultipleMessagesHandler(c *fiber.Ctx) error {
)
}()
default:
out, err := selectBtnTmpl.Execute(map[string]interface{}{
"message": templateMessage,
"ConversationAreaId": message.Area.Position,
})
if err != nil {
fmt.Println("Error generating HTML content")
panic(err)
}
// Replace newline characters to prevent premature termination
outBtn := strings.ReplaceAll(out, "\n", "")
// Send Content event
go func() {
sendEvent(
user.ID.String(),
"swapSelectionBtn-"+selectedLLMs[idx].ID.String(),
outBtn,
`<hx hx-get="/selectionBtn?id=`+message.ID.String()+`" hx-trigger="load" hx-swap="outerHTML"></hx>`,
)
}()
}

View File

@ -46,7 +46,7 @@ func addFireworkMessage(c *fiber.Ctx, llm LLM, selected bool) edgedb.UUID {
fmt.Println("Error fetching user profile")
panic(err)
} else if len(chatCompletion.Choices) == 0 {
fmt.Println("No response from OpenAI")
fmt.Println("No response from Firework")
id := insertBotMessage(c, "No response from Firework", selected, llm.ID)
return id
} else {
@ -119,7 +119,7 @@ func RequestFirework(c *fiber.Ctx, model string, messages []Message, temperature
} filter .company.name = <str>$0 AND .<keys[is Setting].<setting[is User] = global currentUser
)
select filtered_keys.key limit 1
`, &apiKey, "openai")
`, &apiKey, "fireworks")
if err != nil {
return FireworkChatCompletionResponse{}, fmt.Errorf("error getting OpenAI API key: %w", err)
}
@ -176,6 +176,12 @@ func RequestFirework(c *fiber.Ctx, model string, messages []Message, temperature
return FireworkChatCompletionResponse{}, fmt.Errorf("error getting model info: %w", err)
}
if len(chatCompletionResponse.Choices) == 0 {
// Print the response as a JSON string
fmt.Println(string(body))
return FireworkChatCompletionResponse{}, fmt.Errorf("no response from Firework")
}
var inputCost float32 = float32(chatCompletionResponse.Usage.PromptTokens) * usedModelInfo.InputPrice
var outputCost float32 = float32(chatCompletionResponse.Usage.CompletionTokens) * usedModelInfo.OutputPrice
addUsage(c, inputCost, outputCost, chatCompletionResponse.Usage.PromptTokens, chatCompletionResponse.Usage.CompletionTokens, model)

View File

@ -99,6 +99,7 @@ func main() {
app.Get("/userMessage", GetUserMessageHandler)
app.Post("/editMessage", EditMessageHandler)
app.Get("/help", generateHelpChatHandler)
app.Get("/selectionBtn", GetSelectionBtnHandler)
// Settings routes
app.Post("/addKeys", addKeys)