Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .tool-versions
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
golang 1.25.5
mockery 2.53.5
mockery 2.53.5
minikube 1.34.0
kubectl 1.28.3
argo 3.6.10
73 changes: 70 additions & 3 deletions aigateway/handler/openai.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"log/slog"
"net/http"
"net/url"
"strconv"
"strings"
"time"

Expand Down Expand Up @@ -95,10 +96,11 @@ type OpenAIHandlerImpl struct {
// ListModels godoc
// @Security ApiKey
// @Summary List available models
// @Description Returns a list of available models
// @Description Returns a list of available models, supports fuzzy search by model_id query parameter
// @Tags AIGateway
// @Accept json
// @Produce json
// @Param model_id query string false "Model ID for fuzzy search"
// @Success 200 {object} types.ModelList "OK"
// @Failure 500 {object} error "Internal server error"
// @Router /v1/models [get]
Expand All @@ -116,9 +118,74 @@ func (h *OpenAIHandlerImpl) ListModels(c *gin.Context) {
return
}

// Apply fuzzy search filter if model_id query parameter is provided
searchQuery := c.Query("model_id")
if searchQuery != "" {
filteredModels := make([]types.Model, 0)
for _, model := range models {
if strings.Contains(strings.ToLower(model.ID), strings.ToLower(searchQuery)) {
filteredModels = append(filteredModels, model)
}
}
models = filteredModels
}

// Parse pagination parameters
perStr := c.Query("per")
pageStr := c.Query("page")

// Set default values
per := 20 // default per page
page := 1 // default page (1-based)

if perStr != "" {
if parsedPerPage, err := strconv.Atoi(perStr); err == nil && parsedPerPage > 0 {
per = parsedPerPage
// Cap the per_page to prevent excessive requests
if per > 100 {
per = 100
}
}
}

if pageStr != "" {
if parsedPage, err := strconv.Atoi(pageStr); err == nil && parsedPage > 0 {
page = parsedPage
}
}

totalCount := len(models)

// Apply pagination
offset := (page - 1) * per
startIndex := offset
if startIndex > totalCount {
startIndex = totalCount
}

endIndex := startIndex + per
if endIndex > totalCount {
endIndex = totalCount
}

paginatedModels := models[startIndex:endIndex]

// Set pagination metadata
var firstID, lastID *string
if len(paginatedModels) > 0 {
firstID = &paginatedModels[0].ID
lastID = &paginatedModels[len(paginatedModels)-1].ID
}

hasMore := endIndex < totalCount

response := types.ModelList{
Object: "list",
Data: models,
Object: "list",
Data: paginatedModels,
FirstID: firstID,
LastID: lastID,
HasMore: hasMore,
TotalCount: totalCount,
}

c.PureJSON(http.StatusOK, response)
Expand Down
Loading
Loading