Jade/main.go
2024-05-16 00:35:09 +02:00

352 lines
8.7 KiB
Go

package main
import (
"fmt"
"github.com/MrBounty/JADE2.0/ssefiber"
"github.com/flosch/pongo2"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/logger"
"github.com/gofiber/template/django/v3"
)
var userTmpl *pongo2.Template
var botTmpl *pongo2.Template
var selectBtnTmpl *pongo2.Template
var sseChanel *ssefiber.FiberSSEChannel
func main() {
botTmpl = pongo2.Must(pongo2.FromFile("views/partials/message-bot.html"))
userTmpl = pongo2.Must(pongo2.FromFile("views/partials/message-user.html"))
selectBtnTmpl = pongo2.Must(pongo2.FromFile("views/partials/model-selection-btn.html"))
// Import HTML using django engine/template
engine := django.New("./views", ".html")
// Create new Fiber instance. Can use any framework. I use fiber for speed and simplicity
app := fiber.New(fiber.Config{
Views: engine,
AppName: "JADE 2.0",
EnablePrintRoutes: true,
})
sse := ssefiber.New(app, "/sse")
sseChanel = sse.CreateChannel("sse", "")
// Add default logger
app.Use(logger.New())
// Add static files
app.Static("/", "./static")
// Main routes
app.Get("/", ChatPageHandler)
app.Get("/loadChat", LoadChatHandler)
// Chat routes
app.Post("/deleteMessage", DeleteMessageHandler)
app.Get("/generatePlaceholder", GeneratePlaceholderHandler)
app.Get("/generateMultipleMessages", GenerateMultipleMessagesHandler)
app.Get("/messageContent", GetMessageContentHandler)
app.Get("/editMessageForm", GetEditMessageFormHandler)
app.Post("/redoMessage", RedoMessageHandler)
app.Post("/clearChat", ClearChatHandler)
// Settings routes
app.Post("/addKeys", addKeys)
// Popovers
app.Get("/loadModelSelection", LoadModelSelectionHandler)
app.Get("/loadUsageKPI", LoadUsageKPIHandler)
app.Get("/loadKeys", LoadKeysHandler)
app.Get("/loadSettings", LoadSettingsHandler)
// Authentication
app.Get("/signin", handleUiSignIn)
app.Get("/signout", handleSignOut)
app.Get("/callback", handleCallback)
app.Get("/callbackSignup", handleCallbackSignup)
app.Get("/test", func(c *fiber.Ctx) error {
fmt.Println("Hello from test")
return c.SendString("")
})
app.Get("/empty", func(c *fiber.Ctx) error {
return c.SendString("")
})
// Start server
app.Listen(":8080")
}
func addKeys(c *fiber.Ctx) error {
openaiKey := c.FormValue("openai_key")
anthropicKey := c.FormValue("anthropic_key")
mistralKey := c.FormValue("mistral_key")
groqKey := c.FormValue("groq_key")
var Exists bool
// Handle OpenAI key
if openaiKey != "" {
// Check if the OpenAI key already exists
err := edgeClient.QuerySingle(edgeCtx, `
select exists (
select global currentUser.setting.keys
filter .company.name = "openai" AND .key = <str>$0
);
`, &Exists, openaiKey)
if err != nil {
fmt.Println("Error in edgedb.QuerySingle: in addOpenaiKey: ", err)
return c.SendString("")
}
if Exists {
fmt.Println("OpenAI key already exists")
return c.SendString("")
}
if !TestOpenaiKey(openaiKey) {
fmt.Println("Invalid OpenAI API Key")
return c.SendString("Invalid OpenAI API Key\n")
}
// Check if the company key already exists
err = edgeClient.QuerySingle(edgeCtx, `
select exists (
select global currentUser.setting.keys
filter .company.name = "openai"
);
`, &Exists)
if err != nil {
fmt.Println("Error in edgedb.QuerySingle: in addOpenaiKey")
fmt.Println(err)
}
if Exists {
fmt.Println("Company key already exists")
err = edgeClient.Execute(edgeCtx, `
UPDATE Key filter .company.name = <str>$0 AND .key = <str>$1
SET {
key := <str>$1,
}
`, "openai", openaiKey)
if err != nil {
fmt.Println("Error in edgedb.QuerySingle: in addOpenaiKey")
fmt.Println(err)
}
} else {
err = edgeClient.Execute(edgeCtx, `
UPDATE global currentUser.setting
SET {
keys += (
INSERT Key {
company := <str>$0,
key := <str>$1,
name := <str>$2,
}
)
}`, "openai", openaiKey, "OpenAI API Key")
if err != nil {
fmt.Println("Error in edgedb.QuerySingle: in addOpenaiKey")
fmt.Println(err)
}
}
}
// Handle Anthropic key
if anthropicKey != "" {
// Check if the OpenAI key already exists
err := edgeClient.QuerySingle(edgeCtx, `
select exists (
select global currentUser.setting.keys
filter .company.name = "anthropic" AND .key = <str>$0
);
`, &Exists, openaiKey)
if err != nil {
fmt.Println("Error in edgedb.QuerySingle: in addAnthropicKey: ", err)
return c.SendString("")
}
if Exists {
fmt.Println("Anthropic key already exists")
return c.SendString("")
}
if !TestAnthropicKey(anthropicKey) {
fmt.Println("Invalid Anthropic API Key")
return c.SendString("Invalid Anthropic API Key\n")
}
// Check if the company key already exists
err = edgeClient.QuerySingle(edgeCtx, `
select exists (
select global currentUser.setting.keys
filter .company.name = "anthropic"
);
`, &Exists)
if err != nil {
fmt.Println("Error in edgedb.QuerySingle: in addAnthropicKey")
fmt.Println(err)
}
if Exists {
err = edgeClient.Execute(edgeCtx, `
UPDATE Key filter .company.name = "anthropic" AND .key = <str>$0
SET {
key := <str>$0,
}
`, anthropicKey)
if err != nil {
fmt.Println("Error in edgedb.QuerySingle: in addAnthropicKey")
fmt.Println(err)
}
} else {
err = edgeClient.Execute(edgeCtx, `
UPDATE global currentUser.setting
SET {
keys += (
INSERT Key {
company := "anthropic",
key := <str>$0,
name := "Anthropic API Key",
}
)
}`, anthropicKey)
if err != nil {
fmt.Println("Error in edgedb.QuerySingle: in addAnthropicKey")
fmt.Println(err)
}
}
}
// Handle Mistral key
if mistralKey != "" {
// Check if the OpenAI key already exists
err := edgeClient.QuerySingle(edgeCtx, `
select exists (
select global currentUser.setting.keys
filter .company.name = "mistral" AND .key = <str>$0
);
`, &Exists, openaiKey)
if err != nil {
fmt.Println("Error in edgedb.QuerySingle: in addMistralKey: ", err)
return c.SendString("")
}
if Exists {
fmt.Println("Mistral key already exists")
return c.SendString("")
}
if !TestMistralKey(mistralKey) {
fmt.Println("Invalid Mistral API Key")
return c.SendString("Invalid Mistral API Key\n")
}
// Check if the company key already exists
err = edgeClient.QuerySingle(edgeCtx, `
select exists (
select global currentUser.setting.keys
filter .company.name = "mistral"
);
`, &Exists)
if err != nil {
fmt.Println("Error in edgedb.QuerySingle: in addMistralKey")
fmt.Println(err)
}
if Exists {
err = edgeClient.Execute(edgeCtx, `
UPDATE Key filter .company.name = "mistral" AND .key = <str>$0
SET {
key := <str>$0,
}
`, mistralKey)
if err != nil {
fmt.Println("Error in edgedb.QuerySingle: in addMistralKey")
fmt.Println(err)
}
} else {
err = edgeClient.Execute(edgeCtx, `
UPDATE global currentUser.setting
SET {
keys += (
INSERT Key {
company := "mistral",
key := <str>$0,
name := "Mistral API Key",
}
)
}`, mistralKey)
if err != nil {
fmt.Println("Error in edgedb.QuerySingle: in addMistralKey")
fmt.Println(err)
}
}
}
// Handle Groq key
if groqKey != "" {
// Check if the OpenAI key already exists
err := edgeClient.QuerySingle(edgeCtx, `
select exists (
select global currentUser.setting.keys
filter .company.name = "groq" AND .key = <str>$0
);
`, &Exists, openaiKey)
if err != nil {
fmt.Println("Error in edgedb.QuerySingle: in addGroqKey: ", err)
return c.SendString("")
}
if Exists {
fmt.Println("Groq key already exists")
return c.SendString("")
}
if !TestGroqKey(groqKey) {
fmt.Println("Invalid Groq API Key")
return c.SendString("Invalid Groq API Key\n")
}
// Check if the company key already exists
err = edgeClient.QuerySingle(edgeCtx, `
select exists (
select global currentUser.setting.keys
filter .company.name = "groq"
);
`, &Exists)
if err != nil {
fmt.Println("Error in edgedb.QuerySingle: in addGroqKey")
fmt.Println(err)
}
if Exists {
err = edgeClient.Execute(edgeCtx, `
UPDATE Key filter .company.name = "groq" AND .key = <str>$0
SET {
key := <str>$0,
}
`, groqKey)
if err != nil {
fmt.Println("Error in edgedb.QuerySingle: in addGroqKey")
fmt.Println(err)
}
} else {
err = edgeClient.Execute(edgeCtx, `
UPDATE global currentUser.setting
SET {
keys += (
INSERT Key {
company := "groq",
key := <str>$0,
name := "Groq API Key",
}
)
}`, groqKey)
if err != nil {
fmt.Println("Error in edgedb.QuerySingle: in addGroqKey")
fmt.Println(err)
}
}
}
return c.SendString("<script>window.location.reload()</script>")
}