relay-router.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. package router
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "one-api/constant"
  5. "one-api/controller"
  6. "one-api/middleware"
  7. "one-api/relay"
  8. )
  9. func SetRelayRouter(router *gin.Engine) {
  10. router.Use(middleware.CORS())
  11. router.Use(middleware.DecompressRequestMiddleware())
  12. router.Use(middleware.StatsMiddleware())
  13. // https://platform.openai.com/docs/api-reference/introduction
  14. modelsRouter := router.Group("/v1/models")
  15. modelsRouter.Use(middleware.TokenAuth())
  16. {
  17. modelsRouter.GET("", func(c *gin.Context) {
  18. switch {
  19. case c.GetHeader("x-api-key") != "" && c.GetHeader("anthropic-version") != "":
  20. controller.ListModels(c, constant.ChannelTypeAnthropic)
  21. case c.GetHeader("x-goog-api-key") != "" || c.Query("key") != "": // 单独的适配
  22. controller.RetrieveModel(c, constant.ChannelTypeGemini)
  23. default:
  24. controller.ListModels(c, constant.ChannelTypeOpenAI)
  25. }
  26. })
  27. modelsRouter.GET("/:model", func(c *gin.Context) {
  28. switch {
  29. case c.GetHeader("x-api-key") != "" && c.GetHeader("anthropic-version") != "":
  30. controller.RetrieveModel(c, constant.ChannelTypeAnthropic)
  31. default:
  32. controller.RetrieveModel(c, constant.ChannelTypeOpenAI)
  33. }
  34. })
  35. }
  36. geminiRouter := router.Group("/v1beta/models")
  37. geminiRouter.Use(middleware.TokenAuth())
  38. {
  39. geminiRouter.GET("", func(c *gin.Context) {
  40. controller.ListModels(c, constant.ChannelTypeGemini)
  41. })
  42. }
  43. geminiCompatibleRouter := router.Group("/v1beta/openai/models")
  44. geminiCompatibleRouter.Use(middleware.TokenAuth())
  45. {
  46. geminiCompatibleRouter.GET("", func(c *gin.Context) {
  47. controller.ListModels(c, constant.ChannelTypeOpenAI)
  48. })
  49. }
  50. playgroundRouter := router.Group("/pg")
  51. playgroundRouter.Use(middleware.UserAuth(), middleware.Distribute())
  52. {
  53. playgroundRouter.POST("/chat/completions", controller.Playground)
  54. }
  55. relayV1Router := router.Group("/v1")
  56. relayV1Router.Use(middleware.TokenAuth())
  57. relayV1Router.Use(middleware.ModelRequestRateLimit())
  58. {
  59. // WebSocket 路由
  60. wsRouter := relayV1Router.Group("")
  61. wsRouter.Use(middleware.Distribute())
  62. wsRouter.GET("/realtime", controller.WssRelay)
  63. }
  64. {
  65. //http router
  66. httpRouter := relayV1Router.Group("")
  67. httpRouter.Use(middleware.Distribute())
  68. httpRouter.POST("/messages", controller.RelayClaude)
  69. httpRouter.POST("/completions", controller.Relay)
  70. httpRouter.POST("/chat/completions", controller.Relay)
  71. httpRouter.POST("/edits", controller.Relay)
  72. httpRouter.POST("/images/generations", controller.Relay)
  73. httpRouter.POST("/images/edits", controller.Relay)
  74. httpRouter.POST("/images/variations", controller.RelayNotImplemented)
  75. httpRouter.POST("/embeddings", controller.Relay)
  76. httpRouter.POST("/engines/:model/embeddings", controller.Relay)
  77. httpRouter.POST("/audio/transcriptions", controller.Relay)
  78. httpRouter.POST("/audio/translations", controller.Relay)
  79. httpRouter.POST("/audio/speech", controller.Relay)
  80. httpRouter.POST("/responses", controller.Relay)
  81. httpRouter.GET("/files", controller.RelayNotImplemented)
  82. httpRouter.POST("/files", controller.RelayNotImplemented)
  83. httpRouter.DELETE("/files/:id", controller.RelayNotImplemented)
  84. httpRouter.GET("/files/:id", controller.RelayNotImplemented)
  85. httpRouter.GET("/files/:id/content", controller.RelayNotImplemented)
  86. httpRouter.POST("/fine-tunes", controller.RelayNotImplemented)
  87. httpRouter.GET("/fine-tunes", controller.RelayNotImplemented)
  88. httpRouter.GET("/fine-tunes/:id", controller.RelayNotImplemented)
  89. httpRouter.POST("/fine-tunes/:id/cancel", controller.RelayNotImplemented)
  90. httpRouter.GET("/fine-tunes/:id/events", controller.RelayNotImplemented)
  91. httpRouter.DELETE("/models/:model", controller.RelayNotImplemented)
  92. httpRouter.POST("/moderations", controller.Relay)
  93. httpRouter.POST("/rerank", controller.Relay)
  94. httpRouter.POST("/models/*path", controller.Relay)
  95. }
  96. relayMjRouter := router.Group("/mj")
  97. registerMjRouterGroup(relayMjRouter)
  98. relayMjModeRouter := router.Group("/:mode/mj")
  99. registerMjRouterGroup(relayMjModeRouter)
  100. //relayMjRouter.Use()
  101. relaySunoRouter := router.Group("/suno")
  102. relaySunoRouter.Use(middleware.TokenAuth(), middleware.Distribute())
  103. {
  104. relaySunoRouter.POST("/submit/:action", controller.RelayTask)
  105. relaySunoRouter.POST("/fetch", controller.RelayTask)
  106. relaySunoRouter.GET("/fetch/:id", controller.RelayTask)
  107. }
  108. relayGeminiRouter := router.Group("/v1beta")
  109. relayGeminiRouter.Use(middleware.TokenAuth())
  110. relayGeminiRouter.Use(middleware.ModelRequestRateLimit())
  111. relayGeminiRouter.Use(middleware.Distribute())
  112. {
  113. // Gemini API 路径格式: /v1beta/models/{model_name}:{action}
  114. relayGeminiRouter.POST("/models/*path", controller.Relay)
  115. }
  116. }
  117. func registerMjRouterGroup(relayMjRouter *gin.RouterGroup) {
  118. relayMjRouter.GET("/image/:id", relay.RelayMidjourneyImage)
  119. relayMjRouter.Use(middleware.TokenAuth(), middleware.Distribute())
  120. {
  121. relayMjRouter.POST("/submit/action", controller.RelayMidjourney)
  122. relayMjRouter.POST("/submit/shorten", controller.RelayMidjourney)
  123. relayMjRouter.POST("/submit/modal", controller.RelayMidjourney)
  124. relayMjRouter.POST("/submit/imagine", controller.RelayMidjourney)
  125. relayMjRouter.POST("/submit/change", controller.RelayMidjourney)
  126. relayMjRouter.POST("/submit/simple-change", controller.RelayMidjourney)
  127. relayMjRouter.POST("/submit/describe", controller.RelayMidjourney)
  128. relayMjRouter.POST("/submit/blend", controller.RelayMidjourney)
  129. relayMjRouter.POST("/submit/edits", controller.RelayMidjourney)
  130. relayMjRouter.POST("/submit/video", controller.RelayMidjourney)
  131. relayMjRouter.POST("/notify", controller.RelayMidjourney)
  132. relayMjRouter.GET("/task/:id/fetch", controller.RelayMidjourney)
  133. relayMjRouter.GET("/task/:id/image-seed", controller.RelayMidjourney)
  134. relayMjRouter.POST("/task/list-by-condition", controller.RelayMidjourney)
  135. relayMjRouter.POST("/insight-face/swap", controller.RelayMidjourney)
  136. relayMjRouter.POST("/submit/upload-discord-images", controller.RelayMidjourney)
  137. }
  138. }