diff --git a/example/webui/agentpool.go b/example/webui/agentpool.go index a3cf60d..36d3e79 100644 --- a/example/webui/agentpool.go +++ b/example/webui/agentpool.go @@ -465,6 +465,14 @@ func (a *AgentPool) GetAgent(name string) *Agent { return a.agents[name] } +func (a *AgentPool) GetConfig(name string) *AgentConfig { + agent, exists := a.pool[name] + if !exists { + return nil + } + return &agent +} + func (a *AgentPool) GetManager(name string) Manager { return a.managers[name] } diff --git a/example/webui/app.go b/example/webui/app.go index 63ece10..f192a44 100644 --- a/example/webui/app.go +++ b/example/webui/app.go @@ -2,6 +2,7 @@ package main import ( "bytes" + "encoding/json" "fmt" "net/http" "os" @@ -30,7 +31,6 @@ func (a *App) KnowledgeBaseReset(db *InMemoryDatabase) func(c *fiber.Ctx) error func (a *App) KnowledgeBaseFile(db *InMemoryDatabase) func(c *fiber.Ctx) error { return func(c *fiber.Ctx) error { // https://golang.withcodeexample.com/blog/file-upload-handling-golang-fiber-guide/ - // Handle file upload logic file, err := c.FormFile("file") if err != nil { // Handle error @@ -179,6 +179,59 @@ func (a *App) Create(pool *AgentPool) func(c *fiber.Ctx) error { } } +func (a *App) ExportAgent(pool *AgentPool) func(c *fiber.Ctx) error { + return func(c *fiber.Ctx) error { + agent := pool.GetConfig(c.Params("name")) + if agent == nil { + return c.Status(http.StatusNotFound).SendString("Agent not found") + } + + c.Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s.json", agent.Name)) + return c.JSON(agent) + } +} + +func (a *App) ImportAgent(pool *AgentPool) func(c *fiber.Ctx) error { + return func(c *fiber.Ctx) error { + file, err := c.FormFile("file") + if err != nil { + // Handle error + return err + } + + os.MkdirAll("./uploads", os.ModePerm) + + destination := fmt.Sprintf("./uploads/%s", file.Filename) + if err := c.SaveFile(file, destination); err != nil { + // Handle error + return err + } + + data, err := os.ReadFile(destination) + if err != nil { + return err + } + + config := AgentConfig{} + if err := json.Unmarshal(data, &config); err != nil { + return err + } + + fmt.Println("Importing agent", config.Name) + + if config.Name == "" { + c.Status(http.StatusBadRequest).SendString("Name is required") + return nil + } + + if err := pool.CreateAgent(config.Name, &config); err != nil { + c.Status(http.StatusInternalServerError).SendString(err.Error()) + return nil + } + return c.Redirect("/agents") + } +} + func (a *App) Chat(pool *AgentPool) func(c *fiber.Ctx) error { return func(c *fiber.Ctx) error { payload := struct { diff --git a/example/webui/routes.go b/example/webui/routes.go index a580d81..2109642 100644 --- a/example/webui/routes.go +++ b/example/webui/routes.go @@ -91,6 +91,14 @@ func RegisterRoutes(webapp *fiber.App, pool *AgentPool, db *InMemoryDatabase, ap }) }) + webapp.Get("/settings/:name", func(c *fiber.Ctx) error { + return c.Render("views/settings", fiber.Map{ + // "Character": agent.Character, + "Name": c.Params("name"), + }) + }) + webapp.Post("/settings/import", app.ImportAgent(pool)) + webapp.Get("/settings/export/:name", app.ExportAgent(pool)) } var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") diff --git a/example/webui/views/agents.html b/example/webui/views/agents.html index 35d2b1f..6ff957b 100644 --- a/example/webui/views/agents.html +++ b/example/webui/views/agents.html @@ -47,7 +47,7 @@ Stop - Delete + Settings @@ -79,8 +79,8 @@ - - Delete + + Settings @@ -92,7 +92,19 @@ diff --git a/example/webui/views/settings.html b/example/webui/views/settings.html new file mode 100644 index 0000000..4d70ffe --- /dev/null +++ b/example/webui/views/settings.html @@ -0,0 +1,72 @@ + + + + Agent settings {{.Name}} + {{template "views/partials/header"}} + + + + {{template "views/partials/menu"}} +
+

Agent settings - {{.Name}}

+
+
+ +
+

Export

+ Export +
+ +
+

Danger section

+ + Delete + +
+ +
+ + +