From 642fd8bb52495fc42edcd895855c22e2527bc7c4 Mon Sep 17 00:00:00 2001 From: Adrien Date: Wed, 1 May 2024 17:18:57 +0200 Subject: [PATCH] Multiple model selection working --- Chat.go | 232 +++++++++++++++++++ Request.go | 111 ++++++++++ RequestAnthropic.go | 181 +++++++++++++++ RequestOpenai.go | 117 ++++++---- article/Simplicity.drawio.png | Bin 22224 -> 0 bytes article/Simplicity2.drawio.png | Bin 20688 -> 0 bytes article/Simplicity3.drawio.png | Bin 28005 -> 0 bytes article/article.md | 368 ------------------------------- chatCommands.go | 46 ++++ database.go | 40 ++++ dockerfile | 3 +- go.mod | 5 + go.sum | 11 + main.go | 209 ++---------------- static/icons/bouvai2.png | Bin 0 -> 116678 bytes utils.go | 36 +++ views/chat.html | 27 ++- views/layouts/main.html | 101 +++++++++ views/partials/content-bot.html | 7 + views/partials/message-bot.html | 102 +++++++-- views/partials/message-user.html | 34 +-- views/partials/navbar.html | 1 + views/partials/popover.html | 27 +++ views/welcome.html | 1 - 24 files changed, 1011 insertions(+), 648 deletions(-) create mode 100644 Chat.go create mode 100644 Request.go create mode 100644 RequestAnthropic.go delete mode 100644 article/Simplicity.drawio.png delete mode 100644 article/Simplicity2.drawio.png delete mode 100644 article/Simplicity3.drawio.png delete mode 100644 article/article.md create mode 100644 chatCommands.go create mode 100644 database.go create mode 100644 static/icons/bouvai2.png create mode 100644 utils.go create mode 100644 views/partials/content-bot.html create mode 100644 views/partials/popover.html diff --git a/Chat.go b/Chat.go new file mode 100644 index 0000000..cfd7ec1 --- /dev/null +++ b/Chat.go @@ -0,0 +1,232 @@ +package main + +import ( + "context" + "fmt" + "net/http" + "sort" + "time" + + "github.com/flosch/pongo2" + "github.com/gofiber/fiber/v2" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" +) + +type Message struct { + ID primitive.ObjectID `bson:"_id"` + Content string `bson:"message"` + Role string `bson:"role"` + Date time.Time `bson:"date"` + Model string `bson:"model"` + Selected bool `bson:"selected"` + LinkedMessageIds []string `bson:"linked_message_ids"` +} + +type Conversation struct { + ID string + Messages []Message +} + +func ChatPageHandler(c *fiber.Ctx) error { + return c.Render("chat", fiber.Map{}, "layouts/main") +} + +func LoadModelSelectionHandler(c *fiber.Ctx) error { + CheckedModels := []string{"gpt-3.5-turbo"} // Default model + out, err := popoverTmpl.Execute(pongo2.Context{ + "CompanyInfos": CompanyInfos, + "CheckedModels": CheckedModels, + }) + if err != nil { + c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ + "error": "Error rendering template", + }) + } + return c.SendString(out) +} + +func DeleteMessageHandler(c *fiber.Ctx) error { + messageId := c.FormValue("id") + + // messageId is a string that look like ObjectID("662d6556e5328bbc8357cfb1") + // Get the message from the db and delete it and all messages after it + collection := mongoClient.Database("chat").Collection("messages") + + // Convert the messageId string to a bson.ObjectId + objectID, err := primitive.ObjectIDFromHex(messageId) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{ + "error": "Invalid message ID", + }) + } + + // Find the message with the given ID + message := &Message{} + err = collection.FindOne(c.Context(), bson.M{"_id": objectID}).Decode(message) + if err != nil { + if err == mongo.ErrNoDocuments { + return c.Status(http.StatusNotFound).JSON(fiber.Map{ + "error": "Message not found", + }) + } + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{ + "error": "Error finding message", + }) + } + + // Delete the message and all messages after it + _, err = collection.DeleteMany(c.Context(), bson.M{ + "date": bson.M{"$gte": message.Date}, + }) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{ + "error": "Error deleting messages", + }) + } + + return c.SendString(generateChatHTML()) +} + +func LoadChatHandler(c *fiber.Ctx) error { + return c.SendString(generateChatHTML()) +} + +func ChangeSelectedMessageHandler(c *fiber.Ctx) error { + messageId := c.FormValue("id") + collection := mongoClient.Database("chat").Collection("messages") + objectID, err := primitive.ObjectIDFromHex(messageId) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{ + "error": "Invalid message ID", + }) + } + + var selectedMessage Message + err = collection.FindOne(c.Context(), bson.M{"_id": objectID}).Decode(&selectedMessage) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{ + "error": "Error finding message", + }) + } + + for i := range selectedMessage.LinkedMessageIds { + objectID, _ = primitive.ObjectIDFromHex(selectedMessage.LinkedMessageIds[i]) + _, err = collection.UpdateOne(c.Context(), bson.M{"_id": objectID}, bson.M{"$set": bson.M{"selected": false}}) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{ + "error": "Error updating message", + }) + } + } + + _, err = collection.UpdateOne(c.Context(), bson.M{"_id": objectID}, bson.M{"$set": bson.M{"selected": true}}) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{ + "error": "Error updating message", + }) + } + + return c.SendString(generateChatHTML()) +} + +type NextMessage struct { + Icon string + Content string + Hidden bool + Id string +} + +func generateChatHTML() string { + // Get the messages from the database + collection := mongoClient.Database("chat").Collection("messages") + + // Get all messages + cursor, err := collection.Find(context.TODO(), bson.D{}) + if err != nil { + fmt.Println(err) + } + + // Convert the cursor to an array of messages + var Messages []Message + if err = cursor.All(context.TODO(), &Messages); err != nil { + fmt.Println(err) + } + + htmlString := "
" + + var NextMessages []NextMessage // Use the custom NextMessage struct + + for i, message := range Messages { + if message.Role == "user" { + htmlContent := markdownToHTML(message.Content) + userOut, err := userTmpl.Execute(pongo2.Context{"Content": htmlContent, "ID": message.ID.Hex()}) + if err != nil { + panic(err) + } + htmlString += userOut + // Reset NextMessages when a user message is encountered + NextMessages = []NextMessage{} + } else { + fmt.Println(i) + // For bot messages, add them to NextMessages with only the needed fields + nextMsg := NextMessage{ + Icon: model2Icon(message.Model), // Assuming Icon is a field you want to include from Message + Content: markdownToHTML(message.Content), + Hidden: !message.Selected, // Assuming Hidden is a field you want to include from Message + Id: message.ID.Hex(), + } + NextMessages = append(NextMessages, nextMsg) + + // Check if the next message is not a bot or if it's the last message + if i+1 == len(Messages) || Messages[i+1].Role != "bot" { + sort.Slice(NextMessages, func(i, j int) bool { + if !NextMessages[i].Hidden && NextMessages[j].Hidden { + return true + } + if NextMessages[i].Hidden && !NextMessages[j].Hidden { + return false + } + return true + }) + + botOut, err := botTmpl.Execute(pongo2.Context{"Messages": NextMessages, "ConversationAreaId": i}) + if err != nil { + panic(err) + } + htmlString += botOut + htmlString += "
" + } + } + } + + htmlString += "
" + + // Render the HTML template with the messages + return htmlString +} + +func GetMessageContentHandler(c *fiber.Ctx) error { + messageId := c.FormValue("id") + fmt.Println(messageId) + collection := mongoClient.Database("chat").Collection("messages") + objectID, err := primitive.ObjectIDFromHex(messageId) + if err != nil { + return c.Status(http.StatusBadRequest).JSON(fiber.Map{ + "error": "Invalid message ID", + }) + } + + var selectedMessage Message + err = collection.FindOne(c.Context(), bson.M{"_id": objectID}).Decode(&selectedMessage) + if err != nil { + return c.Status(http.StatusInternalServerError).JSON(fiber.Map{ + "error": "Error finding message", + }) + } + + fmt.Println(selectedMessage) + + return c.SendString(selectedMessage.Content) +} diff --git a/Request.go b/Request.go new file mode 100644 index 0000000..64c67ec --- /dev/null +++ b/Request.go @@ -0,0 +1,111 @@ +package main + +import ( + "context" + "sync" + "time" + + "github.com/flosch/pongo2" + "github.com/gofiber/fiber/v2" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" +) + +type ModelInfo struct { + ID string + Name string + Icon string + MaxToken int + InputPrice float64 + OutputPrice float64 +} + +type CompanyInfo struct { + ID string + Name string + Icon string + ModelInfos []ModelInfo +} + +var CompanyInfos []CompanyInfo + +type MultipleModelsCompletionRequest struct { + ModelIds []string + Messages []Message + Message string +} + +type BotContentMessage struct { + Content string + Hidden bool +} + +var lastSelectedModelIds []string + +func GenerateMultipleMessages(c *fiber.Ctx) error { + // Create a wait group to synchronize the goroutines + var wg sync.WaitGroup + var InsertedIDs []string + + // Add the length of lastSelectedModelIds goroutines to the wait group + wg.Add(len(lastSelectedModelIds)) + + for i := range lastSelectedModelIds { + if model2Icon(lastSelectedModelIds[i]) == "openai" { + go func() { + defer wg.Done() + response := addOpenaiMessage(lastSelectedModelIds[i], i == 0) + InsertedIDs = append(InsertedIDs, response) + }() + } else if model2Icon(lastSelectedModelIds[i]) == "anthropic" { + go func() { + defer wg.Done() + response := addAnthropicMessage(lastSelectedModelIds[i], i == 0) + InsertedIDs = append(InsertedIDs, response) + }() + } + } + + // Wait for both goroutines to finish + wg.Wait() + + collection := mongoClient.Database("chat").Collection("messages") + for i := range InsertedIDs { + objectID, _ := primitive.ObjectIDFromHex(InsertedIDs[i]) + collection.UpdateOne(context.Background(), bson.M{"_id": objectID}, bson.M{"$set": bson.M{"linked_message_ids": InsertedIDs}}) + } + + 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) + } + + collection := mongoClient.Database("chat").Collection("messages") + result, _ := collection.InsertOne(context.Background(), bson.M{"message": message, "role": "user", "date": time.Now()}) + + 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) + } + } + } + lastSelectedModelIds = selectedModelIds + + out := "" + + HexID := result.InsertedID.(primitive.ObjectID).Hex() + messageOut, _ := userTmpl.Execute(pongo2.Context{"Content": message, "ID": HexID}) + out += messageOut + + messageOut, _ = botTmpl.Execute(pongo2.Context{"IsPlaceholder": true, "SelectedModelIds": selectedModelIds, "Message": message}) + out += messageOut + + return c.SendString(out) +} diff --git a/RequestAnthropic.go b/RequestAnthropic.go new file mode 100644 index 0000000..eeb19ce --- /dev/null +++ b/RequestAnthropic.go @@ -0,0 +1,181 @@ +package main + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" +) + +type AnthropicChatCompletionRequest struct { + Model string `json:"model"` + Messages []AnthropicMessage `json:"messages"` + MaxTokens int `json:"max_tokens"` + Temperature float64 `json:"temperature"` +} + +type AnthropicMessage struct { + Role string `json:"role"` + Content string `json:"content"` +} + +type AnthropicChatCompletionResponse struct { + ID string `json:"id"` + Content []AnthropicContentItem `json:"content"` + Model string `json:"model"` + StopReason string `json:"stop_reason"` + StopSequence string `json:"stop_sequence"` + Usage AnthropicUsage `json:"usage"` +} + +type AnthropicContentItem struct { + Text string `json:"text"` +} + +type AnthropicUsage struct { + InputTokens int `json:"input_tokens"` + OutputTokens int `json:"output_tokens"` +} + +func init() { + var ModelInfosList = []ModelInfo{} + + modelInfo := ModelInfo{ + ID: "claude-3-haiku-20240307", + Name: "Haiku", + Icon: "anthropic", + MaxToken: 8192, + InputPrice: 0.50 / 1000000, + OutputPrice: 1.50 / 1000000, + } + ModelInfosList = append(ModelInfosList, modelInfo) + + modelInfo = ModelInfo{ + ID: "claude-3-sonnet-20240229", + Name: "Sonnet", + Icon: "anthropic", + MaxToken: 8192, + InputPrice: 0.50 / 1000000, + OutputPrice: 1.50 / 1000000, + } + ModelInfosList = append(ModelInfosList, modelInfo) + + modelInfo = ModelInfo{ + ID: "claude-3-opus-20240229", + Name: "Opus", + Icon: "anthropic", + MaxToken: 8192, + InputPrice: 0.50 / 1000000, + OutputPrice: 1.50 / 1000000, + } + ModelInfosList = append(ModelInfosList, modelInfo) + + companyInfo := CompanyInfo{ + ID: "anthropic", + Name: "Anthropic", + ModelInfos: ModelInfosList, + } + CompanyInfos = append(CompanyInfos, companyInfo) +} + +func addAnthropicMessage(modelID string, selected bool) string { + Messages := getAllMessages() + + chatCompletion, err := RequestAnthropic(modelID, Messages, 2048, 0.7) // TODO CHange parameters + if err != nil { + // Print error + fmt.Println("Error:", err) + } else if len(chatCompletion.Content) == 0 { + fmt.Println(chatCompletion) + fmt.Println("No response from Anthropic") + collection := mongoClient.Database("chat").Collection("messages") + response, err := collection.InsertOne(context.Background(), bson.M{"message": "no response", "role": "bot", "date": time.Now(), "model": modelID, "selected": selected}) + if err != nil { + fmt.Println(err) + } + return response.InsertedID.(primitive.ObjectID).Hex() + } else { + Content := chatCompletion.Content[0].Text + collection := mongoClient.Database("chat").Collection("messages") + response, err := collection.InsertOne(context.Background(), bson.M{"message": Content, "role": "bot", "date": time.Now(), "model": modelID, "selected": selected}) + if err != nil { + fmt.Println(err) + } + return response.InsertedID.(primitive.ObjectID).Hex() + } + return "" +} + +func Messages2AnthropicMessages(messages []Message) []AnthropicMessage { + AnthropicMessages := make([]AnthropicMessage, len(messages)) + for i, msg := range messages { + var role string + switch msg.Role { + case "user": + role = "user" + case "bot": + role = "assistant" + default: + role = "system" + } + AnthropicMessages[i] = AnthropicMessage{ + Role: role, + Content: msg.Content, + } + } + return AnthropicMessages +} + +func RequestAnthropic(model string, messages []Message, maxTokens int, temperature float64) (AnthropicChatCompletionResponse, error) { + apiKey := "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" // TODO Use env variable + url := "https://api.anthropic.com/v1/messages" + + AnthropicMessages := Messages2AnthropicMessages(messages) + + requestBody := AnthropicChatCompletionRequest{ + Model: model, + Messages: AnthropicMessages, + MaxTokens: maxTokens, + Temperature: temperature, + } + + jsonBody, err := json.Marshal(requestBody) + if err != nil { + return AnthropicChatCompletionResponse{}, fmt.Errorf("error marshaling JSON: %w", err) + } + + req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonBody)) + if err != nil { + return AnthropicChatCompletionResponse{}, fmt.Errorf("error creating request: %w", err) + } + + req.Header.Set("content-Type", "application/json") + req.Header.Set("anthropic-version", "2023-06-01") + req.Header.Set("x-api-key", apiKey) + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return AnthropicChatCompletionResponse{}, fmt.Errorf("error sending request: %w", err) + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return AnthropicChatCompletionResponse{}, fmt.Errorf("error reading response body: %w", err) + } + + var chatCompletionResponse AnthropicChatCompletionResponse + err = json.Unmarshal(body, &chatCompletionResponse) + if err != nil { + return AnthropicChatCompletionResponse{}, fmt.Errorf("error unmarshaling JSON: %w", err) + } + + return chatCompletionResponse, nil +} diff --git a/RequestOpenai.go b/RequestOpenai.go index 1652ae5..b0cf56c 100644 --- a/RequestOpenai.go +++ b/RequestOpenai.go @@ -9,17 +9,11 @@ import ( "net/http" "time" - "github.com/flosch/pongo2" - "github.com/gofiber/fiber/v2" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" ) -type dataForTemplate struct { - Message OpenaiMessage -} - -type ChatCompletionRequest struct { +type OpenaiChatCompletionRequest struct { Model string `json:"model"` Messages []OpenaiMessage `json:"messages"` Temperature float64 `json:"temperature"` @@ -30,7 +24,7 @@ type OpenaiMessage struct { Content string `json:"content"` } -type ChatCompletionResponse struct { +type OpenaiChatCompletionResponse struct { ID string `json:"id"` Object string `json:"object"` Created int64 `json:"created"` @@ -51,56 +45,93 @@ type OpenaiChoice struct { Index int `json:"index"` } -var lastMessageAsked string // TODO Remove this +func init() { + var ModelInfosList = []ModelInfo{} -func addOpenaiMessage(c *fiber.Ctx) error { - message := lastMessageAsked // TODO Remove this - - chatCompletion, err := RequestOpenai("gpt-3.5-turbo", []Message{{Content: message, Role: "user", Date: time.Now(), ID: primitive.NilObjectID}}, 0.7) - if err != nil { - // Print error - fmt.Println("Error:", err) - return err - } else if len(chatCompletion.Choices) == 0 { - fmt.Println("No response from OpenAI") - return err + modelInfo := ModelInfo{ + ID: "gpt-3.5-turbo", + Name: "GPT-3.5", + Icon: "openai", + MaxToken: 4096, + InputPrice: 0.50 / 1000000, + OutputPrice: 1.50 / 1000000, } + ModelInfosList = append(ModelInfosList, modelInfo) - Content := chatCompletion.Choices[0].Message.Content - out, err := botTmpl.Execute(pongo2.Context{"Content": Content}) - if err != nil { - panic(err) + modelInfo = ModelInfo{ + ID: "gpt-4-turbo", + Name: "GPT-4", + Icon: "openai", + MaxToken: 8192, + InputPrice: 10.00 / 1000000, + OutputPrice: 30.00 / 1000000, } + ModelInfosList = append(ModelInfosList, modelInfo) - collection := mongoClient.Database("chat").Collection("messages") - collection.InsertOne(context.Background(), bson.M{"message": Content, "role": "bot", "date": time.Now()}) - - return c.SendString(out) + companyInfo := CompanyInfo{ + ID: "openai", + Name: "OpenAI", + Icon: "icons/openai.png", + ModelInfos: ModelInfosList, + } + CompanyInfos = append(CompanyInfos, companyInfo) } -func Message2OpenaiMessage(message Message) OpenaiMessage { - return OpenaiMessage{ - Role: message.Role, - Content: message.Content, +func addOpenaiMessage(modelID string, selected bool) string { + Messages := getAllMessages() + + chatCompletion, err := RequestOpenai(modelID, Messages, 0.7) + if err != nil { + fmt.Println("Error:", err) + } else if len(chatCompletion.Choices) == 0 { + fmt.Println(chatCompletion) + fmt.Println("No response from OpenAI") + collection := mongoClient.Database("chat").Collection("messages") + response, err := collection.InsertOne(context.Background(), bson.M{"message": "no response", "role": "bot", "date": time.Now(), "model": modelID, "selected": selected}) + if err != nil { + fmt.Println(err) + } + return response.InsertedID.(primitive.ObjectID).Hex() + } else { + Content := chatCompletion.Choices[0].Message.Content + collection := mongoClient.Database("chat").Collection("messages") + response, err := collection.InsertOne(context.Background(), bson.M{"message": Content, "role": "bot", "date": time.Now(), "model": modelID, "selected": selected}) + if err != nil { + fmt.Println(err) + } + return response.InsertedID.(primitive.ObjectID).Hex() } + return "" } func Messages2OpenaiMessages(messages []Message) []OpenaiMessage { - var openaiMessages []OpenaiMessage - for _, message := range messages { - openaiMessages = append(openaiMessages, Message2OpenaiMessage(message)) + openaiMessages := make([]OpenaiMessage, len(messages)) + for i, msg := range messages { + var role string + switch msg.Role { + case "user": + role = "user" + case "bot": + role = "assistant" + default: + role = "system" + } + openaiMessages[i] = OpenaiMessage{ + Role: role, + Content: msg.Content, + } } return openaiMessages } -func RequestOpenai(model string, messages []Message, temperature float64) (ChatCompletionResponse, error) { +func RequestOpenai(model string, messages []Message, temperature float64) (OpenaiChatCompletionResponse, error) { apiKey := "sk-proj-f7StCvXCtcmiOOayiVmgT3BlbkFJlVtAcOo3JcrnGq1cPa5o" // TODO Use env variable url := "https://api.openai.com/v1/chat/completions" // Convert messages to OpenAI format openaiMessages := Messages2OpenaiMessages(messages) - requestBody := ChatCompletionRequest{ + requestBody := OpenaiChatCompletionRequest{ Model: model, Messages: openaiMessages, Temperature: temperature, @@ -108,12 +139,12 @@ func RequestOpenai(model string, messages []Message, temperature float64) (ChatC jsonBody, err := json.Marshal(requestBody) if err != nil { - return ChatCompletionResponse{}, fmt.Errorf("error marshaling JSON: %w", err) + return OpenaiChatCompletionResponse{}, fmt.Errorf("error marshaling JSON: %w", err) } req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonBody)) if err != nil { - return ChatCompletionResponse{}, fmt.Errorf("error creating request: %w", err) + return OpenaiChatCompletionResponse{}, fmt.Errorf("error creating request: %w", err) } req.Header.Set("Content-Type", "application/json") @@ -122,19 +153,19 @@ func RequestOpenai(model string, messages []Message, temperature float64) (ChatC client := &http.Client{} resp, err := client.Do(req) if err != nil { - return ChatCompletionResponse{}, fmt.Errorf("error sending request: %w", err) + return OpenaiChatCompletionResponse{}, fmt.Errorf("error sending request: %w", err) } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { - return ChatCompletionResponse{}, fmt.Errorf("error reading response body: %w", err) + return OpenaiChatCompletionResponse{}, fmt.Errorf("error reading response body: %w", err) } - var chatCompletionResponse ChatCompletionResponse + var chatCompletionResponse OpenaiChatCompletionResponse err = json.Unmarshal(body, &chatCompletionResponse) if err != nil { - return ChatCompletionResponse{}, fmt.Errorf("error unmarshaling JSON: %w", err) + return OpenaiChatCompletionResponse{}, fmt.Errorf("error unmarshaling JSON: %w", err) } return chatCompletionResponse, nil diff --git a/article/Simplicity.drawio.png b/article/Simplicity.drawio.png deleted file mode 100644 index 55ed97c22c5333c7d2d73cb2a1d0fb9681f5de9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22224 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 Vrtpph{1>$l83_gPLQ#Fc{|BGueO>?n diff --git a/article/Simplicity2.drawio.png b/article/Simplicity2.drawio.png deleted file mode 100644 index 7dec4697579683d360deb9d5335f3b9a493fb736..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20688 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%0AoV_@1 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 diff --git a/article/article.md b/article/article.md deleted file mode 100644 index 3ace3b0..0000000 --- a/article/article.md +++ /dev/null @@ -1,368 +0,0 @@ -# Hyper PyFleX - -Thx to https://hypermedia.systems/ for the book. -Really nice. - -## Me -No web dev before -Like coding, AI, casual geek -Was a full python dev, never really touched anything else -Wanted to do SaaS, like software -Didn't do CS, did Thermal and Energy Engineering -First wanted to become data scientist then engineer then software dev then full stack dev. Guess I want to do everything so full stack make sense - -## Intro -Don't wanted to learn JS so search and found HTMX, was a revelation. I couldn't understand why everybody use JS client if this is available. I mean to do for some highly performant software. But I use python as a backend so, yeah. I have the phylosiphie of simplicity. SOmething simple is something durable, reparaible, upgradable, understadable, ect. - -Call me crazy but I don't comment my code, or few. I do more docs than comments. Why ? Because my code need to be my comment. I need to be able to understand what this code do by looking at it. Simplicity is readable, understable. So I can upgrade it or repaire it, ect. I guess because I didn't do a CS degree, I don't have strong beleive in comment or stuff said at school. - -So when I saw some JS code and started to do some basic stuff using chatGPT to give me a script that add a row to a table. I made it work, my app was pretty good, not a lot JS. But WHAT A PAIN IN THE ASS. And look at this shit! How ugly it is. I can't read it. I mean I know, I need to learn JS, code, blablabla to understand it like I understand python, blablabla. I KNOW, I don't WANT to lear JS. Ear me out, I am not saying that JS is bad at all, I'm sure it's great, but I don't WANT to know, I want to stick with what I know, my beloved python and my easy pandas, numpy and stuff. Web dev suck rn because of that in my opinion, you need to learn JS, and not small Java, did you see the size of Java client for some basic stuff ? Crazy !!! JS is the popular because you are force to use this shit. Anyway, no djugi here right ? - -Anyway, I did the first version of my app using streamlit. Streamlit, if you don't know, it's great, it's easy, it's python. I know, I know, I'm biais, bite me. I did a really great app with it, I wouln't be ashame to share it as if and try to sell it. Specially if I needed to learn JS lol, no way, prefer stick to streamlit than learning JS. That's why thx god HTMX. So for this first version, I used mongoDB as a DB, and I like it. I first took it for the vector seach, that I used it in the v1! But removed to focus on the chat, but I had a all library, import doc, semantic search and shit. And I was already a bit using the idea of HTMX in some way. - -All data was in mongoDB, and nothing store locally, everytime I reload the script I get the data from mongo and display the messages. Some peoples would tell me "but that useless and you use databse cpu, you should add the message to the db and update a list of message in your client app and then trigger an event on just the chat to blablabla" Well no, I'm not doing that. I keep it simple. And it was the best idea. At first I was worry "it's stupid, it will broke so fast". But guess what, quite the oposite. In fact it was so easy to add features !!! For example I want to add a message to the conversation, well I add it to the db and reload the script, that's it. So I can do it from anywere, at anytime, whithout breaking anything. Noting in the style of "but this small thing need to be change because of this special scenario because I am in this part of the app and not here, blablabla" Nothing, Easy. Yes I end up doing client -> server -> db -> server -> client - -So HTMX feeled a bit similare. Instead of Client + Server, it is Server + Screen. No client, that is the core idea of Hyper PyFleX. Easy, no JS, no client/server shit. -And the beauty is that Hyper PyFleX is obviously all about HTMX. So you can do like Hyper GinX for Go + Gin + HTMX or Hyper RailX, ect -The Hyper in all of them is for Hypermedia in HTML, whick is the heart of how internet and webbrowser work and mostly display and organise things. (Recommand https://hypermedia.systems/) TODO ADD the acrynyme from the books -Another huhg advantages of using HTMX instead of JS is that you can use all HTML library, like alpine.js, ect. - -The core idea being that the server send all the browser need to know t odisplay the app. It doesn't need to understand what the app is or do, all of that is either in the HTML, in our head or in the server. -When I click on a button to remove something, the client don't understand that I want to remove something. It just understand that I want to change this part. And if the change happend to be an empty HTML, well it's been "removed". -Compare to the API phylosophy where the server send just the data, but then the server need a function that understand and interpret the data. - -For example I want to display a username and an email. If my API send this: -```html -

Adrien

-

adrien.bouvais@blabla.com

-``` -In this response, there is everything the browser need to know to display. The name is an header and above the mail, ect. I can update, put the email next to the name, ect. - -Now let's see the current approche. Usuqlly server send JSON to the client and then the client need to do stuff. -```json -{ - "name" : "Adrien", - "email" : "adrien.bouvais@blabla.com" -} -``` - -But with that, you don't know how to display it. You need a new JS function to pass from one to another. - -Why ? I already did the logic server side of getting the data, ect. Why do I need to split some part in JS and do some shit twice ? - -## part 0 - table - -At my work, I was task to implement an app. The app is pretty simple. You have a table that is a list of test done on a database. You can see the number of errors. For each test there is a button to see the detail. - -To understand here a test example: I have a list of client, I check if any have more than 5 addresses. If so, when I click on the +, I get a new table that list all client with more than 5 addresses. And there is multiple test like that. -Pretty simple right ? Well no, obviously. - -Man, I stuggeled so hard to just add one + button for the details. And then if I do that, it change that, and that and blablabla and it lag and it's not center. God damm, that why I don't wanted JS, I don't know JS. I did a script to exclude a row of the second table and it would react... What a mistake, I think I touched the ultimate use case here, how easy it is in HTMX compare to the other way is just incridible. -And now the ultimate roast for JS. Yes JS on client side is in theory more efficient... in theory. But I don't know what I'm am doing here! chatGPT gave me this and it work but god, I use it for python and sometime it give me somecrazy shit. Just to say that it is if you know what you are doing. Way better to stick to the language you know, here you can do someting opti, here you understand. - -Let's go into a bit of code. So I have my Flask app running (I use Flask for my work) -```python -from flask import Flask, render_template, request - -app = Flask(__name__) - -@app.route('/') -def index(): - return render_template('demo1.html') - -if __name__ == '__main__': - app.run(debug=True) -``` - -That look like that: -TODO Add image demo1 - -Easy enough. A list and a form with 2 input and a button. - -Obviously I want to do 2 things, be able to add row and delete it. With JS, a bit of a pain in the ass. I know that some people will come with "just import react and react a React component then link it to the react hook to auto react to action of the user react blablabla". But let's ee how HTMX would to it. First the table itself: -```html - - - - - - - - - - - - - - - - - - - - -
NameAge
John20
Jane21
-``` - -So a table with a header, 2 columns and then a body and 2 rows. Now I want the button to remove the row. -First I will add it `hx-get="/demo1/delete"`. It mean *if the button is click, run this and use what it return*. What it return is ALWAYS an HTML. -Then `hx-swap="outerHTML"` it mean *replace the old HTML with the new one*. -And to finish `hx-target="closest tr"` it mean *do the change on this*. In this case the closest tr is the parent parent of the button, or the row the button is currently in. -With all change, we got: -```html - - - - - - - - - - - - - - - - - - - - -
NameAge
John20
Jane21
-``` - -No we just need to implement the route `/demo1/delete`. Well easy, it is supose to return the new HTML of a delete row... Meaning nothing, the funtion need to return nothing. -```python -@app.route('/demo1/delete', methods=['GET']) -def demo1_delete(): - return '' -``` - -That's it! Ofc, at this point, you should do some server stuff. Meaning update the database ect. I don't do that here, I just show the interactivity, so if I reload the page, all changes are lost. - -ANd the button work, if I click I instently remove it. It REACT! It's ALIVE and JSless! -Surely the form to add data isn't that simple... -```html -

- - - -
-``` - -Yes, that's it. If I click on Submit, I instantly get a new row! - -Let's see what it do. So like before `hx-post` will issue a request to the server, a POST this time. -`hx-swap="beforeend"` mean *appends the content after the last child inside the target*. So after the last row of the table (can also be `afterbegin` to append at the beginning of the table) -`hx-target="#table_body"` is the `tbody` of the table above. -Let's see `/demo1/add`: -```python -@app.route('/demo1/add', methods=['POST']) -def demo1(): - name = request.form['name'] - age = request.form['age'] - if name and age: - return f"{name}{age}" - return '' -``` - -The function return the HTML of a new row. ANd because I say to add it after the last child of the `tbody`, it add a row to the table. - -And that's it for this first demo/intro. We were able to do some crazy stuff in very few line. I highly recommand reading the HTMX doc in the future to check all availables features. - -I was able to learn and do the app it few days while doing other stuff and managing issue on the dev virtual machine. -The shit was really impressive, and my boss is really similare to me in the way he don"t want to learn JS. He was really impressed. - -So after that, I was convinced. Let's do JADE 2.0 using HTMX. - -## Why GO ? - -After doing a really simple chat where I can write and it answer in like 1-2h. I realease my python code is simple asf. -I also realise how I want my app to work and it's simple. remember simplicity boys!!! - -So how it work. Every time I do something in the chat. I recreate it. -Let's take an example, I want to add a message to the chat: -User trigger and send form with message content --> Server get form content and add a message to the database --> Run main generateChatHTML (Read DB -> Generate HTML) -> Send to the client to update just the chat - -The goal is once again simplicity. All data are at one place, the database, where it bellow. If I need it, I read the database. There is no buffer, no global messages array that keep track of mesages in GO, and not at all in both in GO and in JS on the client. Then I need to be sure that they are identical, too much trubble, why would I do that ? -Idk how stupid it is to use this for big app in prod, but worse case you can do a compose and add a mongodb buffer and only receive once and save once when leaving. - -So here a simple diagramm to understand: - -![alt text](Simplicity.drawio.png) - -Compare to the more traditional approche: - -![alt text](Simplicity2.drawio.png) - -Or even worse, with JS - -![alt text](Simplicity3.drawio.png) - -Yep, this is how I see it. WTF is wrong with you peoples? 3 loops ????? 3???? I meqn 2 OOOKKK, I guesssssssss. But 3???? -So If I want to update something in my app, I first need to process the data in JS and updatte what need to be in the JS client then send only the necessarry data through an API in a specific format and have a specific function that receive this specific data and do some stuff on the server, change some stuff and then send the data to the database. Ok we update one thing! -Don't get me wrong, I see the point of using JS. This is not a loop, the data never comeback from the databse to the client! The server never send anything. Meaning it never do the server to client part that HTMX do. So you do transfert more data for similare optimization level for the same thing but, is it better optimizing that if I get a 500mb RAM client ? Depend the app, no in a lot of scenario I beleive. - -Note that in the first one, there is 2 data box. Meaning 2 "states of data". This is the key difference. In the second one, the server is responsible for keeping track of the data as it stay inside it and just send the necessary data to the databse. It is efficient, that is for sure, but the server AND the databse need to keep track of the same thing, that is redondant. - -So after chossing to go with this design, as it is basically the same logic I use in streamlit with st.rerun(). I needed a server efficient, powerful and fast !!! - -*Process to look at python code* - -Yeah..... -I like you python ,that is for sure. But maybe I need someone else on this job. So I alredy had some eyes on GO and was looking for a good project to use it. I saw other framework and language like Rust, ect. I was thinking about mojo at some point, but it is not mature enough at this point. But could of been a good use case for it. - -So GO it is, I did the good old google "Go web framwork" and found a good list, tested with Gin then went with Fiber for the SPEEDDDDDDDDDDDDDDDDDDDDDDDDD!!!!!!!!! YOOOOOOOOOOOLLLLLLLOOOOOOOO!!!!!!!! - -No seriously, had to chose, looked really similare. Tryed Fiber and found it easy to use and powerful so went with it. - -## Used teck -So here my full teck stack -- GO with Fiber -- HTMX -- MongoDB -- Bulma - -Done - -## part 1 - The chat - -Ok so as a first thing is a chat. What I need is: -- Text input at the bottom of the screen -- Avatar and message bubble - -Should be easy right ? Hopefully with HTMX yes. Let's try... - -Well it do was pretty easy. I first did a base.html and then added an navbar and a page.html a bit like that: -```html -{% extends 'base.html' %} - -{% block content %} -
-
-
-
- -
- -
- - - -{% endblock %} -``` - -So in this HTML, I have a columns with one column empty for now and a form with an input. I also created a small style so the text are on the right or left of the colum depending of if user of bot and that's it. - -Now in this HTML, I use HTMX at 2 places, the column and the form. Let's take a look at the column first: -- `hx-trigger="load"` mean *when the page load* -- `hx-get="/chat/messages"` *get the HTML here* -- `hx-swap="outerHTML"` *to replace yourself with the response* - -The HTML at /chat/messages look like: -```html -
- {% for message in messages %} - {% if message.Role == 'user' %} -
-
-

User

-
- - -
-
-
- {{ message.Content }} -
-
- {% else %} -
-
-

Bot

-
- - -
-
-
- {{ message.Content }} -
-
- {% endif %} - {% endfor %} -
-``` - -So it create itself back with `
` and then do a for loop on the messages that I extracted from the Database on the server side. - -Now let's take a look at the `form`: -- `hx-posts="/chat"` mean *get the HTML here* -- `hx-swap="outerHTML"` *to replace* -- `hx-target="#messages"` *this with the response* - -The server function at POST /chat will add the message in the databse then return the same as /chat/messages. So if you understand, the function at /chat/messages is the second "Server" box on my diagram. And it's always the same function. Once again simplicity. Out of 4 boxs, only one change basically, the first "Server". Meaning the function that change the database. - -And yeah, that's it. A bit of backend but just this: -```go -func addMessageHandler(c *fiber.Ctx) error { - message := c.FormValue("message") - - collection := mongoClient.Database("chat").Collection("messages") - collection.InsertOne(context.Background(), bson.M{"message": message, "role": "user", "date": time.Now()}) - collection.InsertOne(context.Background(), bson.M{"message": "I did something!", "role": "bot", "date": time.Now()}) - - return generateChatHTML(c) -} - -func generateChatHTML(c *fiber.Ctx) error { - collection := mongoClient.Database("chat").Collection("messages") - - // Get all messages - cursor, _ := collection.Find(context.TODO(), bson.D{}) - - // Convert the cursor to an array of messages - var messages []Message - if err = cursor.All(context.TODO(), &messages); err != nil { - return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ - "error": "Failed to convert cursor to array", - }) - } - - // Render the HTML template with the messages - return c.Render("chat/messages", fiber.Map{ - "messages": messages, - }) -} -``` - -And that' it! The chat work like that! Obviously I need to add the model api stuff with it but otherwise... done. I just did an ineractive chat in what ? 100 lines of codes ? And in an easy to understand, share and maintain way ? Isn't it beautifull? - -## part 2 - The API - -Ok so now that we have a chat. I need to be able to communicate with the different API. I'm a bit affray on this one, I hope I don't NEED to use python. Now that I think about, I always used the OpenAI Client, because easy to use. Let's see if I can talk with OpeanAI server through Go first... - - - -# Conclusion -- Say a lot about JS during the article. JS is great, I guess, I didn't try. Every language have strenght weakness, blablabla. The point is that it shouln't be a necessity to learn it. And it shouldn't be so difficult to do basic stuff. \ No newline at end of file diff --git a/chatCommands.go b/chatCommands.go new file mode 100644 index 0000000..0363338 --- /dev/null +++ b/chatCommands.go @@ -0,0 +1,46 @@ +package main + +import ( + "net/http" + + "github.com/gofiber/fiber/v2" + "go.mongodb.org/mongo-driver/bson" +) + +type Command struct { + Name string + Trigger string + Handler func(c *fiber.Ctx) string +} + +var Commands []Command + +func init() { + Commands = []Command{ + { + Name: "Clear", + Trigger: "clear", + Handler: ClearCommandHandler, + }, + } +} + +func ClearCommandHandler(c *fiber.Ctx) string { + collection := mongoClient.Database("chat").Collection("messages") + _, err := collection.DeleteMany(c.Context(), bson.D{}) + if err != nil { + c.Status(http.StatusInternalServerError).JSON(fiber.Map{ + "error": "Failed to clear messages", + }) + } + return "" +} + +func DetectCommand(message string, c *fiber.Ctx) (string, bool) { + for _, command := range Commands { + if command.Trigger == message { + return command.Handler(c), true + } + } + return "", false // No command detected +} diff --git a/database.go b/database.go new file mode 100644 index 0000000..841d48f --- /dev/null +++ b/database.go @@ -0,0 +1,40 @@ +package main + +import ( + "context" + "fmt" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +var mongoClient *mongo.Client + +func init() { + serverAPI := options.ServerAPI(options.ServerAPIVersion1) + opts := options.Client().ApplyURI("mongodb://localhost:27017").SetServerAPIOptions(serverAPI) + client, err := mongo.Connect(context.TODO(), opts) + if err != nil { + panic(err) + } + mongoClient = client + + if err := mongoClient.Ping(context.TODO(), nil); err != nil { + panic(err) + } +} + +func getAllMessages() []Message { + collection := mongoClient.Database("chat").Collection("messages") + cursor, err := collection.Find(context.TODO(), bson.D{}) + if err != nil { + fmt.Println(err) + } + + var Messages []Message + if err = cursor.All(context.TODO(), &Messages); err != nil { + fmt.Println(err) + } + return Messages +} diff --git a/dockerfile b/dockerfile index b54d01c..b457dac 100644 --- a/dockerfile +++ b/dockerfile @@ -27,7 +27,8 @@ WORKDIR / # Copy our static executable. COPY --from=builder /go/main /go/main -COPY templates /go/templates +COPY views /go/views +COPY static /go/static ENV PORT 8080 ENV GIN_MODE release diff --git a/go.mod b/go.mod index 1a25dfa..466800e 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/MrBounty/JADE2.0 go 1.22.2 require ( + github.com/alecthomas/chroma v0.10.0 // indirect github.com/andybalholm/brotli v1.0.5 // indirect github.com/bytedance/sonic v1.11.5 // indirect github.com/bytedance/sonic/loader v0.1.1 // indirect @@ -10,6 +11,7 @@ require ( github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect github.com/cloudwego/base64x v0.1.3 // indirect github.com/cloudwego/iasm v0.2.0 // indirect + github.com/dlclark/regexp2 v1.4.0 // indirect github.com/edgedb/edgedb-go v0.17.1 // indirect github.com/flosch/pongo2 v0.0.0-20200913210552-0d938eb266f3 // indirect github.com/flosch/pongo2/v6 v6.0.0 // indirect @@ -26,6 +28,7 @@ require ( github.com/gofiber/template/html/v2 v2.1.1 // indirect github.com/gofiber/utils v1.1.0 // indirect github.com/golang/snappy v0.0.1 // indirect + github.com/gomarkdown/markdown v0.0.0-20240419095408-642f0ee99ae2 // indirect github.com/google/uuid v1.5.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.17.0 // indirect @@ -51,6 +54,8 @@ require ( github.com/xdg/scram v1.0.5 // indirect github.com/xdg/stringprep v1.0.3 // indirect github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect + github.com/yuin/goldmark v1.7.1 // indirect + github.com/yuin/goldmark-highlighting v0.0.0-20220208100518-594be1970594 // indirect go.mongodb.org/mongo-driver v1.15.0 // indirect golang.org/x/arch v0.7.0 // indirect golang.org/x/crypto v0.22.0 // indirect diff --git a/go.sum b/go.sum index 35b486c..f8b2195 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek= +github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s= github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= @@ -20,6 +22,8 @@ github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= +github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/edgedb/edgedb-go v0.17.1 h1:nWVNWq61X1KyJziy5Zm+NfUwr7nXiCW7/qmH1zMSOpI= github.com/edgedb/edgedb-go v0.17.1/go.mod h1:J+llluepGAi/rIPNcUgIFEedCCISLKFG+VUEWnBhIqE= github.com/flosch/pongo2 v0.0.0-20200913210552-0d938eb266f3 h1:fmFk0Wt3bBxxwZnu48jqMdaOR/IZ4vdtJFuaFV8MpIE= @@ -53,6 +57,8 @@ github.com/gofiber/utils v1.1.0/go.mod h1:poZpsnhBykfnY1Mc0KeEa6mSHrS3dV0+oBWyeQ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomarkdown/markdown v0.0.0-20240419095408-642f0ee99ae2 h1:yEt5djSYb4iNtmV9iJGVday+i4e9u6Mrn5iP64HH5QM= +github.com/gomarkdown/markdown v0.0.0-20240419095408-642f0ee99ae2/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= @@ -124,7 +130,12 @@ github.com/xdg/stringprep v1.0.3 h1:cmL5Enob4W83ti/ZHuZLuKD/xqJfus4fVPwE+/BDm+4= github.com/xdg/stringprep v1.0.3/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.4.5/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/goldmark v1.7.1 h1:3bajkSilaCbjdKVsKdZjZCLBNPL9pYzrCakKaf4U49U= +github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= +github.com/yuin/goldmark-highlighting v0.0.0-20220208100518-594be1970594 h1:yHfZyN55+5dp1wG7wDKv8HQ044moxkyGq12KFFMFDxg= +github.com/yuin/goldmark-highlighting v0.0.0-20220208100518-594be1970594/go.mod h1:U9ihbh+1ZN7fR5Se3daSPoz1CGF9IYtSvWwVQtnzGHU= go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= diff --git a/main.go b/main.go index f75ca1a..aaa3bc1 100644 --- a/main.go +++ b/main.go @@ -1,73 +1,26 @@ package main import ( - "context" - "time" + "fmt" "github.com/flosch/pongo2" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/logger" "github.com/gofiber/template/django/v3" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/bson/primitive" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" ) -var mongoClient *mongo.Client var userTmpl *pongo2.Template var botTmpl *pongo2.Template - -type Message struct { - ID primitive.ObjectID `bson:"_id"` - Content string `bson:"message"` - Role string `bson:"role"` - Date time.Time `bson:"date"` -} - -type Conversation struct { - ID string - Messages []Message -} - -type User struct { - ID string `bson:"_id"` - Username string `bson:"username"` - OAth2Token string `bson:"oauth2token"` - IsSub bool `bson:"isSub"` -} - -type CurrentSession struct { - ID string - CurrentConversationID string - CurrentUserID string -} - -func connectToMongoDB(uri string) { - serverAPI := options.ServerAPI(options.ServerAPIVersion1) - opts := options.Client().ApplyURI(uri).SetServerAPIOptions(serverAPI) - client, err := mongo.Connect(context.TODO(), opts) - if err != nil { - panic(err) - } - mongoClient = client - - if err := mongoClient.Ping(context.TODO(), nil); err != nil { - panic(err) - } -} +var popoverTmpl *pongo2.Template func main() { botTmpl = pongo2.Must(pongo2.FromFile("views/partials/message-bot.html")) userTmpl = pongo2.Must(pongo2.FromFile("views/partials/message-user.html")) + popoverTmpl = pongo2.Must(pongo2.FromFile("views/partials/popover.html")) // Import HTML using django engine/template engine := django.New("./views", ".html") - if engine == nil { - panic("Failed to create django engine") - } - // Create new Fiber instance. Can use any framework. I use fiber for speed and simplicity app := fiber.New(fiber.Config{ Views: engine, @@ -75,9 +28,6 @@ func main() { EnablePrintRoutes: true, }) - // Initialize - go connectToMongoDB("mongodb://localhost:27017") - // Add default logger app.Use(logger.New()) @@ -85,150 +35,23 @@ func main() { app.Static("/", "./static") // Add routes - app.Get("/", indexHandler) - app.Get("/isMongoDBConnected", isMongoDBConnectedHandler) - - app.Get("/chat", chatPageHandler) // Complete chat page - app.Put("/chat", addMessageHandler) // Add message - app.Delete("/chat", deleteMessageHandler) // Delete message - app.Get("/loadChat", generateChatHTML) // Load chat - - app.Get("/generateOpenai", addOpenaiMessage) - - app.Get("/test-button", testButtonHandler) + app.Get("/", indexHandler) // Welcome page + app.Get("/chat", ChatPageHandler) // Complete chat page + app.Post("/requestMultipleMessages", RequestMultipleMessages) // Request multiple messages + app.Get("/loadChat", LoadChatHandler) // Load chat + app.Post("/deleteMessage", DeleteMessageHandler) // Delete message + app.Get("/loadModelSelection", LoadModelSelectionHandler) // Load model selection + app.Get("/generateMultipleMessages", GenerateMultipleMessages) // Generate multiple messages + app.Get("/messageContent", GetMessageContentHandler) + app.Get("test", func(c *fiber.Ctx) error { + fmt.Println("test") + return c.SendString("") + }) // Start server - app.Listen(":3000") + app.Listen(":8080") } func indexHandler(c *fiber.Ctx) error { return c.Render("welcome", fiber.Map{}, "layouts/main") } - -func chatPageHandler(c *fiber.Ctx) error { - return c.Render("chat", fiber.Map{ - "Messages": []Message{}, - }, "layouts/main") -} - -func testButtonHandler(c *fiber.Ctx) error { - return c.Render("partials/test-button", fiber.Map{}) -} - -func addMessageHandler(c *fiber.Ctx) error { - message := c.FormValue("message") - lastMessageAsked = message - - // Add bot message if there is no error - userOut, err := userTmpl.Execute(pongo2.Context{"Content": message}) - if err != nil { - panic(err) - } - - botOut, err := botTmpl.Execute(pongo2.Context{"Content": "Waiting...", "IsPlaceholder": true}) - if err != nil { - panic(err) - } - - collection := mongoClient.Database("chat").Collection("messages") - collection.InsertOne(context.Background(), bson.M{"message": message, "role": "user", "date": time.Now()}) - - return c.SendString(userOut + botOut) -} - -func deleteMessageHandler(c *fiber.Ctx) error { - messageId := c.FormValue("messageId") - - // Convert the string ID to a MongoDB ObjectID - objID, err := primitive.ObjectIDFromHex(messageId) - if err != nil { - // If the conversion fails, return an error response - return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ - "error": "Invalid message ID format", - }) - } - - // Delete messages in the database. This one and all the following ones - collection := mongoClient.Database("chat").Collection("messages") - - // Get the date of the message - var message Message - err = collection.FindOne(context.TODO(), bson.M{"_id": objID}).Decode(&message) - if err != nil { - if err == mongo.ErrNoDocuments { - return c.Status(fiber.StatusNotFound).JSON(fiber.Map{ - "error": "Message not found", - }) - } - return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ - "error": "Failed to find message", - }) - } - - // Delete the message and all messages with a date after the specified date - filter := bson.M{ - "$or": []bson.M{ - {"_id": objID}, - {"date": bson.M{"$gt": message.Date}}, - }, - } - _, err = collection.DeleteMany(context.TODO(), filter) - if err != nil { - return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ - "error": "Failed to delete messages", - }) - } - - return c.SendString("") -} - -func generateChatHTML(c *fiber.Ctx) error { - // Get the messages from the database - collection := mongoClient.Database("chat").Collection("messages") - - // Get all messages - cursor, err := collection.Find(context.TODO(), bson.D{}) - if err != nil { - return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ - "error": "Failed to find messages", - }) - } - - // Convert the cursor to an array of messages - var Messages []Message - if err = cursor.All(context.TODO(), &Messages); err != nil { - return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ - "error": "Failed to convert cursor to array", - }) - } - - htmlString := "
" - - for message := range Messages { - if Messages[message].Role == "user" { - userOut, err := userTmpl.Execute(pongo2.Context{"Content": Messages[message].Content}) - if err != nil { - panic(err) - } - htmlString += userOut - } else { - botOut, err := botTmpl.Execute(pongo2.Context{"Content": Messages[message].Content}) - if err != nil { - panic(err) - } - htmlString += botOut - } - } - - htmlString += "
" - - // Render the HTML template with the messages - return c.SendString(htmlString) -} - -func isMongoDBConnectedHandler(c *fiber.Ctx) error { - if mongoClient != nil { - return c.SendString("

Connected

") - } - return c.SendString("

Not connected

") -} diff --git a/static/icons/bouvai2.png b/static/icons/bouvai2.png new file mode 100644 index 0000000000000000000000000000000000000000..712acb13530b960c4d62435e24935edf8ea41330 GIT binary patch literal 116678 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 X_S3Q-ou~&0@FOKAFIp>X5cvNAp3NX7 literal 0 HcmV?d00001 diff --git a/utils.go b/utils.go new file mode 100644 index 0000000..e6ac5ab --- /dev/null +++ b/utils.go @@ -0,0 +1,36 @@ +package main + +import ( + "bytes" + "strings" + + "github.com/yuin/goldmark" + highlighting "github.com/yuin/goldmark-highlighting" +) + +func markdownToHTML(markdownText string) string { + var buf bytes.Buffer + md := goldmark.New( + goldmark.WithExtensions( + highlighting.NewHighlighting(highlighting.WithStyle("monokai")), + ), + ) + if err := md.Convert([]byte(markdownText), &buf); err != nil { + panic(err) // Handle the error appropriately + } + return buf.String() +} + +func model2Icon(model string) string { + if model == "gpt-3.5-turbo" { + return "openai" + } + if model == "gpt-4" { + return "openai" + } + // If model name contain claude-3 retrun anthropic + if strings.Contains(model, "claude-3") { + return "anthropic" + } + return "openai" +} diff --git a/views/chat.html b/views/chat.html index b2cd94c..4abe6be 100644 --- a/views/chat.html +++ b/views/chat.html @@ -1,12 +1,23 @@ - + + \ No newline at end of file diff --git a/views/partials/message-user.html b/views/partials/message-user.html index 632b909..3c2b061 100644 --- a/views/partials/message-user.html +++ b/views/partials/message-user.html @@ -1,17 +1,23 @@ -
-
- User Image -
-
-
-

User

-
- - -
+
+
+
+
+ User Image +
-
- {{ Content }} + +
+
+
+
+
+ {{ Content|safe }} +
+
+ +
+
-
+
-

Chat Page

-
+
+ -
-
-
- + +
+
+ +
+
+ + + +
+ +
-
+
\ No newline at end of file diff --git a/views/layouts/main.html b/views/layouts/main.html index 317432f..4200f97 100644 --- a/views/layouts/main.html +++ b/views/layouts/main.html @@ -6,6 +6,47 @@ JADE 2.0 + + + @@ -29,6 +70,66 @@ } + + + + + + + \ No newline at end of file diff --git a/views/partials/content-bot.html b/views/partials/content-bot.html new file mode 100644 index 0000000..8deb56b --- /dev/null +++ b/views/partials/content-bot.html @@ -0,0 +1,7 @@ +
+
+
+ {{ message.Content | safe }} +
+
+
\ No newline at end of file diff --git a/views/partials/message-bot.html b/views/partials/message-bot.html index 835c3df..832f783 100644 --- a/views/partials/message-bot.html +++ b/views/partials/message-bot.html @@ -1,22 +1,84 @@ -
\ No newline at end of file +
+
\ No newline at end of file diff --git a/views/partials/navbar.html b/views/partials/navbar.html index c4fb27e..43f05bf 100644 --- a/views/partials/navbar.html +++ b/views/partials/navbar.html @@ -14,6 +14,7 @@ \ No newline at end of file diff --git a/views/partials/popover.html b/views/partials/popover.html new file mode 100644 index 0000000..2e5a32a --- /dev/null +++ b/views/partials/popover.html @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/views/welcome.html b/views/welcome.html index 26f5f59..1626c28 100644 --- a/views/welcome.html +++ b/views/welcome.html @@ -1,6 +1,5 @@

Welcome to JADE 2.0!

-

\ No newline at end of file