Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ import (
"github.com/gin-gonic/gin"
"github.com/joho/godotenv"

"golang.org/x/net/http2"
"golang.org/x/net/http2/h2c"

_ "net/http/pprof"
)

Expand Down Expand Up @@ -138,7 +141,6 @@ func main() {
// This will cause SSE not to work!!!
//server.Use(gzip.Gzip(gzip.DefaultCompression))
server.Use(middleware.RequestId())
middleware.SetUpLogger(server)
// Initialize session store
store := cookie.NewStore([]byte(common.SessionSecret))
store.Options(sessions.Options{
Expand All @@ -148,13 +150,13 @@ func main() {
Secure: false,
SameSite: http.SameSiteStrictMode,
})
server.Use(sessions.Sessions("session", store))
sessionMiddleware := sessions.Sessions("session", store)

InjectUmamiAnalytics()
InjectGoogleAnalytics()

// 设置路由
router.SetRouter(server, buildFS, indexPage)
router.SetRouter(server, buildFS, indexPage, sessionMiddleware)
var port = os.Getenv("PORT")
if port == "" {
port = strconv.Itoa(*common.Port)
Expand All @@ -163,7 +165,12 @@ func main() {
// Log startup success message
common.LogStartupSuccess(startTime, port)

err = server.Run(":" + port)
srv := &http.Server{
Addr: ":" + port,
Handler: h2c.NewHandler(server, &http2.Server{}),
}

err = srv.ListenAndServe()
if err != nil {
common.FatalLog("failed to start HTTP server: " + err.Error())
}
Expand Down
8 changes: 5 additions & 3 deletions middleware/logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@ import (
"github.com/gin-gonic/gin"
)

func SetUpLogger(server *gin.Engine) {
server.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {
func SetUpLogger(routes gin.IRoutes) {
routes.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {
var requestID string
if param.Keys != nil {
requestID = param.Keys[common.RequestIdKey].(string)
if id, ok := param.Keys[common.RequestIdKey].(string); ok {
requestID = id
}
}
return fmt.Sprintf("[GIN] %s | %s | %3d | %13v | %15s | %7s %s\n",
param.TimeStamp.Format("2006/01/02 - 15:04:05"),
Expand Down
2 changes: 1 addition & 1 deletion router/api-router.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
"github.com/gin-gonic/gin"
)

func SetApiRouter(router *gin.Engine) {
func SetApiRouter(router gin.IRouter) {
apiRouter := router.Group("/api")
apiRouter.Use(gzip.Gzip(gzip.DefaultCompression))
apiRouter.Use(middleware.GlobalAPIRateLimit())
Expand Down
2 changes: 1 addition & 1 deletion router/dashboard.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
"github.com/gin-gonic/gin"
)

func SetDashboardRouter(router *gin.Engine) {
func SetDashboardRouter(router gin.IRouter) {
apiRouter := router.Group("/")
apiRouter.Use(gzip.Gzip(gzip.DefaultCompression))
apiRouter.Use(middleware.GlobalAPIRateLimit())
Expand Down
30 changes: 23 additions & 7 deletions router/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,25 +8,41 @@ import (
"strings"

"github.com/QuantumNous/new-api/common"
"github.com/QuantumNous/new-api/middleware"

"github.com/gin-gonic/gin"
)

func SetRouter(router *gin.Engine, buildFS embed.FS, indexPage []byte) {
SetApiRouter(router)
SetDashboardRouter(router)
SetRelayRouter(router)
SetVideoRouter(router)
func SetRouter(engine *gin.Engine, buildFS embed.FS, indexPage []byte, sessionMiddleware gin.HandlerFunc) {
SetRelayRouter(engine)

dataPlaneRouter := engine.Group("")
dataPlaneRouter.Use(
middleware.CORS(),
middleware.DecompressRequestMiddleware(),
middleware.StatsMiddleware(),
)
SetVideoRouter(dataPlaneRouter)

appRouter := engine.Group("")
if sessionMiddleware != nil {
appRouter.Use(sessionMiddleware)
}
middleware.SetUpLogger(appRouter)

SetApiRouter(appRouter)
SetDashboardRouter(appRouter)

frontendBaseUrl := os.Getenv("FRONTEND_BASE_URL")
if common.IsMasterNode && frontendBaseUrl != "" {
frontendBaseUrl = ""
common.SysLog("FRONTEND_BASE_URL is ignored on master node")
}
if frontendBaseUrl == "" {
SetWebRouter(router, buildFS, indexPage)
SetWebRouter(engine, appRouter, buildFS, indexPage)
} else {
frontendBaseUrl = strings.TrimSuffix(frontendBaseUrl, "/")
router.NoRoute(func(c *gin.Context) {
engine.NoRoute(func(c *gin.Context) {
c.Redirect(http.StatusMovedPermanently, fmt.Sprintf("%s%s", frontendBaseUrl, c.Request.RequestURI))
})
}
Expand Down
27 changes: 14 additions & 13 deletions router/relay-router.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@ import (
"github.com/gin-gonic/gin"
)

func SetRelayRouter(router *gin.Engine) {
router.Use(middleware.CORS())
router.Use(middleware.DecompressRequestMiddleware())
router.Use(middleware.StatsMiddleware())
func SetRelayRouter(engine *gin.Engine) {
relayRouter := engine.Group("")
relayRouter.Use(middleware.CORS())
relayRouter.Use(middleware.DecompressRequestMiddleware())
relayRouter.Use(middleware.StatsMiddleware())
// https://platform.openai.com/docs/api-reference/introduction
modelsRouter := router.Group("/v1/models")
modelsRouter := relayRouter.Group("/v1/models")
modelsRouter.Use(middleware.TokenAuth())
{
modelsRouter.GET("", func(c *gin.Context) {
Expand All @@ -39,28 +40,28 @@ func SetRelayRouter(router *gin.Engine) {
})
}

geminiRouter := router.Group("/v1beta/models")
geminiRouter := relayRouter.Group("/v1beta/models")
geminiRouter.Use(middleware.TokenAuth())
{
geminiRouter.GET("", func(c *gin.Context) {
controller.ListModels(c, constant.ChannelTypeGemini)
})
}

geminiCompatibleRouter := router.Group("/v1beta/openai/models")
geminiCompatibleRouter := relayRouter.Group("/v1beta/openai/models")
geminiCompatibleRouter.Use(middleware.TokenAuth())
{
geminiCompatibleRouter.GET("", func(c *gin.Context) {
controller.ListModels(c, constant.ChannelTypeOpenAI)
})
}

playgroundRouter := router.Group("/pg")
playgroundRouter := relayRouter.Group("/pg")
playgroundRouter.Use(middleware.UserAuth(), middleware.Distribute())
{
playgroundRouter.POST("/chat/completions", controller.Playground)
}
relayV1Router := router.Group("/v1")
relayV1Router := relayRouter.Group("/v1")
relayV1Router.Use(middleware.TokenAuth())
relayV1Router.Use(middleware.ModelRequestRateLimit())
{
Expand Down Expand Up @@ -154,22 +155,22 @@ func SetRelayRouter(router *gin.Engine) {
httpRouter.DELETE("/models/:model", controller.RelayNotImplemented)
}

relayMjRouter := router.Group("/mj")
relayMjRouter := relayRouter.Group("/mj")
registerMjRouterGroup(relayMjRouter)

relayMjModeRouter := router.Group("/:mode/mj")
relayMjModeRouter := relayRouter.Group("/:mode/mj")
registerMjRouterGroup(relayMjModeRouter)
//relayMjRouter.Use()

relaySunoRouter := router.Group("/suno")
relaySunoRouter := relayRouter.Group("/suno")
relaySunoRouter.Use(middleware.TokenAuth(), middleware.Distribute())
{
relaySunoRouter.POST("/submit/:action", controller.RelayTask)
relaySunoRouter.POST("/fetch", controller.RelayTask)
relaySunoRouter.GET("/fetch/:id", controller.RelayTask)
}

relayGeminiRouter := router.Group("/v1beta")
relayGeminiRouter := relayRouter.Group("/v1beta")
relayGeminiRouter.Use(middleware.TokenAuth())
relayGeminiRouter.Use(middleware.ModelRequestRateLimit())
relayGeminiRouter.Use(middleware.Distribute())
Expand Down
2 changes: 1 addition & 1 deletion router/video-router.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
"github.com/gin-gonic/gin"
)

func SetVideoRouter(router *gin.Engine) {
func SetVideoRouter(router gin.IRouter) {
videoV1Router := router.Group("/v1")
videoV1Router.GET("/videos/:task_id/content", controller.VideoProxy)
videoV1Router.Use(middleware.TokenAuth(), middleware.Distribute())
Expand Down
4 changes: 2 additions & 2 deletions router/web-router.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ import (
"github.com/gin-gonic/gin"
)

func SetWebRouter(router *gin.Engine, buildFS embed.FS, indexPage []byte) {
func SetWebRouter(engine *gin.Engine, router gin.IRouter, buildFS embed.FS, indexPage []byte) {
router.Use(gzip.Gzip(gzip.DefaultCompression))
router.Use(middleware.GlobalWebRateLimit())
router.Use(middleware.Cache())
router.Use(static.Serve("/", common.EmbedFolder(buildFS, "web/dist")))
router.NoRoute(func(c *gin.Context) {
engine.NoRoute(func(c *gin.Context) {
if strings.HasPrefix(c.Request.RequestURI, "/v1") || strings.HasPrefix(c.Request.RequestURI, "/api") || strings.HasPrefix(c.Request.RequestURI, "/assets") {
controller.RelayNotFound(c)
return
Expand Down