99 "log/slog"
1010 "net/http"
1111 "net/url"
12+ "strconv"
1213 "strings"
1314
1415 "github.com/gin-gonic/gin"
@@ -94,10 +95,11 @@ type OpenAIHandlerImpl struct {
9495// ListModels godoc
9596// @Security ApiKey
9697// @Summary List available models
97- // @Description Returns a list of available models
98+ // @Description Returns a list of available models, supports fuzzy search by model_id query parameter
9899// @Tags AIGateway
99100// @Accept json
100101// @Produce json
102+ // @Param model_id query string false "Model ID for fuzzy search"
101103// @Success 200 {object} types.ModelList "OK"
102104// @Failure 500 {object} error "Internal server error"
103105// @Router /v1/models [get]
@@ -115,9 +117,74 @@ func (h *OpenAIHandlerImpl) ListModels(c *gin.Context) {
115117 return
116118 }
117119
120+ // Apply fuzzy search filter if model_id query parameter is provided
121+ searchQuery := c .Query ("model_id" )
122+ if searchQuery != "" {
123+ filteredModels := make ([]types.Model , 0 )
124+ for _ , model := range models {
125+ if strings .Contains (strings .ToLower (model .ID ), strings .ToLower (searchQuery )) {
126+ filteredModels = append (filteredModels , model )
127+ }
128+ }
129+ models = filteredModels
130+ }
131+
132+ // Parse pagination parameters
133+ perStr := c .Query ("per" )
134+ pageStr := c .Query ("page" )
135+
136+ // Set default values
137+ per := 20 // default per page
138+ page := 1 // default page (1-based)
139+
140+ if perStr != "" {
141+ if parsedPerPage , err := strconv .Atoi (perStr ); err == nil && parsedPerPage > 0 {
142+ per = parsedPerPage
143+ // Cap the per_page to prevent excessive requests
144+ if per > 100 {
145+ per = 100
146+ }
147+ }
148+ }
149+
150+ if pageStr != "" {
151+ if parsedPage , err := strconv .Atoi (pageStr ); err == nil && parsedPage > 0 {
152+ page = parsedPage
153+ }
154+ }
155+
156+ totalCount := len (models )
157+
158+ // Apply pagination
159+ offset := (page - 1 ) * per
160+ startIndex := offset
161+ if startIndex > totalCount {
162+ startIndex = totalCount
163+ }
164+
165+ endIndex := startIndex + per
166+ if endIndex > totalCount {
167+ endIndex = totalCount
168+ }
169+
170+ paginatedModels := models [startIndex :endIndex ]
171+
172+ // Set pagination metadata
173+ var firstID , lastID * string
174+ if len (paginatedModels ) > 0 {
175+ firstID = & paginatedModels [0 ].ID
176+ lastID = & paginatedModels [len (paginatedModels )- 1 ].ID
177+ }
178+
179+ hasMore := endIndex < totalCount
180+
118181 response := types.ModelList {
119- Object : "list" ,
120- Data : models ,
182+ Object : "list" ,
183+ Data : paginatedModels ,
184+ FirstID : firstID ,
185+ LastID : lastID ,
186+ HasMore : hasMore ,
187+ TotalCount : totalCount ,
121188 }
122189
123190 c .PureJSON (http .StatusOK , response )
0 commit comments