relay.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. package controller
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "github.com/labring/aiproxy/core/middleware"
  5. "github.com/labring/aiproxy/core/relay/mode"
  6. // relay model used by swagger
  7. _ "github.com/labring/aiproxy/core/relay/model"
  8. )
  9. // Completions godoc
  10. //
  11. // @Summary Completions
  12. // @Description Completions
  13. // @Tags relay
  14. // @Produce json
  15. // @Security ApiKeyAuth
  16. // @Param request body model.GeneralOpenAIRequest true "Request"
  17. // @Param Aiproxy-Channel header string false "Optional Aiproxy-Channel header"
  18. // @Success 200 {object} model.TextResponse
  19. // @Header all {integer} X-RateLimit-Limit-Requests "X-RateLimit-Limit-Requests"
  20. // @Header all {integer} X-RateLimit-Limit-Tokens "X-RateLimit-Limit-Tokens"
  21. // @Header all {integer} X-RateLimit-Remaining-Requests "X-RateLimit-Remaining-Requests"
  22. // @Header all {integer} X-RateLimit-Remaining-Tokens "X-RateLimit-Remaining-Tokens"
  23. // @Header all {string} X-RateLimit-Reset-Requests "X-RateLimit-Reset-Requests"
  24. // @Header all {string} X-RateLimit-Reset-Tokens "X-RateLimit-Reset-Tokens"
  25. // @Router /v1/completions [post]
  26. func Completions() []gin.HandlerFunc {
  27. return []gin.HandlerFunc{
  28. middleware.NewDistribute(mode.Completions),
  29. NewRelay(mode.Completions),
  30. }
  31. }
  32. // Anthropic godoc
  33. //
  34. // @Summary Anthropic
  35. // @Description Anthropic
  36. // @Tags relay
  37. // @Produce json
  38. // @Security ApiKeyAuth
  39. // @Param request body model.AnthropicMessageRequest true "Request"
  40. // @Param Aiproxy-Channel header string false "Optional Aiproxy-Channel header"
  41. // @Success 200 {object} model.TextResponse
  42. // @Header all {integer} X-RateLimit-Limit-Requests "X-RateLimit-Limit-Requests"
  43. // @Header all {integer} X-RateLimit-Limit-Tokens "X-RateLimit-Limit-Tokens"
  44. // @Header all {integer} X-RateLimit-Remaining-Requests "X-RateLimit-Remaining-Requests"
  45. // @Header all {integer} X-RateLimit-Remaining-Tokens "X-RateLimit-Remaining-Tokens"
  46. // @Header all {string} X-RateLimit-Reset-Requests "X-RateLimit-Reset-Requests"
  47. // @Header all {string} X-RateLimit-Reset-Tokens "X-RateLimit-Reset-Tokens"
  48. // @Router /v1/messages [post]
  49. func Anthropic() []gin.HandlerFunc {
  50. return []gin.HandlerFunc{
  51. middleware.NewDistribute(mode.Anthropic),
  52. NewRelay(mode.Anthropic),
  53. }
  54. }
  55. // ChatCompletions godoc
  56. //
  57. // @Summary ChatCompletions
  58. // @Description ChatCompletions
  59. // @Tags relay
  60. // @Produce json
  61. // @Security ApiKeyAuth
  62. // @Param request body model.GeneralOpenAIRequest true "Request"
  63. // @Param Aiproxy-Channel header string false "Optional Aiproxy-Channel header"
  64. // @Success 200 {object} model.TextResponse | model.ChatCompletionsStreamResponse
  65. // @Header all {integer} X-RateLimit-Limit-Requests "X-RateLimit-Limit-Requests"
  66. // @Header all {integer} X-RateLimit-Limit-Tokens "X-RateLimit-Limit-Tokens"
  67. // @Header all {integer} X-RateLimit-Remaining-Requests "X-RateLimit-Remaining-Requests"
  68. // @Header all {integer} X-RateLimit-Remaining-Tokens "X-RateLimit-Remaining-Tokens"
  69. // @Header all {string} X-RateLimit-Reset-Requests "X-RateLimit-Reset-Requests"
  70. // @Header all {string} X-RateLimit-Reset-Tokens "X-RateLimit-Reset-Tokens"
  71. // @Router /v1/chat/completions [post]
  72. func ChatCompletions() []gin.HandlerFunc {
  73. return []gin.HandlerFunc{
  74. middleware.NewDistribute(mode.ChatCompletions),
  75. NewRelay(mode.ChatCompletions),
  76. }
  77. }
  78. // Embeddings godoc
  79. //
  80. // @Summary Embeddings
  81. // @Description Embeddings
  82. // @Tags relay
  83. // @Produce json
  84. // @Security ApiKeyAuth
  85. // @Param request body model.EmbeddingRequest true "Request"
  86. // @Param Aiproxy-Channel header string false "Optional Aiproxy-Channel header"
  87. // @Success 200 {object} model.EmbeddingResponse
  88. // @Header all {integer} X-RateLimit-Limit-Requests "X-RateLimit-Limit-Requests"
  89. // @Header all {integer} X-RateLimit-Limit-Tokens "X-RateLimit-Limit-Tokens"
  90. // @Header all {integer} X-RateLimit-Remaining-Requests "X-RateLimit-Remaining-Requests"
  91. // @Header all {integer} X-RateLimit-Remaining-Tokens "X-RateLimit-Remaining-Tokens"
  92. // @Header all {string} X-RateLimit-Reset-Requests "X-RateLimit-Reset-Requests"
  93. // @Header all {string} X-RateLimit-Reset-Tokens "X-RateLimit-Reset-Tokens"
  94. // @Router /v1/embeddings [post]
  95. func Embeddings() []gin.HandlerFunc {
  96. return []gin.HandlerFunc{
  97. middleware.NewDistribute(mode.Embeddings),
  98. NewRelay(mode.Embeddings),
  99. }
  100. }
  101. // ImagesEdits godoc
  102. //
  103. // @Summary ImagesEdits
  104. // @Description ImagesEdits
  105. // @Tags relay
  106. // @Produce json
  107. // @Security ApiKeyAuth
  108. // @Param prompt formData string true "Prompt"
  109. // @Param model formData string true "Model"
  110. // @Param image formData file true "Images"
  111. // @Param Aiproxy-Channel header string false "Optional Aiproxy-Channel header"
  112. // @Success 200 {object} model.SttJSONResponse
  113. // @Header all {integer} X-RateLimit-Limit-Requests "X-RateLimit-Limit-Requests"
  114. // @Header all {integer} X-RateLimit-Limit-Tokens "X-RateLimit-Limit-Tokens"
  115. // @Header all {integer} X-RateLimit-Remaining-Requests "X-RateLimit-Remaining-Requests"
  116. // @Header all {integer} X-RateLimit-Remaining-Tokens "X-RateLimit-Remaining-Tokens"
  117. // @Header all {string} X-RateLimit-Reset-Requests "X-RateLimit-Reset-Requests"
  118. // @Header all {string} X-RateLimit-Reset-Tokens "X-RateLimit-Reset-Tokens"
  119. // @Router /v1/images/edits [post]
  120. func ImagesEdits() []gin.HandlerFunc {
  121. return []gin.HandlerFunc{
  122. middleware.NewDistribute(mode.ImagesEdits),
  123. NewRelay(mode.ImagesEdits),
  124. }
  125. }
  126. // ImagesGenerations godoc
  127. //
  128. // @Summary ImagesGenerations
  129. // @Description ImagesGenerations
  130. // @Tags relay
  131. // @Produce json
  132. // @Security ApiKeyAuth
  133. // @Param request body model.ImageRequest true "Request"
  134. // @Param Aiproxy-Channel header string false "Optional Aiproxy-Channel header"
  135. // @Success 200 {object} model.ImageResponse
  136. // @Header all {integer} X-RateLimit-Limit-Requests "X-RateLimit-Limit-Requests"
  137. // @Header all {integer} X-RateLimit-Limit-Tokens "X-RateLimit-Limit-Tokens"
  138. // @Header all {integer} X-RateLimit-Remaining-Requests "X-RateLimit-Remaining-Requests"
  139. // @Header all {integer} X-RateLimit-Remaining-Tokens "X-RateLimit-Remaining-Tokens"
  140. // @Header all {string} X-RateLimit-Reset-Requests "X-RateLimit-Reset-Requests"
  141. // @Header all {string} X-RateLimit-Reset-Tokens "X-RateLimit-Reset-Tokens"
  142. // @Router /v1/images/generations [post]
  143. func ImagesGenerations() []gin.HandlerFunc {
  144. return []gin.HandlerFunc{
  145. middleware.NewDistribute(mode.ImagesGenerations),
  146. NewRelay(mode.ImagesGenerations),
  147. }
  148. }
  149. // AudioSpeech godoc
  150. //
  151. // @Summary AudioSpeech
  152. // @Description AudioSpeech
  153. // @Tags relay
  154. // @Produce json
  155. // @Security ApiKeyAuth
  156. // @Param request body model.TextToSpeechRequest true "Request"
  157. // @Param Aiproxy-Channel header string false "Optional Aiproxy-Channel header"
  158. // @Success 200 {file} file "audio binary"
  159. // @Header all {integer} X-RateLimit-Limit-Requests "X-RateLimit-Limit-Requests"
  160. // @Header all {integer} X-RateLimit-Limit-Tokens "X-RateLimit-Limit-Tokens"
  161. // @Header all {integer} X-RateLimit-Remaining-Requests "X-RateLimit-Remaining-Requests"
  162. // @Header all {integer} X-RateLimit-Remaining-Tokens "X-RateLimit-Remaining-Tokens"
  163. // @Header all {string} X-RateLimit-Reset-Requests "X-RateLimit-Reset-Requests"
  164. // @Header all {string} X-RateLimit-Reset-Tokens "X-RateLimit-Reset-Tokens"
  165. // @Router /v1/audio/speech [post]
  166. func AudioSpeech() []gin.HandlerFunc {
  167. return []gin.HandlerFunc{
  168. middleware.NewDistribute(mode.AudioSpeech),
  169. NewRelay(mode.AudioSpeech),
  170. }
  171. }
  172. // AudioTranscription godoc
  173. //
  174. // @Summary AudioTranscription
  175. // @Description AudioTranscription
  176. // @Tags relay
  177. // @Produce json
  178. // @Security ApiKeyAuth
  179. // @Param model formData string true "Model"
  180. // @Param file formData file true "File"
  181. // @Param Aiproxy-Channel header string false "Optional Aiproxy-Channel header"
  182. // @Success 200 {object} model.SttJSONResponse
  183. // @Header all {integer} X-RateLimit-Limit-Requests "X-RateLimit-Limit-Requests"
  184. // @Header all {integer} X-RateLimit-Limit-Tokens "X-RateLimit-Limit-Tokens"
  185. // @Header all {integer} X-RateLimit-Remaining-Requests "X-RateLimit-Remaining-Requests"
  186. // @Header all {integer} X-RateLimit-Remaining-Tokens "X-RateLimit-Remaining-Tokens"
  187. // @Header all {string} X-RateLimit-Reset-Requests "X-RateLimit-Reset-Requests"
  188. // @Header all {string} X-RateLimit-Reset-Tokens "X-RateLimit-Reset-Tokens"
  189. // @Router /v1/audio/transcriptions [post]
  190. func AudioTranscription() []gin.HandlerFunc {
  191. return []gin.HandlerFunc{
  192. middleware.NewDistribute(mode.AudioTranscription),
  193. NewRelay(mode.AudioTranscription),
  194. }
  195. }
  196. // AudioTranslation godoc
  197. //
  198. // @Summary AudioTranslation
  199. // @Description AudioTranslation
  200. // @Tags relay
  201. // @Produce json
  202. // @Security ApiKeyAuth
  203. // @Param model formData string true "Model"
  204. // @Param file formData file true "File"
  205. // @Param Aiproxy-Channel header string false "Optional Aiproxy-Channel header"
  206. // @Success 200 {object} model.SttJSONResponse
  207. // @Header all {integer} X-RateLimit-Limit-Requests "X-RateLimit-Limit-Requests"
  208. // @Header all {integer} X-RateLimit-Limit-Tokens "X-RateLimit-Limit-Tokens"
  209. // @Header all {integer} X-RateLimit-Remaining-Requests "X-RateLimit-Remaining-Requests"
  210. // @Header all {integer} X-RateLimit-Remaining-Tokens "X-RateLimit-Remaining-Tokens"
  211. // @Header all {string} X-RateLimit-Reset-Requests "X-RateLimit-Reset-Requests"
  212. // @Header all {string} X-RateLimit-Reset-Tokens "X-RateLimit-Reset-Tokens"
  213. // @Router /v1/audio/translations [post]
  214. func AudioTranslation() []gin.HandlerFunc {
  215. return []gin.HandlerFunc{
  216. middleware.NewDistribute(mode.AudioTranslation),
  217. NewRelay(mode.AudioTranslation),
  218. }
  219. }
  220. func Moderations() []gin.HandlerFunc {
  221. return []gin.HandlerFunc{
  222. middleware.NewDistribute(mode.Moderations),
  223. NewRelay(mode.Moderations),
  224. }
  225. }
  226. // Rerank godoc
  227. //
  228. // @Summary Rerank
  229. // @Description Rerank
  230. // @Tags relay
  231. // @Produce json
  232. // @Security ApiKeyAuth
  233. // @Param request body model.RerankRequest true "Request"
  234. // @Param Aiproxy-Channel header string false "Optional Aiproxy-Channel header"
  235. // @Success 200 {object} model.RerankResponse
  236. // @Header all {integer} X-RateLimit-Limit-Requests "X-RateLimit-Limit-Requests"
  237. // @Header all {integer} X-RateLimit-Limit-Tokens "X-RateLimit-Limit-Tokens"
  238. // @Header all {integer} X-RateLimit-Remaining-Requests "X-RateLimit-Remaining-Requests"
  239. // @Header all {integer} X-RateLimit-Remaining-Tokens "X-RateLimit-Remaining-Tokens"
  240. // @Header all {string} X-RateLimit-Reset-Requests "X-RateLimit-Reset-Requests"
  241. // @Header all {string} X-RateLimit-Reset-Tokens "X-RateLimit-Reset-Tokens"
  242. // @Router /v1/rerank [post]
  243. func Rerank() []gin.HandlerFunc {
  244. return []gin.HandlerFunc{
  245. middleware.NewDistribute(mode.Rerank),
  246. NewRelay(mode.Rerank),
  247. }
  248. }
  249. // ParsePdf godoc
  250. //
  251. // @Summary ParsePdf
  252. // @Description ParsePdf
  253. // @Tags relay
  254. // @Produce json
  255. // @Security ApiKeyAuth
  256. // @Param model formData string true "Model"
  257. // @Param file formData file true "File"
  258. // @Param Aiproxy-Channel header string false "Optional Aiproxy-Channel header"
  259. // @Success 200 {object} model.ParsePdfResponse
  260. // @Header all {integer} X-RateLimit-Limit-Requests "X-RateLimit-Limit-Requests"
  261. // @Header all {integer} X-RateLimit-Limit-Tokens "X-RateLimit-Limit-Tokens"
  262. // @Header all {integer} X-RateLimit-Remaining-Requests "X-RateLimit-Remaining-Requests"
  263. // @Header all {integer} X-RateLimit-Remaining-Tokens "X-RateLimit-Remaining-Tokens"
  264. // @Header all {string} X-RateLimit-Reset-Requests "X-RateLimit-Reset-Requests"
  265. // @Header all {string} X-RateLimit-Reset-Tokens "X-RateLimit-Reset-Tokens"
  266. // @Router /v1/parse/pdf [post]
  267. func ParsePdf() []gin.HandlerFunc {
  268. return []gin.HandlerFunc{
  269. middleware.NewDistribute(mode.ParsePdf),
  270. NewRelay(mode.ParsePdf),
  271. }
  272. }
  273. // VideoGenerationsJobs godoc
  274. //
  275. // @Summary VideoGenerationsJobs
  276. // @Description VideoGenerationsJobs
  277. // @Tags relay
  278. // @Produce json
  279. // @Security ApiKeyAuth
  280. // @Param request body model.VideoGenerationJobRequest true "Request"
  281. // @Param Aiproxy-Channel header string false "Optional Aiproxy-Channel header"
  282. // @Success 200 {object} model.VideoGenerationJob
  283. // @Header all {integer} X-RateLimit-Limit-Requests "X-RateLimit-Limit-Requests"
  284. // @Header all {integer} X-RateLimit-Limit-Tokens "X-RateLimit-Limit-Tokens"
  285. // @Header all {integer} X-RateLimit-Remaining-Requests "X-RateLimit-Remaining-Requests"
  286. // @Header all {integer} X-RateLimit-Remaining-Tokens "X-RateLimit-Remaining-Tokens"
  287. // @Header all {string} X-RateLimit-Reset-Requests "X-RateLimit-Reset-Requests"
  288. // @Header all {string} X-RateLimit-Reset-Tokens "X-RateLimit-Reset-Tokens"
  289. // @Router /v1/video/generations/jobs [post]
  290. func VideoGenerationsJobs() []gin.HandlerFunc {
  291. return []gin.HandlerFunc{
  292. middleware.NewDistribute(mode.VideoGenerationsJobs),
  293. NewRelay(mode.VideoGenerationsJobs),
  294. }
  295. }
  296. // VideoGenerationsGetJobs godoc
  297. //
  298. // @Summary VideoGenerationsGetJobs
  299. // @Description VideoGenerationsGetJobs
  300. // @Tags relay
  301. // @Produce json
  302. // @Security ApiKeyAuth
  303. // @Param request body model.VideoGenerationJobRequest true "Request"
  304. // @Param Aiproxy-Channel header string false "Optional Aiproxy-Channel header"
  305. // @Success 200 {object} model.VideoGenerationJob
  306. // @Header all {integer} X-RateLimit-Limit-Requests "X-RateLimit-Limit-Requests"
  307. // @Header all {integer} X-RateLimit-Limit-Tokens "X-RateLimit-Limit-Tokens"
  308. // @Header all {integer} X-RateLimit-Remaining-Requests "X-RateLimit-Remaining-Requests"
  309. // @Header all {integer} X-RateLimit-Remaining-Tokens "X-RateLimit-Remaining-Tokens"
  310. // @Header all {string} X-RateLimit-Reset-Requests "X-RateLimit-Reset-Requests"
  311. // @Header all {string} X-RateLimit-Reset-Tokens "X-RateLimit-Reset-Tokens"
  312. // @Router /v1/video/generations/jobs/{id} [get]
  313. func VideoGenerationsGetJobs() []gin.HandlerFunc {
  314. return []gin.HandlerFunc{
  315. middleware.NewDistribute(mode.VideoGenerationsGetJobs),
  316. NewRelay(mode.VideoGenerationsGetJobs),
  317. }
  318. }
  319. // VideoGenerationsContent godoc
  320. //
  321. // @Summary VideoGenerationsContent
  322. // @Description VideoGenerationsContent
  323. // @Tags relay
  324. // @Produce json
  325. // @Security ApiKeyAuth
  326. // @Param request body model.VideoGenerationJobRequest true "Request"
  327. // @Param Aiproxy-Channel header string false "Optional Aiproxy-Channel header"
  328. // @Success 200 {file} file "video binary"
  329. // @Header all {integer} X-RateLimit-Limit-Requests "X-RateLimit-Limit-Requests"
  330. // @Header all {integer} X-RateLimit-Limit-Tokens "X-RateLimit-Limit-Tokens"
  331. // @Header all {integer} X-RateLimit-Remaining-Requests "X-RateLimit-Remaining-Requests"
  332. // @Header all {integer} X-RateLimit-Remaining-Tokens "X-RateLimit-Remaining-Tokens"
  333. // @Header all {string} X-RateLimit-Reset-Requests "X-RateLimit-Reset-Requests"
  334. // @Header all {string} X-RateLimit-Reset-Tokens "X-RateLimit-Reset-Tokens"
  335. // @Router /v1/video/generations/{id}/content/video [get]
  336. func VideoGenerationsContent() []gin.HandlerFunc {
  337. return []gin.HandlerFunc{
  338. middleware.NewDistribute(mode.VideoGenerationsContent),
  339. NewRelay(mode.VideoGenerationsContent),
  340. }
  341. }