package http import ( "embed" "fmt" "html/template" "net/http" "github.com/Masterminds/sprig/v3" "github.com/go-skynet/LocalAI/core/config" "github.com/go-skynet/LocalAI/core/schema" "github.com/go-skynet/LocalAI/internal" "github.com/go-skynet/LocalAI/pkg/model" "github.com/gofiber/fiber/v2" fiberhtml "github.com/gofiber/template/html/v2" "github.com/russross/blackfriday" ) //go:embed views/* var viewsfs embed.FS func notFoundHandler(c *fiber.Ctx) error { // Check if the request accepts JSON if string(c.Context().Request.Header.ContentType()) == "application/json" || len(c.Accepts("html")) == 0 { // The client expects a JSON response c.Status(fiber.StatusNotFound).JSON(schema.ErrorResponse{ Error: &schema.APIError{Message: "Resource not found", Code: fiber.StatusNotFound}, }) } else { // The client expects an HTML response c.Status(fiber.StatusNotFound).Render("views/404", fiber.Map{}) } return nil } func welcomeRoute( app *fiber.App, cl *config.BackendConfigLoader, ml *model.ModelLoader, appConfig *config.ApplicationConfig, auth func(*fiber.Ctx) error, ) { if appConfig.DisableWelcomePage { return } models, _ := ml.ListModels() backendConfigs := cl.GetAllBackendConfigs() app.Get("/", auth, func(c *fiber.Ctx) error { summary := fiber.Map{ "Title": "LocalAI API - " + internal.PrintableVersion(), "Version": internal.PrintableVersion(), "Models": models, "ModelsConfig": backendConfigs, "ApplicationConfig": appConfig, } if string(c.Context().Request.Header.ContentType()) == "application/json" || len(c.Accepts("html")) == 0 { // The client expects a JSON response return c.Status(fiber.StatusOK).JSON(summary) } else { // Render index return c.Render("views/index", summary) } }) } func renderEngine() *fiberhtml.Engine { engine := fiberhtml.NewFileSystem(http.FS(viewsfs), ".html") engine.AddFuncMap(sprig.FuncMap()) engine.AddFunc("MDToHTML", markDowner) return engine } func markDowner(args ...interface{}) template.HTML { s := blackfriday.MarkdownCommon([]byte(fmt.Sprintf("%s", args...))) return template.HTML(s) }