relay.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  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. }
  342. // CreateResponse godoc
  343. //
  344. // @Summary Create response
  345. // @Description Create a new response
  346. // @Tags relay
  347. // @Produce json
  348. // @Security ApiKeyAuth
  349. // @Param request body model.CreateResponseRequest true "Request"
  350. // @Param Aiproxy-Channel header string false "Optional Aiproxy-Channel header"
  351. // @Success 200 {object} model.Response
  352. // @Header all {integer} X-RateLimit-Limit-Requests "X-RateLimit-Limit-Requests"
  353. // @Header all {integer} X-RateLimit-Limit-Tokens "X-RateLimit-Limit-Tokens"
  354. // @Header all {integer} X-RateLimit-Remaining-Requests "X-RateLimit-Remaining-Requests"
  355. // @Header all {integer} X-RateLimit-Remaining-Tokens "X-RateLimit-Remaining-Tokens"
  356. // @Header all {string} X-RateLimit-Reset-Requests "X-RateLimit-Reset-Requests"
  357. // @Header all {string} X-RateLimit-Reset-Tokens "X-RateLimit-Reset-Tokens"
  358. // @Router /v1/responses [post]
  359. func CreateResponse() []gin.HandlerFunc {
  360. return []gin.HandlerFunc{
  361. middleware.NewDistribute(mode.Responses),
  362. NewRelay(mode.Responses),
  363. }
  364. }
  365. // GetResponse godoc
  366. //
  367. // @Summary Get response
  368. // @Description Get a response by ID
  369. // @Tags relay
  370. // @Produce json
  371. // @Security ApiKeyAuth
  372. // @Param response_id path string true "Response ID"
  373. // @Param Aiproxy-Channel header string false "Optional Aiproxy-Channel header"
  374. // @Success 200 {object} model.Response
  375. // @Router /v1/responses/{response_id} [get]
  376. func GetResponse() []gin.HandlerFunc {
  377. return []gin.HandlerFunc{
  378. middleware.NewDistribute(mode.ResponsesGet),
  379. NewRelay(mode.ResponsesGet),
  380. }
  381. }
  382. // DeleteResponse godoc
  383. //
  384. // @Summary Delete response
  385. // @Description Delete a response by ID
  386. // @Tags relay
  387. // @Produce json
  388. // @Security ApiKeyAuth
  389. // @Param response_id path string true "Response ID"
  390. // @Param Aiproxy-Channel header string false "Optional Aiproxy-Channel header"
  391. // @Success 204
  392. // @Router /v1/responses/{response_id} [delete]
  393. func DeleteResponse() []gin.HandlerFunc {
  394. return []gin.HandlerFunc{
  395. middleware.NewDistribute(mode.ResponsesDelete),
  396. NewRelay(mode.ResponsesDelete),
  397. }
  398. }
  399. // CancelResponse godoc
  400. //
  401. // @Summary Cancel response
  402. // @Description Cancel a response by ID
  403. // @Tags relay
  404. // @Produce json
  405. // @Security ApiKeyAuth
  406. // @Param response_id path string true "Response ID"
  407. // @Param Aiproxy-Channel header string false "Optional Aiproxy-Channel header"
  408. // @Success 200 {object} model.Response
  409. // @Router /v1/responses/{response_id}/cancel [post]
  410. func CancelResponse() []gin.HandlerFunc {
  411. return []gin.HandlerFunc{
  412. middleware.NewDistribute(mode.ResponsesCancel),
  413. NewRelay(mode.ResponsesCancel),
  414. }
  415. }
  416. // GetResponseInputItems godoc
  417. //
  418. // @Summary Get response input items
  419. // @Description Get input items for a response
  420. // @Tags relay
  421. // @Produce json
  422. // @Security ApiKeyAuth
  423. // @Param response_id path string true "Response ID"
  424. // @Param Aiproxy-Channel header string false "Optional Aiproxy-Channel header"
  425. // @Success 200 {object} model.InputItemList
  426. // @Router /v1/responses/{response_id}/input_items [get]
  427. func GetResponseInputItems() []gin.HandlerFunc {
  428. return []gin.HandlerFunc{
  429. middleware.NewDistribute(mode.ResponsesInputItems),
  430. NewRelay(mode.ResponsesInputItems),
  431. }
  432. }