diff --git a/Chat.go b/Chat.go
index 5f1f31e..4749d38 100644
--- a/Chat.go
+++ b/Chat.go
@@ -43,6 +43,8 @@ func DeleteMessageHandler(c *fiber.Ctx) error {
}
func LoadChatHandler(c *fiber.Ctx) error {
+ deleteLLMtoDelete()
+
if checkIfLogin() {
if getCurrentUserKeys() == nil {
return c.SendString(generateEnterKeyChatHTML())
@@ -134,6 +136,7 @@ func GetMessageContentHandler(c *fiber.Ctx) error {
SELECT Message {
content,
llm : {
+ name,
modelInfo : {
modelID,
name,
@@ -153,7 +156,7 @@ func GetMessageContentHandler(c *fiber.Ctx) error {
out := "
"
out += ""
@@ -222,9 +225,11 @@ func generatePricingTableChatHTML() string {
closeBtn := `
`
@@ -425,10 +430,7 @@ func LoadKeysHandler(c *fiber.Ctx) error {
return c.SendString(out)
}
-func LoadModelSelectionHandler(c *fiber.Ctx) error {
- if !checkIfLogin() || !checkIfHaveKey() {
- return c.SendString("")
- }
+func GenerateModelPopoverHTML(refresh bool) string {
openaiExists, anthropicExists, mistralExists, groqExists, gooseaiExists, googleExists := getExistingKeys()
var llms []LLM
@@ -447,7 +449,7 @@ func LoadModelSelectionHandler(c *fiber.Ctx) error {
}
}
}
- FILTER .user = global currentUser AND .name != 'none'
+ FILTER .user = global currentUser AND .name != 'none' AND .to_delete = false
`, &llms)
if err != nil {
panic(err)
@@ -460,6 +462,8 @@ func LoadModelSelectionHandler(c *fiber.Ctx) error {
// }
//}
+ modelInfos := GetAvailableModels()
+
out, err := pongo2.Must(pongo2.FromFile("views/partials/popover-models.html")).Execute(pongo2.Context{
"IsLogin": checkIfLogin(),
"OpenaiExists": openaiExists,
@@ -470,12 +474,20 @@ func LoadModelSelectionHandler(c *fiber.Ctx) error {
"GoogleExists": googleExists,
"AnyExists": openaiExists || anthropicExists || mistralExists || groqExists || gooseaiExists || googleExists,
"LLMs": llms,
+ "ModelInfos": modelInfos,
+ "DeleteUpdate": refresh,
})
if err != nil {
panic(err)
}
+ return out
+}
- return c.SendString(out)
+func LoadModelSelectionHandler(c *fiber.Ctx) error {
+ if !checkIfLogin() || !checkIfHaveKey() {
+ return c.SendString("")
+ }
+ return c.SendString(GenerateModelPopoverHTML(false))
}
func LoadSettingsHandler(c *fiber.Ctx) error {
diff --git a/LLM.go b/LLM.go
index d223d98..2c5ecee 100644
--- a/LLM.go
+++ b/LLM.go
@@ -1,31 +1,77 @@
package main
import (
+ "encoding/json"
+
"github.com/edgedb/edgedb-go"
- "github.com/flosch/pongo2"
"github.com/gofiber/fiber/v2"
)
// LLM stuff
func deleteLLM(c *fiber.Ctx) error {
- id := c.FormValue("id")
- idUUID, _ := edgedb.ParseUUID(id)
+ var selectedLLMIds []string
+ err := json.Unmarshal([]byte(c.FormValue("selectedLLMIds")), &selectedLLMIds)
+ if err != nil {
+ // Handle the error
+ panic(err)
+ }
+ for _, id := range selectedLLMIds {
+ idUUID, _ := edgedb.ParseUUID(id)
+ err := edgeClient.Execute(edgeCtx, `
+ UPDATE LLM
+ FILTER .id =
$0 AND .user = global currentUser
+ SET {
+ to_delete := true
+ };
+ `, idUUID)
+ if err != nil {
+ panic(err)
+ }
+ }
+
+ deleteLLMtoDelete()
+
+ return c.SendString(GenerateModelPopoverHTML(true))
+}
+
+func deleteLLMtoDelete() {
err := edgeClient.Execute(edgeCtx, `
- DELETE LLM
- FILTER .id = $0;
- `, idUUID)
+ delete LLM
+ filter .to_delete = true and not exists(
+ select Message filter .llm = LLM
+ );
+ `)
+ if err != nil {
+ panic(err)
+ }
+}
+
+func createLLM(c *fiber.Ctx) error {
+ name := c.FormValue("model-name-input")
+ modelID := c.FormValue("selectedLLMId")
+ temperature := c.FormValue("temperature-slider")
+ systemPrompt := c.FormValue("model-prompt-input")
+
+ // Transform the temperature to a float
+ temperatureparsed, err := json.Marshal(temperature)
+ if err != nil {
+ panic(err)
+ }
+ temperatureFloat := float32(temperatureparsed[1])
+
+ err = edgeClient.Execute(edgeCtx, `
+ INSERT LLM {
+ name := $0,
+ context := $1,
+ temperature := $2,
+ modelInfo := (SELECT ModelInfo FILTER .modelID = $3 LIMIT 1),
+ user := global currentUser
+ }
+ `, name, systemPrompt, temperatureFloat, modelID)
if err != nil {
panic(err)
}
- return c.SendString("")
-}
-
-func openLlmModal(c *fiber.Ctx) error {
- out, err := pongo2.Must(pongo2.FromFile("views/partials/modal-llm-setting.html")).Execute(pongo2.Context{})
- if err != nil {
- panic(err)
- }
- return c.SendString(out)
+ return c.SendString(GenerateModelPopoverHTML(true))
}
diff --git a/Request.go b/Request.go
index d9f5a5a..1dce59c 100644
--- a/Request.go
+++ b/Request.go
@@ -32,8 +32,6 @@ func GeneratePlaceholderHandler(c *fiber.Ctx) error {
panic(err)
}
- fmt.Println("SelectedLLMIds:", selectedLLMIds)
-
var selectedLLMs []LLM
var selectedLLM LLM
diff --git a/dbschema/default.esdl b/dbschema/default.esdl
index fe91123..7cb99e4 100644
--- a/dbschema/default.esdl
+++ b/dbschema/default.esdl
@@ -78,8 +78,15 @@ module default {
required name: str;
required context: str;
required temperature: float32;
- required modelInfo: ModelInfo;
- required user: User;
+ required to_delete: bool {
+ default := false;
+ };
+ required modelInfo: ModelInfo {
+ on target delete allow;
+ };
+ required user: User {
+ on target delete allow;
+ };
}
type Company {
diff --git a/dbschema/migrations/00030-m1qq2mn.edgeql b/dbschema/migrations/00030-m1qq2mn.edgeql
new file mode 100644
index 0000000..7b80f40
--- /dev/null
+++ b/dbschema/migrations/00030-m1qq2mn.edgeql
@@ -0,0 +1,12 @@
+CREATE MIGRATION m1qq2mnk2l2bepeoatd2gxq2ygi73apnxwojog2g533h36e576rx6q
+ ONTO m1cokoqujl36nbvnldmofdwszcmsp6ulre23r5gx52d65aqnr64cca
+{
+ ALTER TYPE default::LLM {
+ ALTER LINK modelInfo {
+ ON TARGET DELETE ALLOW;
+ };
+ ALTER LINK user {
+ ON TARGET DELETE ALLOW;
+ };
+ };
+};
diff --git a/dbschema/migrations/00031-m1q5wil.edgeql b/dbschema/migrations/00031-m1q5wil.edgeql
new file mode 100644
index 0000000..2f7807d
--- /dev/null
+++ b/dbschema/migrations/00031-m1q5wil.edgeql
@@ -0,0 +1,9 @@
+CREATE MIGRATION m1q5wildsqhzj62drznyoi2bahpej6errkzhol7xs2qwootecjlcdq
+ ONTO m1qq2mnk2l2bepeoatd2gxq2ygi73apnxwojog2g533h36e576rx6q
+{
+ ALTER TYPE default::LLM {
+ CREATE REQUIRED PROPERTY to_delete: std::bool {
+ SET REQUIRED USING ({false});
+ };
+ };
+};
diff --git a/dbschema/migrations/00032-m1nonmd.edgeql b/dbschema/migrations/00032-m1nonmd.edgeql
new file mode 100644
index 0000000..b79466c
--- /dev/null
+++ b/dbschema/migrations/00032-m1nonmd.edgeql
@@ -0,0 +1,9 @@
+CREATE MIGRATION m1nonmddagbu3p7dcqmy3bvxkwinjfosg7iuna5xxwruig4rcnr4yq
+ ONTO m1q5wildsqhzj62drznyoi2bahpej6errkzhol7xs2qwootecjlcdq
+{
+ ALTER TYPE default::LLM {
+ ALTER PROPERTY to_delete {
+ SET default := false;
+ };
+ };
+};
diff --git a/main.go b/main.go
index a2d3e74..8675c2a 100644
--- a/main.go
+++ b/main.go
@@ -77,7 +77,6 @@ func main() {
// Settings routes
app.Post("/addKeys", addKeys)
- app.Get("/modal", openLlmModal)
// Popovers
app.Get("/loadModelSelection", LoadModelSelectionHandler)
@@ -93,6 +92,7 @@ func main() {
// LLM
app.Get("deleteLLM", deleteLLM)
+ app.Post("/createLLM", createLLM)
app.Get("/test", func(c *fiber.Ctx) error {
fmt.Println("Hello from test")
diff --git a/utils.go b/utils.go
index 9ef453d..a967dbd 100644
--- a/utils.go
+++ b/utils.go
@@ -133,3 +133,22 @@ func Message2RequestMessage(messages []Message) []RequestMessage {
}
return m
}
+
+func GetAvailableModels() []ModelInfo {
+ // TODO Filter if key is not available
+ var models []ModelInfo
+ err := edgeClient.Query(edgeCtx, `
+ SELECT ModelInfo {
+ modelID,
+ name,
+ company : {
+ name,
+ icon
+ }
+ } FILTER .modelID != 'none'
+ `, &models)
+ if err != nil {
+ panic(err)
+ }
+ return models
+}
diff --git a/views/chat.html b/views/chat.html
index 6b491f5..c68bb59 100644
--- a/views/chat.html
+++ b/views/chat.html
@@ -3,7 +3,7 @@