Skip to content

Commit 24d1f93

Browse files
author
Dev Agent
committed
add query to list model
1 parent 54bf54a commit 24d1f93

File tree

5 files changed

+449
-14
lines changed

5 files changed

+449
-14
lines changed

.tool-versions

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
1-
golang 1.24.6
2-
mockery 2.53.0
1+
golang 1.25.5
2+
mockery 2.53.0
3+
minikube 1.34.0
4+
kubectl 1.28.3
5+
argo 3.6.10

aigateway/handler/openai.go

Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
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

Comments
 (0)