diff --git a/.gitignore b/.gitignore index 7c3252c..659f466 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ models/ data/ -example/webui/pool -uploads/ \ No newline at end of file +pool +uploads/ +local-agent-framework +localagent \ No newline at end of file diff --git a/Dockerfile.webui b/Dockerfile.webui index e17bb6e..2f5eb22 100644 --- a/Dockerfile.webui +++ b/Dockerfile.webui @@ -17,7 +17,7 @@ COPY . /work # Set the current work directory inside the container WORKDIR /work -RUN go build -ldflags="$LDFLAGS" -o webui ./example/webui +RUN go build -ldflags="$LDFLAGS" -o localagent ./ FROM scratch @@ -26,4 +26,4 @@ COPY --from=builder /work/webui /webui COPY --from=builder /etc/ssl/ /etc/ssl/ # Define the command that will be run when the container is started -ENTRYPOINT ["/webui"] \ No newline at end of file +ENTRYPOINT ["/localagent"] \ No newline at end of file diff --git a/Makefile b/Makefile index 4e86fc4..a5576e7 100644 --- a/Makefile +++ b/Makefile @@ -7,8 +7,9 @@ tests: webui-nokb: $(MAKE) webui KBDISABLEINDEX=true +.PHONY: webui webui: - cd example/webui && $(GOCMD) run ./ + $(GOCMD) run ./ webui-image: docker build -t $(IMAGE_NAME) -f Dockerfile.webui . diff --git a/example/webui/main.go b/main.go similarity index 71% rename from example/webui/main.go rename to main.go index 8a3d2cb..cea755b 100644 --- a/example/webui/main.go +++ b/main.go @@ -1,19 +1,14 @@ package main import ( - "embed" "log" - "net/http" "os" - "github.com/donseba/go-htmx" - fiber "github.com/gofiber/fiber/v2" - "github.com/gofiber/template/html/v2" - "github.com/mudler/local-agent-framework/core/agent" "github.com/mudler/local-agent-framework/core/state" "github.com/mudler/local-agent-framework/pkg/llm" rag "github.com/mudler/local-agent-framework/pkg/vectorstore" + "github.com/mudler/local-agent-framework/webui" ) var testModel = os.Getenv("TEST_MODEL") @@ -37,12 +32,6 @@ func init() { } } -//go:embed views/* -var viewsfs embed.FS - -//go:embed public/* -var embeddedFiles embed.FS - func main() { // current dir cwd, err := os.Getwd() @@ -68,27 +57,16 @@ func main() { } } - pool, err := state.NewAgentPool(testModel, apiURL, stateDir, ragDB, Actions, Connectors, timeout) + pool, err := state.NewAgentPool(testModel, apiURL, stateDir, ragDB, webui.Actions, webui.Connectors, timeout) if err != nil { panic(err) } - app := &App{ - htmx: htmx.New(), - pool: pool, - } + app := webui.NewApp(webui.WithPool(pool)) if err := pool.StartAll(); err != nil { panic(err) } - engine := html.NewFileSystem(http.FS(viewsfs), ".html") - // Initialize a new Fiber app - // Pass the engine to the Views - webapp := fiber.New(fiber.Config{ - Views: engine, - }) - RegisterRoutes(webapp, pool, app) - - log.Fatal(webapp.Listen(":3000")) + log.Fatal(app.Listen(":3000")) } diff --git a/example/webui/actions.go b/webui/actions.go similarity index 99% rename from example/webui/actions.go rename to webui/actions.go index c199ca4..e817fcf 100644 --- a/example/webui/actions.go +++ b/webui/actions.go @@ -1,4 +1,4 @@ -package main +package webui import ( "context" diff --git a/example/webui/app.go b/webui/app.go similarity index 93% rename from example/webui/app.go rename to webui/app.go index 6af4567..9e5f93e 100644 --- a/example/webui/app.go +++ b/webui/app.go @@ -1,4 +1,4 @@ -package main +package webui import ( "bytes" @@ -17,15 +17,38 @@ import ( "github.com/donseba/go-htmx" "github.com/dslipak/pdf" fiber "github.com/gofiber/fiber/v2" + "github.com/gofiber/template/html/v2" ) type ( App struct { - htmx *htmx.HTMX - pool *state.AgentPool + htmx *htmx.HTMX + config *Config + *fiber.App } ) +func NewApp(opts ...Option) *App { + config := NewConfig(opts...) + engine := html.NewFileSystem(http.FS(viewsfs), ".html") + + // Initialize a new Fiber app + // Pass the engine to the Views + webapp := fiber.New(fiber.Config{ + Views: engine, + }) + + a := &App{ + htmx: htmx.New(), + config: config, + App: webapp, + } + + a.registerRoutes(config.Pool, webapp) + + return a +} + func (a *App) KnowledgeBaseReset(pool *state.AgentPool) func(c *fiber.Ctx) error { return func(c *fiber.Ctx) error { db := pool.GetAgentMemory(c.Params("name")) @@ -124,7 +147,7 @@ func (a *App) KnowledgeBaseFile(pool *state.AgentPool) func(c *fiber.Ctx) error } xlog.Info("Content is", content) - chunkSize := defaultChunkSize + chunkSize := a.config.DefaultChunkSize if payload.ChunkSize > 0 { chunkSize = payload.ChunkSize } @@ -155,7 +178,7 @@ func (a *App) KnowledgeBase(pool *state.AgentPool) func(c *fiber.Ctx) error { if website == "" { return fmt.Errorf("please enter a URL") } - chunkSize := defaultChunkSize + chunkSize := a.config.DefaultChunkSize if payload.ChunkSize > 0 { chunkSize = payload.ChunkSize } diff --git a/example/webui/connectors.go b/webui/connectors.go similarity index 99% rename from example/webui/connectors.go rename to webui/connectors.go index fcf7fc5..5d920de 100644 --- a/example/webui/connectors.go +++ b/webui/connectors.go @@ -1,4 +1,4 @@ -package main +package webui import ( "encoding/json" diff --git a/example/webui/elements.go b/webui/elements.go similarity index 98% rename from example/webui/elements.go rename to webui/elements.go index 7d6bf23..9a92b5b 100644 --- a/example/webui/elements.go +++ b/webui/elements.go @@ -1,4 +1,4 @@ -package main +package webui import ( "fmt" diff --git a/webui/options.go b/webui/options.go new file mode 100644 index 0000000..58b7b3f --- /dev/null +++ b/webui/options.go @@ -0,0 +1,36 @@ +package webui + +import "github.com/mudler/local-agent-framework/core/state" + +type Config struct { + DefaultChunkSize int + Pool *state.AgentPool +} + +type Option func(*Config) + +func WithDefaultChunkSize(size int) Option { + return func(c *Config) { + c.DefaultChunkSize = size + } +} + +func WithPool(pool *state.AgentPool) Option { + return func(c *Config) { + c.Pool = pool + } +} + +func (c *Config) Apply(opts ...Option) { + for _, opt := range opts { + opt(c) + } +} + +func NewConfig(opts ...Option) *Config { + c := &Config{ + DefaultChunkSize: 2048, + } + c.Apply(opts...) + return c +} diff --git a/example/webui/public/dash.png b/webui/public/dash.png similarity index 100% rename from example/webui/public/dash.png rename to webui/public/dash.png diff --git a/example/webui/public/dash2.png b/webui/public/dash2.png similarity index 100% rename from example/webui/public/dash2.png rename to webui/public/dash2.png diff --git a/example/webui/public/logo_1.png b/webui/public/logo_1.png similarity index 100% rename from example/webui/public/logo_1.png rename to webui/public/logo_1.png diff --git a/example/webui/routes.go b/webui/routes.go similarity index 94% rename from example/webui/routes.go rename to webui/routes.go index 24646a1..b6cce34 100644 --- a/example/webui/routes.go +++ b/webui/routes.go @@ -1,6 +1,7 @@ -package main +package webui import ( + "embed" "math/rand" "net/http" @@ -11,7 +12,13 @@ import ( "github.com/mudler/local-agent-framework/core/state" ) -func RegisterRoutes(webapp *fiber.App, pool *state.AgentPool, app *App) { +//go:embed views/* +var viewsfs embed.FS + +//go:embed public/* +var embeddedFiles embed.FS + +func (app *App) registerRoutes(pool *state.AgentPool, webapp *fiber.App) { webapp.Use("/public", filesystem.New(filesystem.Config{ Root: http.FS(embeddedFiles), @@ -106,6 +113,8 @@ func RegisterRoutes(webapp *fiber.App, pool *state.AgentPool, app *App) { }) webapp.Post("/settings/import", app.ImportAgent(pool)) webapp.Get("/settings/export/:name", app.ExportAgent(pool)) + + return } var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") diff --git a/example/webui/views/agents.html b/webui/views/agents.html similarity index 100% rename from example/webui/views/agents.html rename to webui/views/agents.html diff --git a/example/webui/views/chat.html b/webui/views/chat.html similarity index 100% rename from example/webui/views/chat.html rename to webui/views/chat.html diff --git a/example/webui/views/create.html b/webui/views/create.html similarity index 100% rename from example/webui/views/create.html rename to webui/views/create.html diff --git a/example/webui/views/index.html b/webui/views/index.html similarity index 100% rename from example/webui/views/index.html rename to webui/views/index.html diff --git a/example/webui/views/knowledgebase.html b/webui/views/knowledgebase.html similarity index 100% rename from example/webui/views/knowledgebase.html rename to webui/views/knowledgebase.html diff --git a/example/webui/views/partials/header.html b/webui/views/partials/header.html similarity index 100% rename from example/webui/views/partials/header.html rename to webui/views/partials/header.html diff --git a/example/webui/views/partials/menu.html b/webui/views/partials/menu.html similarity index 100% rename from example/webui/views/partials/menu.html rename to webui/views/partials/menu.html diff --git a/example/webui/views/settings.html b/webui/views/settings.html similarity index 100% rename from example/webui/views/settings.html rename to webui/views/settings.html diff --git a/example/webui/views/status.html b/webui/views/status.html similarity index 100% rename from example/webui/views/status.html rename to webui/views/status.html