Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

220 строки
8.0 KiB

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