relay-router.go 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. package router
  2. import (
  3. "github.com/QuantumNous/new-api/constant"
  4. "github.com/QuantumNous/new-api/controller"
  5. "github.com/QuantumNous/new-api/middleware"
  6. "github.com/QuantumNous/new-api/relay"
  7. "github.com/QuantumNous/new-api/types"
  8. "github.com/gin-gonic/gin"
  9. )
  10. func SetRelayRouter(router *gin.Engine) {
  11. router.Use(middleware.CORS())
  12. router.Use(middleware.DecompressRequestMiddleware())
  13. router.Use(middleware.StatsMiddleware())
  14. // https://platform.openai.com/docs/api-reference/introduction
  15. modelsRouter := router.Group("/v1/models")
  16. modelsRouter.Use(middleware.TokenAuth())
  17. {
  18. modelsRouter.GET("", func(c *gin.Context) {
  19. switch {
  20. case c.GetHeader("x-api-key") != "" && c.GetHeader("anthropic-version") != "":
  21. controller.ListModels(c, constant.ChannelTypeAnthropic)
  22. case c.GetHeader("x-goog-api-key") != "" || c.Query("key") != "": // 单独的适配
  23. controller.RetrieveModel(c, constant.ChannelTypeGemini)
  24. default:
  25. controller.ListModels(c, constant.ChannelTypeOpenAI)
  26. }
  27. })
  28. modelsRouter.GET("/:model", func(c *gin.Context) {
  29. switch {
  30. case c.GetHeader("x-api-key") != "" && c.GetHeader("anthropic-version") != "":
  31. controller.RetrieveModel(c, constant.ChannelTypeAnthropic)
  32. default:
  33. controller.RetrieveModel(c, constant.ChannelTypeOpenAI)
  34. }
  35. })
  36. }
  37. geminiRouter := router.Group("/v1beta/models")
  38. geminiRouter.Use(middleware.TokenAuth())
  39. {
  40. geminiRouter.GET("", func(c *gin.Context) {
  41. controller.ListModels(c, constant.ChannelTypeGemini)
  42. })
  43. }
  44. geminiCompatibleRouter := router.Group("/v1beta/openai/models")
  45. geminiCompatibleRouter.Use(middleware.TokenAuth())
  46. {
  47. geminiCompatibleRouter.GET("", func(c *gin.Context) {
  48. controller.ListModels(c, constant.ChannelTypeOpenAI)
  49. })
  50. }
  51. playgroundRouter := router.Group("/pg")
  52. playgroundRouter.Use(middleware.UserAuth(), middleware.Distribute())
  53. {
  54. playgroundRouter.POST("/chat/completions", controller.Playground)
  55. }
  56. relayV1Router := router.Group("/v1")
  57. relayV1Router.Use(middleware.TokenAuth())
  58. relayV1Router.Use(middleware.ModelRequestRateLimit())
  59. {
  60. // WebSocket 路由(统一到 Relay)
  61. wsRouter := relayV1Router.Group("")
  62. wsRouter.Use(middleware.Distribute())
  63. wsRouter.GET("/realtime", func(c *gin.Context) {
  64. controller.Relay(c, types.RelayFormatOpenAIRealtime)
  65. })
  66. }
  67. {
  68. //http router
  69. httpRouter := relayV1Router.Group("")
  70. httpRouter.Use(middleware.Distribute())
  71. // claude related routes
  72. httpRouter.POST("/messages", func(c *gin.Context) {
  73. controller.Relay(c, types.RelayFormatClaude)
  74. })
  75. // chat related routes
  76. httpRouter.POST("/completions", func(c *gin.Context) {
  77. controller.Relay(c, types.RelayFormatOpenAI)
  78. })
  79. httpRouter.POST("/chat/completions", func(c *gin.Context) {
  80. controller.Relay(c, types.RelayFormatOpenAI)
  81. })
  82. // response related routes
  83. httpRouter.POST("/responses", func(c *gin.Context) {
  84. controller.Relay(c, types.RelayFormatOpenAIResponses)
  85. })
  86. httpRouter.POST("/responses/compact", func(c *gin.Context) {
  87. controller.Relay(c, types.RelayFormatOpenAIResponsesCompaction)
  88. })
  89. // image related routes
  90. httpRouter.POST("/edits", func(c *gin.Context) {
  91. controller.Relay(c, types.RelayFormatOpenAIImage)
  92. })
  93. httpRouter.POST("/images/generations", func(c *gin.Context) {
  94. controller.Relay(c, types.RelayFormatOpenAIImage)
  95. })
  96. httpRouter.POST("/images/edits", func(c *gin.Context) {
  97. controller.Relay(c, types.RelayFormatOpenAIImage)
  98. })
  99. // embedding related routes
  100. httpRouter.POST("/embeddings", func(c *gin.Context) {
  101. controller.Relay(c, types.RelayFormatEmbedding)
  102. })
  103. // audio related routes
  104. httpRouter.POST("/audio/transcriptions", func(c *gin.Context) {
  105. controller.Relay(c, types.RelayFormatOpenAIAudio)
  106. })
  107. httpRouter.POST("/audio/translations", func(c *gin.Context) {
  108. controller.Relay(c, types.RelayFormatOpenAIAudio)
  109. })
  110. httpRouter.POST("/audio/speech", func(c *gin.Context) {
  111. controller.Relay(c, types.RelayFormatOpenAIAudio)
  112. })
  113. // rerank related routes
  114. httpRouter.POST("/rerank", func(c *gin.Context) {
  115. controller.Relay(c, types.RelayFormatRerank)
  116. })
  117. // gemini relay routes
  118. httpRouter.POST("/engines/:model/embeddings", func(c *gin.Context) {
  119. controller.Relay(c, types.RelayFormatGemini)
  120. })
  121. httpRouter.POST("/models/*path", func(c *gin.Context) {
  122. controller.Relay(c, types.RelayFormatGemini)
  123. })
  124. // other relay routes
  125. httpRouter.POST("/moderations", func(c *gin.Context) {
  126. controller.Relay(c, types.RelayFormatOpenAI)
  127. })
  128. // not implemented
  129. httpRouter.POST("/images/variations", controller.RelayNotImplemented)
  130. httpRouter.GET("/files", controller.RelayNotImplemented)
  131. httpRouter.POST("/files", controller.RelayNotImplemented)
  132. httpRouter.DELETE("/files/:id", controller.RelayNotImplemented)
  133. httpRouter.GET("/files/:id", controller.RelayNotImplemented)
  134. httpRouter.GET("/files/:id/content", controller.RelayNotImplemented)
  135. httpRouter.POST("/fine-tunes", controller.RelayNotImplemented)
  136. httpRouter.GET("/fine-tunes", controller.RelayNotImplemented)
  137. httpRouter.GET("/fine-tunes/:id", controller.RelayNotImplemented)
  138. httpRouter.POST("/fine-tunes/:id/cancel", controller.RelayNotImplemented)
  139. httpRouter.GET("/fine-tunes/:id/events", controller.RelayNotImplemented)
  140. httpRouter.DELETE("/models/:model", controller.RelayNotImplemented)
  141. }
  142. relayMjRouter := router.Group("/mj")
  143. registerMjRouterGroup(relayMjRouter)
  144. relayMjModeRouter := router.Group("/:mode/mj")
  145. registerMjRouterGroup(relayMjModeRouter)
  146. //relayMjRouter.Use()
  147. relaySunoRouter := router.Group("/suno")
  148. relaySunoRouter.Use(middleware.TokenAuth(), middleware.Distribute())
  149. {
  150. relaySunoRouter.POST("/submit/:action", controller.RelayTask)
  151. relaySunoRouter.POST("/fetch", controller.RelayTask)
  152. relaySunoRouter.GET("/fetch/:id", controller.RelayTask)
  153. }
  154. relayGeminiRouter := router.Group("/v1beta")
  155. relayGeminiRouter.Use(middleware.TokenAuth())
  156. relayGeminiRouter.Use(middleware.ModelRequestRateLimit())
  157. relayGeminiRouter.Use(middleware.Distribute())
  158. {
  159. // Gemini API 路径格式: /v1beta/models/{model_name}:{action}
  160. relayGeminiRouter.POST("/models/*path", func(c *gin.Context) {
  161. controller.Relay(c, types.RelayFormatGemini)
  162. })
  163. }
  164. }
  165. func registerMjRouterGroup(relayMjRouter *gin.RouterGroup) {
  166. relayMjRouter.GET("/image/:id", relay.RelayMidjourneyImage)
  167. relayMjRouter.Use(middleware.TokenAuth(), middleware.Distribute())
  168. {
  169. relayMjRouter.POST("/submit/action", controller.RelayMidjourney)
  170. relayMjRouter.POST("/submit/shorten", controller.RelayMidjourney)
  171. relayMjRouter.POST("/submit/modal", controller.RelayMidjourney)
  172. relayMjRouter.POST("/submit/imagine", controller.RelayMidjourney)
  173. relayMjRouter.POST("/submit/change", controller.RelayMidjourney)
  174. relayMjRouter.POST("/submit/simple-change", controller.RelayMidjourney)
  175. relayMjRouter.POST("/submit/describe", controller.RelayMidjourney)
  176. relayMjRouter.POST("/submit/blend", controller.RelayMidjourney)
  177. relayMjRouter.POST("/submit/edits", controller.RelayMidjourney)
  178. relayMjRouter.POST("/submit/video", controller.RelayMidjourney)
  179. relayMjRouter.POST("/notify", controller.RelayMidjourney)
  180. relayMjRouter.GET("/task/:id/fetch", controller.RelayMidjourney)
  181. relayMjRouter.GET("/task/:id/image-seed", controller.RelayMidjourney)
  182. relayMjRouter.POST("/task/list-by-condition", controller.RelayMidjourney)
  183. relayMjRouter.POST("/insight-face/swap", controller.RelayMidjourney)
  184. relayMjRouter.POST("/submit/upload-discord-images", controller.RelayMidjourney)
  185. }
  186. }