working multiple users

This commit is contained in:
Adrien Bouvais 2024-06-01 11:58:11 +02:00
parent a245413621
commit 3a325efcbf
15 changed files with 212 additions and 219 deletions

134
Chat.go
View File

@ -15,26 +15,21 @@ import (
)
func ChatPageHandler(c *fiber.Ctx) error {
authCookie := c.Cookies("jade-edgedb-auth-token", "")
if authCookie != "" && !checkIfLogin() {
edgeClient = edgeClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": authCookie})
}
var (
isSub bool
limitReach bool
)
if !checkIfLogin() {
if c.Cookies("jade-edgedb-auth-token", "") == "" {
fmt.Println("Not logged in")
isSub = false
limitReach = false
return c.Render("chat", fiber.Map{"IsLogin": false, "HaveKey": false, "IsSubscribed": false, "IsLimiteReached": false}, "layouts/main")
} else {
isSub = IsCurrentUserSubscribed()
limitReach = IsCurrentUserLimiteReached()
isSub = IsCurrentUserSubscribed(c)
limitReach = IsCurrentUserLimiteReached(c)
return c.Render("chat", fiber.Map{"IsLogin": checkIfLogin(c), "HaveKey": checkIfHaveKey(c), "IsSubscribed": isSub, "IsLimiteReached": limitReach}, "layouts/main")
}
return c.Render("chat", fiber.Map{"IsLogin": checkIfLogin(), "HaveKey": checkIfHaveKey(), "IsSubscribed": isSub, "IsLimiteReached": limitReach}, "layouts/main")
}
func DeleteMessageHandler(c *fiber.Ctx) error {
@ -47,7 +42,7 @@ func DeleteMessageHandler(c *fiber.Ctx) error {
}
// Delete all messages
err = edgeClient.Execute(edgeCtx, `
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
@ -58,19 +53,19 @@ func DeleteMessageHandler(c *fiber.Ctx) error {
panic(err)
}
return c.SendString(generateChatHTML())
return c.SendString(generateChatHTML(c))
}
func LoadChatHandler(c *fiber.Ctx) error {
deleteLLMtoDelete()
deleteLLMtoDelete(c)
if checkIfLogin() {
if IsCurrentUserLimiteReached() && !IsCurrentUserSubscribed() {
return c.SendString(generateLimitReachedChatHTML())
} else if !checkIfHaveKey() {
if checkIfLogin(c) {
if IsCurrentUserLimiteReached(c) && !IsCurrentUserSubscribed(c) {
return c.SendString(generateLimitReachedChatHTML(c))
} else if !checkIfHaveKey(c) {
return c.SendString(generateEnterKeyChatHTML())
}
return c.SendString(generateChatHTML())
return c.SendString(generateChatHTML(c))
} else {
return c.SendString(generateWelcomeChatHTML())
}
@ -86,10 +81,10 @@ type TemplateMessage struct {
ModelID string
}
func generateChatHTML() string {
func generateChatHTML(c *fiber.Ctx) string {
// Println the name of the current conversation
var currentConv Conversation
err := edgeClient.QuerySingle(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
SELECT global currentConversation { name }`, &currentConv)
if err != nil {
fmt.Println("Error getting current conversation")
@ -100,7 +95,7 @@ func generateChatHTML() string {
// Maybe redo that to be area by area because look like shit rn. It come from early stage of dev. It work tho soooo...
var Messages []Message
err = edgeClient.Query(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Query(edgeCtx, `
SELECT Message {
id,
selected,
@ -189,7 +184,7 @@ func GetUserMessageHandler(c *fiber.Ctx) error {
messageUUID, _ := edgedb.ParseUUID(id)
var selectedMessage Message
err := edgeClient.QuerySingle(context.Background(), `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(context.Background(), `
SELECT Message {
content
}
@ -217,7 +212,7 @@ func GetMessageContentHandler(c *fiber.Ctx) error {
messageUUID, _ := edgedb.ParseUUID(messageId)
var selectedMessage Message
err := edgeClient.QuerySingle(context.Background(), `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(context.Background(), `
SELECT Message {
content,
llm : {
@ -251,7 +246,7 @@ func GetMessageContentHandler(c *fiber.Ctx) error {
out += "</div>"
// Update the selected value of messages in the database
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
WITH m := (SELECT Message FILTER .id = <uuid>$0)
UPDATE Message
FILTER .area = m.area
@ -261,7 +256,7 @@ func GetMessageContentHandler(c *fiber.Ctx) error {
panic(err)
}
_ = edgeClient.Execute(edgeCtx, `
_ = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
UPDATE Message
FILTER .id = <uuid>$0
SET {selected := true};
@ -435,17 +430,17 @@ func generateTermAndServiceChatHTML() string {
return htmlString
}
func generateLimitReachedChatHTML() string {
func generateLimitReachedChatHTML(c *fiber.Ctx) string {
welcomeMessage := `You have reached the maximum number of messages for a free account. Please upgrade your account to continue using JADE.`
var result User
err := edgeClient.QuerySingle(edgeCtx, "SELECT global currentUser { stripe_id, email } LIMIT 1;", &result)
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, "SELECT global currentUser { stripe_id, email } LIMIT 1;", &result)
if err != nil {
fmt.Println("Error getting current user")
panic(err)
}
clientSecretSession := CreateClientSecretSession()
clientSecretSession := CreateClientSecretSession(c)
// TODO Replace by live API call
stripeTable := `
@ -486,7 +481,7 @@ func GetEditMessageFormHandler(c *fiber.Ctx) error {
idUUID, _ := edgedb.ParseUUID(id)
var message Message
err := edgeClient.QuerySingle(context.Background(), `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(context.Background(), `
SELECT Message { content }
FILTER .id = <uuid>$0;
`, &message, idUUID)
@ -521,7 +516,7 @@ func RedoMessageHandler(c *fiber.Ctx) error {
}
var message Message
err = edgeClient.QuerySingle(context.Background(), `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(context.Background(), `
SELECT Message { content }
FILTER .id = <uuid>$0;
`, &message, messageUUID)
@ -531,7 +526,7 @@ func RedoMessageHandler(c *fiber.Ctx) error {
}
// Delete messages
err = edgeClient.Execute(edgeCtx, `
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
@ -542,7 +537,7 @@ func RedoMessageHandler(c *fiber.Ctx) error {
panic(err)
}
return c.SendString(GeneratePlaceholderHTML(message.Content, selectedLLMIds, false))
return c.SendString(GeneratePlaceholderHTML(c, message.Content, selectedLLMIds, false))
}
func EditMessageHandler(c *fiber.Ctx) error {
@ -562,7 +557,7 @@ func EditMessageHandler(c *fiber.Ctx) error {
}
// Delete messages
err = edgeClient.Execute(edgeCtx, `
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
@ -573,12 +568,12 @@ func EditMessageHandler(c *fiber.Ctx) error {
panic(err)
}
return c.SendString(GeneratePlaceholderHTML(message, selectedLLMIds, true))
return c.SendString(GeneratePlaceholderHTML(c, message, selectedLLMIds, true))
}
func ClearChatHandler(c *fiber.Ctx) error {
// Delete the default conversation
err := edgeClient.Execute(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
DELETE Area
FILTER .conversation = global currentConversation;
`)
@ -587,12 +582,12 @@ func ClearChatHandler(c *fiber.Ctx) error {
panic(err)
}
return c.SendString(generateChatHTML())
return c.SendString(generateChatHTML(c))
}
// Popover stuff
func LoadUsageKPIHandler(c *fiber.Ctx) error {
if !checkIfLogin() || !checkIfHaveKey() {
if !checkIfLogin(c) || !checkIfHaveKey(c) {
return c.SendString("")
}
@ -624,7 +619,7 @@ func LoadUsageKPIHandler(c *fiber.Ctx) error {
}
var usages []UsageKPI
err = edgeClient.Query(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Query(edgeCtx, `
WITH
U := (
SELECT Usage
@ -675,11 +670,11 @@ func LoadUsageKPIHandler(c *fiber.Ctx) error {
return c.SendString(out)
}
func GenerateModelPopoverHTML(refresh bool) string {
openaiExists, anthropicExists, mistralExists, groqExists, gooseaiExists, googleExists := getExistingKeys()
func GenerateModelPopoverHTML(refresh bool, c *fiber.Ctx) string {
openaiExists, anthropicExists, mistralExists, groqExists, gooseaiExists, googleExists := getExistingKeys(c)
var llms []LLM
err := edgeClient.Query(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Query(edgeCtx, `
SELECT LLM {
id,
name,
@ -702,10 +697,10 @@ func GenerateModelPopoverHTML(refresh bool) string {
panic(err)
}
modelInfos := GetAvailableModels()
modelInfos := GetAvailableModels(c)
out, err := modelPopoverTmpl.Execute(pongo2.Context{
"IsLogin": checkIfLogin(),
"IsLogin": checkIfLogin(c),
"OpenaiExists": openaiExists,
"AnthropicExists": anthropicExists,
"MistralExists": mistralExists,
@ -716,7 +711,7 @@ func GenerateModelPopoverHTML(refresh bool) string {
"LLMs": llms,
"ModelInfos": modelInfos,
"DeleteUpdate": refresh,
"IsSub": IsCurrentUserSubscribed(),
"IsSub": IsCurrentUserSubscribed(c),
})
if err != nil {
fmt.Println("Error generating model popover")
@ -726,15 +721,15 @@ func GenerateModelPopoverHTML(refresh bool) string {
}
func LoadModelSelectionHandler(c *fiber.Ctx) error {
if !checkIfLogin() || !checkIfHaveKey() {
if !checkIfLogin(c) || !checkIfHaveKey(c) {
return c.SendString("")
}
return c.SendString(GenerateModelPopoverHTML(false))
return c.SendString(GenerateModelPopoverHTML(false, c))
}
func GenerateConversationPopoverHTML(isActive bool) string {
func GenerateConversationPopoverHTML(isActive bool, c *fiber.Ctx) string {
var conversations []Conversation
err := edgeClient.Query(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Query(edgeCtx, `
SELECT Conversation {
name,
position,
@ -769,25 +764,25 @@ func GenerateConversationPopoverHTML(isActive bool) string {
}
func LoadConversationSelectionHandler(c *fiber.Ctx) error {
if !checkIfLogin() || !checkIfHaveKey() {
if !checkIfLogin(c) || !checkIfHaveKey(c) {
return c.SendString("")
}
return c.SendString(GenerateConversationPopoverHTML(false))
return c.SendString(GenerateConversationPopoverHTML(false, c))
}
func RefreshConversationSelectionHandler(c *fiber.Ctx) error {
IsActive := c.FormValue("IsActive") == "true"
return c.SendString(GenerateConversationPopoverHTML(!IsActive))
return c.SendString(GenerateConversationPopoverHTML(!IsActive, c))
}
func LoadSettingsHandler(c *fiber.Ctx) error {
if !checkIfLogin() {
if !checkIfLogin(c) {
return c.SendString("")
}
var user User
err := edgeClient.QuerySingle(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
SELECT User {
email
}
@ -803,10 +798,10 @@ func LoadSettingsHandler(c *fiber.Ctx) error {
stripeSubLink := "https://billing.stripe.com/p/login/test_eVa5kC1q7dogaaIcMM?prefilled_email=" + user.Email
openaiExists, anthropicExists, mistralExists, groqExists, gooseaiExists, googleExists := getExistingKeys()
openaiExists, anthropicExists, mistralExists, groqExists, gooseaiExists, googleExists := getExistingKeys(c)
out, err := settingPopoverTmpl.Execute(pongo2.Context{
"IsLogin": checkIfLogin(),
"IsLogin": checkIfLogin(c),
"OpenaiExists": openaiExists,
"AnthropicExists": anthropicExists,
"MistralExists": mistralExists,
@ -814,7 +809,7 @@ func LoadSettingsHandler(c *fiber.Ctx) error {
"GooseaiExists": gooseaiExists,
"GoogleExists": googleExists,
"AnyExists": openaiExists || anthropicExists || mistralExists || groqExists || gooseaiExists || googleExists,
"IsSub": IsCurrentUserSubscribed(),
"IsSub": IsCurrentUserSubscribed(c),
"StripeSubLink": stripeSubLink,
})
if err != nil {
@ -830,7 +825,7 @@ func CreateConversationHandler(c *fiber.Ctx) error {
name = "New Conversation"
}
err := edgeClient.Execute(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
WITH
C := (
SELECT Conversation
@ -847,7 +842,7 @@ func CreateConversationHandler(c *fiber.Ctx) error {
panic(err)
}
return c.SendString(GenerateConversationPopoverHTML(true))
return c.SendString(GenerateConversationPopoverHTML(true, c))
}
func DeleteConversationHandler(c *fiber.Ctx) error {
@ -859,7 +854,7 @@ func DeleteConversationHandler(c *fiber.Ctx) error {
panic(err)
}
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
DELETE Conversation
FILTER .user = global currentUser AND .id = <uuid>$0;
`, conversationUUID)
@ -869,7 +864,7 @@ func DeleteConversationHandler(c *fiber.Ctx) error {
}
// Select the default conversation
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
UPDATE Conversation
FILTER .user = global currentUser AND .name = 'Default'
SET {
@ -885,7 +880,7 @@ func DeleteConversationHandler(c *fiber.Ctx) error {
<hx hx-get="/loadChat" hx-trigger="load once" hx-swap="outerHTML" hx-target="#chat-container" style="display: none;"></hx>
`
return c.SendString(GenerateConversationPopoverHTML(true) + reloadChatTriggerHTML)
return c.SendString(GenerateConversationPopoverHTML(true, c) + reloadChatTriggerHTML)
}
func SelectConversationHandler(c *fiber.Ctx) error {
@ -896,7 +891,7 @@ func SelectConversationHandler(c *fiber.Ctx) error {
panic(err)
}
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
UPDATE Conversation
FILTER .user = global currentUser
SET {
@ -908,7 +903,7 @@ func SelectConversationHandler(c *fiber.Ctx) error {
panic(err)
}
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
UPDATE Conversation
FILTER .user = global currentUser AND .id = <uuid>$0
SET {
@ -920,16 +915,13 @@ func SelectConversationHandler(c *fiber.Ctx) error {
panic(err)
}
edgeClient = edgeClient.WithoutGlobals().WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token")})
return c.SendString(generateChatHTML())
return c.SendString(generateChatHTML(c))
}
func ArchiveDefaultConversationHandler(c *fiber.Ctx) error {
edgeClient = edgeClient.WithoutGlobals().WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token")})
name := c.FormValue("conversation-name-input")
err := edgeClient.Execute(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
UPDATE Conversation
FILTER .user = global currentUser AND .name = 'Default'
SET {
@ -941,7 +933,7 @@ func ArchiveDefaultConversationHandler(c *fiber.Ctx) error {
panic(err)
}
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
WITH
C := (
SELECT Conversation
@ -958,5 +950,5 @@ func ArchiveDefaultConversationHandler(c *fiber.Ctx) error {
panic(err)
}
return c.SendString(GenerateConversationPopoverHTML(true))
return c.SendString(GenerateConversationPopoverHTML(true, c))
}

20
LLM.go
View File

@ -20,7 +20,7 @@ func deleteLLM(c *fiber.Ctx) error {
for _, id := range selectedLLMIds {
idUUID, _ := edgedb.ParseUUID(id)
err := edgeClient.Execute(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
UPDATE LLM
FILTER .id = <uuid>$0 AND .user = global currentUser
SET {
@ -33,13 +33,13 @@ func deleteLLM(c *fiber.Ctx) error {
}
}
deleteLLMtoDelete()
deleteLLMtoDelete(c)
return c.SendString(GenerateModelPopoverHTML(true))
return c.SendString(GenerateModelPopoverHTML(true, c))
}
func deleteLLMtoDelete() {
err := edgeClient.Execute(edgeCtx, `
func deleteLLMtoDelete(c *fiber.Ctx) {
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
delete LLM
filter .to_delete = true and not exists(
select Message filter .llm = LLM
@ -63,7 +63,7 @@ func createLLM(c *fiber.Ctx) error {
customID := c.FormValue("model-cid-input")
if modelID == "custom" {
err := edgeClient.Execute(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
WITH
countLLM := count((SELECT LLM FILTER .user = global currentUser))
INSERT LLM {
@ -91,7 +91,7 @@ func createLLM(c *fiber.Ctx) error {
panic(err)
}
} else {
err := edgeClient.Execute(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
WITH
countLLM := count((SELECT LLM FILTER .user = global currentUser))
INSERT LLM {
@ -109,7 +109,7 @@ func createLLM(c *fiber.Ctx) error {
}
}
return c.SendString(GenerateModelPopoverHTML(true))
return c.SendString(GenerateModelPopoverHTML(true, c))
}
type PositionUpdate struct {
@ -130,7 +130,7 @@ func updateLLMPositionBatch(c *fiber.Ctx) error {
panic(err)
}
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
UPDATE LLM
FILTER .id = <uuid>$0 AND .user = global currentUser
SET {
@ -161,7 +161,7 @@ func updateConversationPositionBatch(c *fiber.Ctx) error {
panic(err)
}
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
UPDATE Conversation
FILTER .id = <uuid>$0 AND .user = global currentUser
SET {

View File

@ -41,16 +41,16 @@ func GeneratePlaceholderHandler(c *fiber.Ctx) error {
panic(err)
}
return c.SendString(GeneratePlaceholderHTML(message, selectedLLMIds, true))
return c.SendString(GeneratePlaceholderHTML(c, message, selectedLLMIds, true))
}
func GeneratePlaceholderHTML(message string, selectedLLMIds []string, with_user_message bool) string {
func GeneratePlaceholderHTML(c *fiber.Ctx, message string, selectedLLMIds []string, with_user_message bool) string {
var selectedLLMs []LLM
var selectedLLM LLM
for _, id := range selectedLLMIds {
idUUID, _ := edgedb.ParseUUID(id)
err := edgeClient.QuerySingle(context.Background(), `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(context.Background(), `
SELECT LLM {
id,
name,
@ -81,11 +81,11 @@ func GeneratePlaceholderHTML(message string, selectedLLMIds []string, with_user_
}
lastSelectedLLMs = selectedLLMs
_, position := insertArea()
_, position := insertArea(c)
out := ""
if with_user_message {
messageID := insertUserMessage(message)
messageID := insertUserMessage(c, message)
messageOut, _ := userTmpl.Execute(pongo2.Context{"Content": markdownToHTML(message), "ID": messageID.String()})
out += messageOut
}
@ -99,7 +99,7 @@ func GeneratePlaceholderHTML(message string, selectedLLMIds []string, with_user_
func GenerateMultipleMessagesHandler(c *fiber.Ctx) error {
// Step 2 generate multiple messages
// And send them one by one using events
insertArea()
insertArea(c)
selectedLLMs := lastSelectedLLMs
// Create a wait group to synchronize the goroutines
@ -121,7 +121,7 @@ func GenerateMultipleMessagesHandler(c *fiber.Ctx) error {
defer cancel() // Ensure the context is cancelled to free resources
// Determine which message function to call based on the model
var addMessageFunc func(selectedLLM LLM, selected bool) edgedb.UUID
var addMessageFunc func(c *fiber.Ctx, selectedLLM LLM, selected bool) edgedb.UUID
switch selectedLLMs[idx].Model.Company.Name {
case "openai":
addMessageFunc = addOpenaiMessage
@ -141,11 +141,11 @@ func GenerateMultipleMessagesHandler(c *fiber.Ctx) error {
var messageID edgedb.UUID
if addMessageFunc != nil {
messageID = addMessageFunc(selectedLLMs[idx], idx == 0)
messageID = addMessageFunc(c, selectedLLMs[idx], idx == 0)
}
var message Message
err := edgeClient.QuerySingle(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
SELECT Message {
id,
content,
@ -247,9 +247,9 @@ func GenerateMultipleMessagesHandler(c *fiber.Ctx) error {
return c.SendString("")
}
func addUsage(inputCost float32, outputCost float32, inputToken int32, outputToken int32, modelID string) {
func addUsage(c *fiber.Ctx, inputCost float32, outputCost float32, inputToken int32, outputToken int32, modelID string) {
// Create a new usage
err := edgeClient.Execute(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
INSERT Usage {
input_cost := <float32>$0,
output_cost := <float32>$1,

View File

@ -8,6 +8,7 @@ import (
"net/http"
"github.com/edgedb/edgedb-go"
"github.com/gofiber/fiber/v2"
)
type AnthropicChatCompletionRequest struct {
@ -36,19 +37,19 @@ type AnthropicUsage struct {
OutputTokens int32 `json:"output_tokens"`
}
func addAnthropicMessage(llm LLM, selected bool) edgedb.UUID {
Messages := getAllSelectedMessages()
func addAnthropicMessage(c *fiber.Ctx, llm LLM, selected bool) edgedb.UUID {
Messages := getAllSelectedMessages(c)
chatCompletion, err := RequestAnthropic(llm.Model.ModelID, Messages, int(llm.Model.MaxToken), float64(llm.Temperature), llm.Context)
chatCompletion, err := RequestAnthropic(c, llm.Model.ModelID, Messages, int(llm.Model.MaxToken), float64(llm.Temperature), llm.Context)
if err != nil {
fmt.Println("Error fetching user profile")
panic(err)
} else if len(chatCompletion.Content) == 0 {
fmt.Println("No response from Anthropic")
id := insertBotMessage("No response from Anthropic", selected, llm.ID)
id := insertBotMessage(c, "No response from Anthropic", selected, llm.ID)
return id
} else {
id := insertBotMessage(chatCompletion.Content[0].Text, selected, llm.ID)
id := insertBotMessage(c, chatCompletion.Content[0].Text, selected, llm.ID)
return id
}
}
@ -108,11 +109,11 @@ func TestAnthropicKey(apiKey string) bool {
return true
}
func RequestAnthropic(model string, messages []Message, maxTokens int, temperature float64, context string) (AnthropicChatCompletionResponse, error) {
func RequestAnthropic(c *fiber.Ctx, model string, messages []Message, maxTokens int, temperature float64, context string) (AnthropicChatCompletionResponse, error) {
var apiKey struct {
Key string `edgedb:"key"`
}
err := edgeClient.QuerySingle(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
SELECT Key {
key
}
@ -166,7 +167,7 @@ func RequestAnthropic(model string, messages []Message, maxTokens int, temperatu
}
var usedModelInfo ModelInfo
err = edgeClient.QuerySingle(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
SELECT ModelInfo {
inputPrice,
outputPrice
@ -180,7 +181,7 @@ func RequestAnthropic(model string, messages []Message, maxTokens int, temperatu
var inputCost float32 = float32(chatCompletionResponse.Usage.InputTokens) * usedModelInfo.InputPrice
var outputCost float32 = float32(chatCompletionResponse.Usage.OutputTokens) * usedModelInfo.OutputPrice
addUsage(inputCost, outputCost, chatCompletionResponse.Usage.InputTokens, chatCompletionResponse.Usage.OutputTokens, model)
addUsage(c, inputCost, outputCost, chatCompletionResponse.Usage.InputTokens, chatCompletionResponse.Usage.OutputTokens, model)
return chatCompletionResponse, nil
}

View File

@ -10,6 +10,7 @@ import (
"net/http"
"github.com/edgedb/edgedb-go"
"github.com/gofiber/fiber/v2"
)
type GoogleRequestMessage struct {
@ -51,20 +52,20 @@ type GoogleUsageMetadata struct {
TotalTokenCount int32 `json:"totalTokenCount"`
}
func addGoogleMessage(llm LLM, selected bool) edgedb.UUID {
Messages := getAllSelectedMessages()
func addGoogleMessage(c *fiber.Ctx, llm LLM, selected bool) edgedb.UUID {
Messages := getAllSelectedMessages(c)
chatCompletion, err := RequestGoogle(llm.Model.ModelID, Messages, float64(llm.Temperature), llm.Context)
chatCompletion, err := RequestGoogle(c, llm.Model.ModelID, Messages, float64(llm.Temperature), llm.Context)
if err != nil {
fmt.Println("Error fetching user profile")
panic(err)
} else if len(chatCompletion.Candidates) == 0 {
fmt.Println("No response from Google")
id := insertBotMessage("No response from Google", selected, llm.ID)
id := insertBotMessage(c, "No response from Google", selected, llm.ID)
return id
} else {
Content := chatCompletion.Candidates[0].Content.Parts[0].Text
id := insertBotMessage(Content, selected, llm.ID)
id := insertBotMessage(c, Content, selected, llm.ID)
return id
}
}
@ -130,9 +131,9 @@ func TestGoogleKey(apiKey string) bool {
return true
}
func RequestGoogle(model string, messages []Message, temperature float64, context string) (GoogleChatCompletionResponse, error) {
func RequestGoogle(c *fiber.Ctx, model string, messages []Message, temperature float64, context string) (GoogleChatCompletionResponse, error) {
var apiKey string
err := edgeClient.QuerySingle(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
with
filtered_keys := (
select Key {
@ -198,7 +199,7 @@ func RequestGoogle(model string, messages []Message, temperature float64, contex
}
var usedModelInfo ModelInfo
err = edgeClient.QuerySingle(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
SELECT ModelInfo {
inputPrice,
outputPrice
@ -212,7 +213,7 @@ func RequestGoogle(model string, messages []Message, temperature float64, contex
var inputCost float32 = float32(chatCompletionResponse.UsageMetadata.PromptTokenCount) * usedModelInfo.InputPrice
var outputCost float32 = float32(chatCompletionResponse.UsageMetadata.CandidatesTokenCount) * usedModelInfo.OutputPrice
addUsage(inputCost, outputCost, chatCompletionResponse.UsageMetadata.PromptTokenCount, chatCompletionResponse.UsageMetadata.CandidatesTokenCount, model)
addUsage(c, inputCost, outputCost, chatCompletionResponse.UsageMetadata.PromptTokenCount, chatCompletionResponse.UsageMetadata.CandidatesTokenCount, model)
return chatCompletionResponse, nil
}

View File

@ -11,6 +11,7 @@ import (
"net/http"
"github.com/edgedb/edgedb-go"
"github.com/gofiber/fiber/v2"
)
type GooseaiCompletionRequest struct {
@ -33,20 +34,20 @@ type GooseaiChoice struct {
Index int `json:"index"`
}
func addGooseaiMessage(llm LLM, selected bool) edgedb.UUID {
Messages := getAllSelectedMessages()
func addGooseaiMessage(c *fiber.Ctx, llm LLM, selected bool) edgedb.UUID {
Messages := getAllSelectedMessages(c)
chatCompletion, err := RequestGooseai(llm.Model.ModelID, Messages, float64(llm.Temperature))
chatCompletion, err := RequestGooseai(c, llm.Model.ModelID, Messages, float64(llm.Temperature))
if err != nil {
fmt.Println("Error fetching user profile")
panic(err)
} else if len(chatCompletion.Choices) == 0 {
fmt.Println("No response from GooseAI")
id := insertBotMessage("No response from GooseAI", selected, llm.ID)
id := insertBotMessage(c, "No response from GooseAI", selected, llm.ID)
return id
} else {
Content := chatCompletion.Choices[0].Text
id := insertBotMessage(Content, selected, llm.ID)
id := insertBotMessage(c, Content, selected, llm.ID)
return id
}
}
@ -97,9 +98,9 @@ func TestGooseaiKey(apiKey string) bool {
return true
}
func RequestGooseai(model string, messages []Message, temperature float64) (GooseaiCompletionResponse, error) {
func RequestGooseai(c *fiber.Ctx, model string, messages []Message, temperature float64) (GooseaiCompletionResponse, error) {
var apiKey string
err := edgeClient.QuerySingle(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
with
filtered_keys := (
select Key {
@ -157,7 +158,7 @@ func RequestGooseai(model string, messages []Message, temperature float64) (Goos
return GooseaiCompletionResponse{}, fmt.Errorf("error unmarshaling JSON: %w", err)
}
addUsage(0, 0, 0, 0, model)
addUsage(c, 0, 0, 0, 0, model)
return chatCompletionResponse, nil
}

View File

@ -8,6 +8,7 @@ import (
"net/http"
"github.com/edgedb/edgedb-go"
"github.com/gofiber/fiber/v2"
)
type GroqChatCompletionRequest struct {
@ -37,20 +38,20 @@ type GroqChoice struct {
Index int `json:"index"`
}
func addGroqMessage(llm LLM, selected bool) edgedb.UUID {
Messages := getAllSelectedMessages()
func addGroqMessage(c *fiber.Ctx, llm LLM, selected bool) edgedb.UUID {
Messages := getAllSelectedMessages(c)
chatCompletion, err := RequestGroq(llm.Model.ModelID, Messages, float64(llm.Temperature), llm.Context)
chatCompletion, err := RequestGroq(c, llm.Model.ModelID, Messages, float64(llm.Temperature), llm.Context)
if err != nil {
fmt.Println("Error fetching user profile")
panic(err)
} else if len(chatCompletion.Choices) == 0 {
fmt.Println("No response from Groq")
id := insertBotMessage("No response from Groq", selected, llm.ID)
id := insertBotMessage(c, "No response from Groq", selected, llm.ID)
return id
} else {
Content := chatCompletion.Choices[0].Message.Content
id := insertBotMessage(Content, selected, llm.ID)
id := insertBotMessage(c, Content, selected, llm.ID)
return id
}
}
@ -108,9 +109,9 @@ func TestGroqKey(apiKey string) bool {
return true
}
func RequestGroq(model string, messages []Message, temperature float64, context string) (GroqChatCompletionResponse, error) {
func RequestGroq(c *fiber.Ctx, model string, messages []Message, temperature float64, context string) (GroqChatCompletionResponse, error) {
var apiKey string
err := edgeClient.QuerySingle(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
with
filtered_keys := (
select Key {
@ -163,7 +164,7 @@ func RequestGroq(model string, messages []Message, temperature float64, context
}
var usedModelInfo ModelInfo
edgeClient.QuerySingle(edgeCtx, `
edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
SELECT ModelInfo {
inputPrice,
outputPrice
@ -174,7 +175,7 @@ func RequestGroq(model string, messages []Message, temperature float64, context
var inputCost float32 = float32(chatCompletionResponse.Usage.PromptTokens) * usedModelInfo.InputPrice
var outputCost float32 = float32(chatCompletionResponse.Usage.CompletionTokens) * usedModelInfo.OutputPrice
addUsage(inputCost, outputCost, chatCompletionResponse.Usage.PromptTokens, chatCompletionResponse.Usage.CompletionTokens, model)
addUsage(c, inputCost, outputCost, chatCompletionResponse.Usage.PromptTokens, chatCompletionResponse.Usage.CompletionTokens, model)
return chatCompletionResponse, nil
}

View File

@ -8,6 +8,7 @@ import (
"net/http"
"github.com/edgedb/edgedb-go"
"github.com/gofiber/fiber/v2"
)
type HuggingfaceChatCompletionRequest struct {
@ -37,25 +38,25 @@ type HuggingfaceChoice struct {
Index int `json:"index"`
}
func addHuggingfaceMessage(llm LLM, selected bool) edgedb.UUID {
Messages := getAllSelectedMessages()
func addHuggingfaceMessage(c *fiber.Ctx, llm LLM, selected bool) edgedb.UUID {
Messages := getAllSelectedMessages(c)
chatCompletion, err := RequestHuggingface(llm, Messages, float64(llm.Temperature))
chatCompletion, err := RequestHuggingface(c, llm, Messages, float64(llm.Temperature))
if err != nil {
fmt.Println("Error fetching user profile")
panic(err)
} else if len(chatCompletion.Choices) == 0 {
fmt.Println("No response from Endpoint")
id := insertBotMessage("No response from Endpoint", selected, llm.ID)
id := insertBotMessage(c, "No response from Endpoint", selected, llm.ID)
return id
} else {
Content := chatCompletion.Choices[0].Message.Content
id := insertBotMessage(Content, selected, llm.ID)
id := insertBotMessage(c, Content, selected, llm.ID)
return id
}
}
func RequestHuggingface(llm LLM, messages []Message, temperature float64) (HuggingfaceChatCompletionResponse, error) {
func RequestHuggingface(c *fiber.Ctx, llm LLM, messages []Message, temperature float64) (HuggingfaceChatCompletionResponse, error) {
url := llm.Endpoint.Endpoint
requestBody := HuggingfaceChatCompletionRequest{
@ -96,7 +97,7 @@ func RequestHuggingface(llm LLM, messages []Message, temperature float64) (Huggi
return HuggingfaceChatCompletionResponse{}, fmt.Errorf("error unmarshaling JSON: %w", err)
}
addUsage(0, 0, 0, 0, llm.Model.ModelID)
addUsage(c, 0, 0, 0, 0, llm.Model.ModelID)
return chatCompletionResponse, nil
}

View File

@ -8,6 +8,7 @@ import (
"net/http"
"github.com/edgedb/edgedb-go"
"github.com/gofiber/fiber/v2"
)
type MistralChatCompletionRequest struct {
@ -36,19 +37,19 @@ type MistralChoice struct {
Index int `json:"index"`
}
func addMistralMessage(llm LLM, selected bool) edgedb.UUID {
Messages := getAllSelectedMessages()
func addMistralMessage(c *fiber.Ctx, llm LLM, selected bool) edgedb.UUID {
Messages := getAllSelectedMessages(c)
chatCompletion, err := RequestMistral(llm.Model.ModelID, Messages, float64(llm.Temperature), llm.Context)
chatCompletion, err := RequestMistral(c, llm.Model.ModelID, Messages, float64(llm.Temperature), llm.Context)
if err != nil {
fmt.Println("Error fetching user profile")
panic(err)
} else if len(chatCompletion.Choices) == 0 {
id := insertBotMessage("No response from Mistral", selected, llm.ID)
id := insertBotMessage(c, "No response from Mistral", selected, llm.ID)
return id
} else {
Content := chatCompletion.Choices[0].Message.Content
id := insertBotMessage(Content, selected, llm.ID)
id := insertBotMessage(c, Content, selected, llm.ID)
return id
}
}
@ -113,9 +114,9 @@ func TestMistralKey(apiKey string) bool {
return true
}
func RequestMistral(model string, messages []Message, temperature float64, context string) (MistralChatCompletionResponse, error) {
func RequestMistral(c *fiber.Ctx, model string, messages []Message, temperature float64, context string) (MistralChatCompletionResponse, error) {
var apiKey string
err := edgeClient.QuerySingle(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
with
filtered_keys := (
select Key {
@ -169,7 +170,7 @@ func RequestMistral(model string, messages []Message, temperature float64, conte
}
var usedModelInfo ModelInfo
err = edgeClient.QuerySingle(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
SELECT ModelInfo {
inputPrice,
outputPrice
@ -187,7 +188,7 @@ func RequestMistral(model string, messages []Message, temperature float64, conte
var inputCost float32 = float32(chatCompletionResponse.Usage.PromptTokens) * usedModelInfo.InputPrice
var outputCost float32 = float32(chatCompletionResponse.Usage.CompletionTokens) * usedModelInfo.OutputPrice
addUsage(inputCost, outputCost, chatCompletionResponse.Usage.PromptTokens, chatCompletionResponse.Usage.CompletionTokens, model)
addUsage(c, inputCost, outputCost, chatCompletionResponse.Usage.PromptTokens, chatCompletionResponse.Usage.CompletionTokens, model)
return chatCompletionResponse, nil
}

View File

@ -8,6 +8,7 @@ import (
"net/http"
"github.com/edgedb/edgedb-go"
"github.com/gofiber/fiber/v2"
)
type OpenaiChatCompletionRequest struct {
@ -37,20 +38,20 @@ type OpenaiChoice struct {
Index int `json:"index"`
}
func addOpenaiMessage(llm LLM, selected bool) edgedb.UUID {
Messages := getAllSelectedMessages()
func addOpenaiMessage(c *fiber.Ctx, llm LLM, selected bool) edgedb.UUID {
Messages := getAllSelectedMessages(c)
chatCompletion, err := RequestOpenai(llm.Model.ModelID, Messages, float64(llm.Temperature), llm.Context)
chatCompletion, err := RequestOpenai(c, llm.Model.ModelID, Messages, float64(llm.Temperature), llm.Context)
if err != nil {
fmt.Println("Error fetching user profile")
panic(err)
} else if len(chatCompletion.Choices) == 0 {
fmt.Println("No response from OpenAI")
id := insertBotMessage("No response from OpenAI", selected, llm.ID)
id := insertBotMessage(c, "No response from OpenAI", selected, llm.ID)
return id
} else {
Content := chatCompletion.Choices[0].Message.Content
id := insertBotMessage(Content, selected, llm.ID)
id := insertBotMessage(c, Content, selected, llm.ID)
return id
}
}
@ -108,9 +109,9 @@ func TestOpenaiKey(apiKey string) bool {
return true
}
func RequestOpenai(model string, messages []Message, temperature float64, context string) (OpenaiChatCompletionResponse, error) {
func RequestOpenai(c *fiber.Ctx, model string, messages []Message, temperature float64, context string) (OpenaiChatCompletionResponse, error) {
var apiKey string
err := edgeClient.QuerySingle(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
with
filtered_keys := (
select Key {
@ -163,7 +164,7 @@ func RequestOpenai(model string, messages []Message, temperature float64, contex
}
var usedModelInfo ModelInfo
err = edgeClient.QuerySingle(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
SELECT ModelInfo {
inputPrice,
outputPrice
@ -177,7 +178,7 @@ func RequestOpenai(model string, messages []Message, temperature float64, contex
var inputCost float32 = float32(chatCompletionResponse.Usage.PromptTokens) * usedModelInfo.InputPrice
var outputCost float32 = float32(chatCompletionResponse.Usage.CompletionTokens) * usedModelInfo.OutputPrice
addUsage(inputCost, outputCost, chatCompletionResponse.Usage.PromptTokens, chatCompletionResponse.Usage.CompletionTokens, model)
addUsage(c, inputCost, outputCost, chatCompletionResponse.Usage.PromptTokens, chatCompletionResponse.Usage.CompletionTokens, model)
return chatCompletionResponse, nil
}

View File

@ -15,18 +15,18 @@ import (
)
func PricingTableHandler(c *fiber.Ctx) error {
return c.SendString(generatePricingTableChatHTML())
return c.SendString(generatePricingTableChatHTML(c))
}
func generatePricingTableChatHTML() string {
func generatePricingTableChatHTML(c *fiber.Ctx) string {
var result User
err := edgeClient.QuerySingle(edgeCtx, "SELECT global currentUser { stripe_id, email } LIMIT 1;", &result)
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, "SELECT global currentUser { stripe_id, email } LIMIT 1;", &result)
if err != nil {
fmt.Println("Error getting user")
panic(err)
}
clientSecretSession := CreateClientSecretSession()
clientSecretSession := CreateClientSecretSession(c)
// TODO Replace by live API call
stripeTable := `
@ -83,9 +83,9 @@ func CreateNewStripeCustomer(name string, email string) string {
return result.ID
}
func IsCurrentUserSubscribed() bool {
func IsCurrentUserSubscribed(c *fiber.Ctx) bool {
var user User
err := edgeClient.QuerySingle(edgeCtx, "SELECT global currentUser { stripe_id } LIMIT 1;", &user)
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, "SELECT global currentUser { stripe_id } LIMIT 1;", &user)
if err != nil {
fmt.Println("Error getting user")
panic(err)
@ -102,10 +102,10 @@ func IsCurrentUserSubscribed() bool {
return result.Subscriptions.Data[0].Plan.Product.ID == "prod_PnDjBBwvQN36cQ" && result.Subscriptions.Data[0].Plan.Active
}
func IsCurrentUserLimiteReached() bool {
func IsCurrentUserLimiteReached(c *fiber.Ctx) bool {
// Count the number of Usage for the current user
var count int64
err := edgeClient.QuerySingle(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
WITH
U := (
SELECT Usage
@ -120,9 +120,9 @@ func IsCurrentUserLimiteReached() bool {
return count >= 500
}
func CreateClientSecretSession() string {
func CreateClientSecretSession(c *fiber.Ctx) string {
var user User
err := edgeClient.QuerySingle(edgeCtx, "SELECT global currentUser { stripe_id } LIMIT 1;", &user)
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, "SELECT global currentUser { stripe_id } LIMIT 1;", &user)
if err != nil {
fmt.Println("Error getting user")
panic(err)

View File

@ -9,11 +9,12 @@ import (
"time"
"github.com/edgedb/edgedb-go"
"github.com/gofiber/fiber/v2"
)
// So I have one client and one context for the database. All query use the same and it work well so far.
var edgeCtx context.Context
var edgeClient *edgedb.Client
var edgeGlobalClient *edgedb.Client
// I will not put a comment on all type, I think they are self-explaining.
type Identity struct {
@ -128,19 +129,17 @@ func init() {
}
edgeCtx = ctx
edgeClient = client
edgeGlobalClient = client
}
func checkIfLogin() bool {
var result User
err := edgeClient.QuerySingle(edgeCtx, "SELECT global currentUser LIMIT 1;", &result)
return err == nil
func checkIfLogin(c *fiber.Ctx) bool {
return c.Cookies("jade-edgedb-auth-token", "") != ""
}
func insertArea() (edgedb.UUID, int64) {
func insertArea(c *fiber.Ctx) (edgedb.UUID, int64) {
// Insert a new area.
var inserted struct{ id edgedb.UUID }
err := edgeClient.QuerySingle(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
WITH
positionVar := count((SELECT Area FILTER .conversation = global currentConversation)) + 1
INSERT Area {
@ -154,7 +153,7 @@ func insertArea() (edgedb.UUID, int64) {
}
var positionSet struct{ position int64 }
err = edgeClient.QuerySingle(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
SELECT Area {
position,
}
@ -169,10 +168,10 @@ func insertArea() (edgedb.UUID, int64) {
return inserted.id, positionSet.position
}
func insertUserMessage(content string) edgedb.UUID {
func insertUserMessage(c *fiber.Ctx, content string) edgedb.UUID {
// Insert a new user.
var lastArea Area
err := edgeClient.QuerySingle(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
SELECT Area {
id
}
@ -186,7 +185,7 @@ func insertUserMessage(content string) edgedb.UUID {
}
var inserted struct{ id edgedb.UUID } // TODO: Maybe remove that hard code LLM
err = edgeClient.QuerySingle(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
INSERT Message {
role := <str>$0,
content := <str>$1,
@ -208,9 +207,9 @@ func insertUserMessage(content string) edgedb.UUID {
return inserted.id
}
func insertBotMessage(content string, selected bool, llmUUID edgedb.UUID) edgedb.UUID {
func insertBotMessage(c *fiber.Ctx, content string, selected bool, llmUUID edgedb.UUID) edgedb.UUID {
var lastArea Area
err := edgeClient.QuerySingle(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
SELECT Area {
id
}
@ -224,7 +223,7 @@ func insertBotMessage(content string, selected bool, llmUUID edgedb.UUID) edgedb
}
var inserted struct{ id edgedb.UUID }
err = edgeClient.QuerySingle(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
INSERT Message {
role := <str>$0,
content := <str>$2,
@ -253,15 +252,15 @@ func insertBotMessage(content string, selected bool, llmUUID edgedb.UUID) edgedb
return inserted.id
}
func getAllSelectedMessages() []Message {
func getAllSelectedMessages(c *fiber.Ctx) []Message {
// If no CurrentUser, return an empty array
if !checkIfLogin() {
if !checkIfLogin(c) {
return []Message{}
}
var messages []Message
err := edgeClient.Query(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Query(edgeCtx, `
SELECT Message {
id,
selected,
@ -287,9 +286,9 @@ func getAllSelectedMessages() []Message {
return messages
}
func checkIfHaveKey() bool {
func checkIfHaveKey(c *fiber.Ctx) bool {
var keys []Key
err := edgeClient.Query(edgeCtx, "SELECT global currentUser.setting.keys", &keys)
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Query(edgeCtx, "SELECT global currentUser.setting.keys", &keys)
if err != nil {
panic(err)
}

View File

@ -210,7 +210,7 @@ func handleCallbackSignup(c *fiber.Ctx) error {
fmt.Println("Error parsing UUID")
panic(err)
}
err = edgeClient.QuerySingle(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
SELECT ext::auth::Identity {
issuer
} FILTER .id = <uuid>$0
@ -235,7 +235,7 @@ func handleCallbackSignup(c *fiber.Ctx) error {
stripCustID := CreateNewStripeCustomer(providerName, providerEmail)
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
INSERT User {
stripe_id := <str>$0,
email := <str>$1,
@ -254,9 +254,7 @@ func handleCallbackSignup(c *fiber.Ctx) error {
panic(err)
}
edgeClient = edgeClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": tokenResponse.AuthToken})
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": tokenResponse.AuthToken}).Execute(edgeCtx, `
INSERT Conversation {
name := 'Default',
user := global currentUser,
@ -313,14 +311,10 @@ func handleCallback(c *fiber.Ctx) error {
SameSite: "Strict",
})
edgeClient = edgeClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": tokenResponse.AuthToken})
return c.Redirect("/", fiber.StatusPermanentRedirect)
}
func handleSignOut(c *fiber.Ctx) error {
c.ClearCookie("jade-edgedb-auth-token")
edgeClient = edgeClient.WithoutGlobals("ext::auth::client_token")
return c.Redirect("/", fiber.StatusTemporaryRedirect)
}

36
main.go
View File

@ -183,7 +183,7 @@ func addKeys(c *fiber.Ctx) error {
}
// Check if the company key already exists
err := edgeClient.QuerySingle(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
select exists (
select global currentUser.setting.keys
filter .company.name = "openai"
@ -195,7 +195,7 @@ func addKeys(c *fiber.Ctx) error {
}
if Exists {
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
UPDATE Key filter .company.name = <str>$0 AND .key = <str>$1
SET {
key := <str>$1,
@ -206,7 +206,7 @@ func addKeys(c *fiber.Ctx) error {
panic(err)
}
} else {
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
WITH
c := (SELECT Company FILTER .name = "openai" LIMIT 1)
UPDATE global currentUser.setting
@ -233,7 +233,7 @@ func addKeys(c *fiber.Ctx) error {
}
// Check if the company key already exists
err := edgeClient.QuerySingle(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
select exists (
select global currentUser.setting.keys
filter .company.name = "anthropic"
@ -245,7 +245,7 @@ func addKeys(c *fiber.Ctx) error {
}
if Exists {
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
UPDATE Key filter .company.name = "anthropic" AND .key = <str>$0
SET {
key := <str>$0,
@ -256,7 +256,7 @@ func addKeys(c *fiber.Ctx) error {
panic(err)
}
} else {
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
WITH
c := (SELECT Company FILTER .name = "anthropic" LIMIT 1)
UPDATE global currentUser.setting
@ -283,7 +283,7 @@ func addKeys(c *fiber.Ctx) error {
}
// Check if the company key already exists
err := edgeClient.QuerySingle(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
select exists (
select global currentUser.setting.keys
filter .company.name = "mistral"
@ -295,7 +295,7 @@ func addKeys(c *fiber.Ctx) error {
}
if Exists {
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
UPDATE Key filter .company.name = "mistral" AND .key = <str>$0
SET {
key := <str>$0,
@ -306,7 +306,7 @@ func addKeys(c *fiber.Ctx) error {
panic(err)
}
} else {
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
WITH
c := (SELECT Company FILTER .name = "mistral" LIMIT 1)
UPDATE global currentUser.setting
@ -333,7 +333,7 @@ func addKeys(c *fiber.Ctx) error {
}
// Check if the company key already exists
err := edgeClient.QuerySingle(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
select exists (
select global currentUser.setting.keys
filter .company.name = "groq"
@ -345,7 +345,7 @@ func addKeys(c *fiber.Ctx) error {
}
if Exists {
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
UPDATE Key filter .company.name = "groq" AND .key = <str>$0
SET {
key := <str>$0,
@ -356,7 +356,7 @@ func addKeys(c *fiber.Ctx) error {
panic(err)
}
} else {
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
WITH
c := (SELECT Company FILTER .name = "groq" LIMIT 1)
UPDATE global currentUser.setting
@ -383,7 +383,7 @@ func addKeys(c *fiber.Ctx) error {
}
// Check if the company key already exists
err := edgeClient.QuerySingle(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
select exists (
select global currentUser.setting.keys
filter .company.name = "gooseai"
@ -395,7 +395,7 @@ func addKeys(c *fiber.Ctx) error {
}
if Exists {
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
UPDATE Key filter .company.name = "gooseai" AND .key = <str>$0
SET {
key := <str>$0,
@ -406,7 +406,7 @@ func addKeys(c *fiber.Ctx) error {
panic(err)
}
} else {
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
WITH
c := (SELECT Company FILTER .name = "gooseai" LIMIT 1)
UPDATE global currentUser.setting
@ -433,7 +433,7 @@ func addKeys(c *fiber.Ctx) error {
}
// Check if the company key already exists
err := edgeClient.QuerySingle(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
select exists (
select global currentUser.setting.keys
filter .company.name = "google"
@ -445,7 +445,7 @@ func addKeys(c *fiber.Ctx) error {
}
if Exists {
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
UPDATE Key filter .company.name = "google" AND .key = <str>$0
SET {
key := <str>$0,
@ -456,7 +456,7 @@ func addKeys(c *fiber.Ctx) error {
panic(err)
}
} else {
err = edgeClient.Execute(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Execute(edgeCtx, `
WITH
c := (SELECT Company FILTER .name = "google" LIMIT 1)
UPDATE global currentUser.setting

View File

@ -8,6 +8,7 @@ import (
"fmt"
"regexp"
"github.com/gofiber/fiber/v2"
"github.com/yuin/goldmark"
highlighting "github.com/yuin/goldmark-highlighting"
"github.com/yuin/goldmark/parser"
@ -77,8 +78,8 @@ func addCodeHeader(htmlContent string, languages []string) string {
return updatedHTML
}
func getExistingKeys() (bool, bool, bool, bool, bool, bool) {
if edgeClient == nil {
func getExistingKeys(c *fiber.Ctx) (bool, bool, bool, bool, bool, bool) {
if edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}) == nil {
return false, false, false, false, false, false
}
@ -91,7 +92,7 @@ func getExistingKeys() (bool, bool, bool, bool, bool, bool) {
googleExists bool
)
err := edgeClient.QuerySingle(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
select exists (
select global currentUser.setting.keys
filter .company.name = "openai"
@ -102,7 +103,7 @@ func getExistingKeys() (bool, bool, bool, bool, bool, bool) {
panic(err)
}
err = edgeClient.QuerySingle(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
select exists (
select global currentUser.setting.keys
filter .company.name = "anthropic"
@ -113,7 +114,7 @@ func getExistingKeys() (bool, bool, bool, bool, bool, bool) {
panic(err)
}
err = edgeClient.QuerySingle(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
select exists (
select global currentUser.setting.keys
filter .company.name = "mistral"
@ -124,7 +125,7 @@ func getExistingKeys() (bool, bool, bool, bool, bool, bool) {
panic(err)
}
err = edgeClient.QuerySingle(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
select exists (
select global currentUser.setting.keys
filter .company.name = "groq"
@ -135,7 +136,7 @@ func getExistingKeys() (bool, bool, bool, bool, bool, bool) {
panic(err)
}
err = edgeClient.QuerySingle(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
select exists (
select global currentUser.setting.keys
filter .company.name = "gooseai"
@ -146,7 +147,7 @@ func getExistingKeys() (bool, bool, bool, bool, bool, bool) {
panic(err)
}
err = edgeClient.QuerySingle(edgeCtx, `
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).QuerySingle(edgeCtx, `
select exists (
select global currentUser.setting.keys
filter .company.name = "google"
@ -207,10 +208,10 @@ func Message2RequestMessage(messages []Message, context string) []RequestMessage
}
}
func GetAvailableModels() []ModelInfo {
func GetAvailableModels(c *fiber.Ctx) []ModelInfo {
// TODO Filter if key is not available
var models []ModelInfo
err := edgeClient.Query(edgeCtx, `
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token", "")}).Query(edgeCtx, `
SELECT ModelInfo {
modelID,
name,