From 3f1e6d340789470ae8ab574d7bb680891727d3ad Mon Sep 17 00:00:00 2001 From: hobokenchicken Date: Thu, 19 Mar 2026 13:10:50 -0400 Subject: [PATCH] fix: restrict Model Pricing table to core providers and actual usage Filtered registry iteration to only include openai, gemini, deepseek, and grok. Improved used_only logic to match specific (model, provider) pairs from logs. --- internal/server/dashboard.go | 45 ++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/internal/server/dashboard.go b/internal/server/dashboard.go index b543d1ed..d08741f8 100644 --- a/internal/server/dashboard.go +++ b/internal/server/dashboard.go @@ -954,10 +954,13 @@ func (s *Server) handleTestProvider(c *gin.Context) { func (s *Server) handleGetModels(c *gin.Context) { usedOnly := c.Query("used_only") == "true" - // Provider name mapping (Registry -> Proxy) - providerMap := map[string]string{ - "google": "gemini", - "xai": "grok", + // Registry provider normalized name -> Proxy-internal provider ID + // This ensures we only show models from YOUR providers. + allowedRegistryProviders := map[string]string{ + "openai": "openai", + "google": "gemini", + "deepseek": "deepseek", + "xai": "grok", } // Merge registry models with DB overrides @@ -969,33 +972,35 @@ func (s *Server) handleGetModels(c *gin.Context) { dbMap[m.ID] = m } - // Fetch set of used model IDs if requested - usedModels := make(map[string]bool) + // Fetch specific (model, provider) combinations that have been used + type modelProvider struct { + Model string `db:"model"` + Provider string `db:"provider"` + } + usedPairs := make(map[string]bool) if usedOnly { - rows, err := s.database.Queryx("SELECT DISTINCT model FROM llm_requests") + var pairs []modelProvider + err := s.database.Select(&pairs, "SELECT DISTINCT model, provider FROM llm_requests WHERE status = 'success'") if err == nil { - for rows.Next() { - var mID string - if err := rows.Scan(&mID); err == nil { - usedModels[mID] = true - } + for _, p := range pairs { + // Key format: "gpt-4o:openai" + usedPairs[fmt.Sprintf("%s:%s", p.Model, p.Provider)] = true } - rows.Close() } } var result []gin.H if s.registry != nil { for pID, pInfo := range s.registry.Providers { - // Normalize provider name for UI - uiProvider := pID - if mapped, ok := providerMap[pID]; ok { - uiProvider = mapped + // Only include models from the 4 allowed registry IDs + proxyProvider, allowed := allowedRegistryProviders[pID] + if !allowed { + continue } for mID, mMeta := range pInfo.Models { - // Filter if used_only requested - if usedOnly && !usedModels[mID] { + // If usedOnly is true, only include if this exact (model, provider) was logged + if usedOnly && !usedPairs[fmt.Sprintf("%s:%s", mID, proxyProvider)] { continue } @@ -1038,7 +1043,7 @@ func (s *Server) handleGetModels(c *gin.Context) { result = append(result, gin.H{ "id": mID, "name": mMeta.Name, - "provider": uiProvider, + "provider": proxyProvider, // Correctly normalized provider name "enabled": enabled, "prompt_cost": promptCost, "completion_cost": completionCost,