From 79dd122b56c07cd6e6f3733e5ddd96b01faefd3e Mon Sep 17 00:00:00 2001 From: hobokenchicken Date: Thu, 7 May 2026 11:26:05 -0400 Subject: [PATCH] feat: expose model groups in /v1/models endpoint Add Groups() method to Router so handleListModels can append model group IDs (e.g. 'deepseek-auto', 'openai-auto') to the model list, marked with owned_by: 'gophergate'. This lets clients discover and use groups via the standard OpenAI /v1/models endpoint. --- internal/router/router.go | 9 +++++++++ internal/server/server.go | 14 ++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/internal/router/router.go b/internal/router/router.go index 2e512a83..cc7f1e57 100644 --- a/internal/router/router.go +++ b/internal/router/router.go @@ -36,6 +36,15 @@ func New(groups []db.ModelGroup, classify ClassifierFunc) *Router { return r } +// Groups returns all registered model group IDs. +func (r *Router) Groups() []string { + ids := make([]string, 0, len(r.groups)) + for id := range r.groups { + ids = append(ids, id) + } + return ids +} + // IsGroup returns true if the model name is a group ID. func (r *Router) IsGroup(modelID string) bool { _, ok := r.groups[modelID] diff --git a/internal/server/server.go b/internal/server/server.go index bf8845e7..b1fddab1 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -467,6 +467,20 @@ func (s *Server) handleListModels(c *gin.Context) { } } + // Add model groups so clients can discover them + if s.modelRouter != nil { + for _, gid := range s.modelRouter.Groups() { + if _, exists := modelMap[gid]; !exists { + modelMap[gid] = OpenAIModel{ + ID: gid, + Object: "model", + Created: 1700000000, + OwnedBy: "gophergate", + } + } + } + } + var data []OpenAIModel for _, m := range modelMap { data = append(data, m)