diff --git a/core/http/react-ui/src/pages/Backends.jsx b/core/http/react-ui/src/pages/Backends.jsx index 16c3edfa3..26d479ea4 100644 --- a/core/http/react-ui/src/pages/Backends.jsx +++ b/core/http/react-ui/src/pages/Backends.jsx @@ -74,9 +74,11 @@ export default function Backends() { const filteredBackends = (() => { let result = allBackends - // Show only meta backends unless "Show all" is toggled + // Hide concrete variants that are aliased by a meta backend unless + // "Show all" is toggled. Standalone backends (no meta referencing them) + // stay visible even when they don't declare capabilities themselves. if (!showAllBackends) { - result = result.filter(b => b.isMeta) + result = result.filter(b => b.isMeta || !b.isAlias) } // Hide development backends unless toggled on diff --git a/core/http/routes/ui_api.go b/core/http/routes/ui_api.go index f971e9ecb..b6db24e09 100644 --- a/core/http/routes/ui_api.go +++ b/core/http/routes/ui_api.go @@ -824,6 +824,19 @@ func RegisterUIAPIRoutes(app *echo.Echo, cl *config.ModelConfigLoader, ml *model }) } + // Collect concrete backend names that are referenced by any meta backend's + // CapabilitiesMap. These are the per-capability variants the UI hides by + // default behind "Show all" (the meta backend is the preferred entry). + aliasedByMeta := make(map[string]bool) + for _, b := range backends { + if !b.IsMeta() { + continue + } + for _, concreteName := range b.CapabilitiesMap { + aliasedByMeta[concreteName] = true + } + } + // Use the BackendManager's list to determine installed status. // In standalone mode this checks the local filesystem; in distributed // mode it aggregates from all healthy worker nodes. @@ -940,6 +953,7 @@ func RegisterUIAPIRoutes(app *echo.Echo, cl *config.ModelConfigLoader, ml *model "jobID": jobID, "isDeletion": isDeletionOp, "isMeta": b.IsMeta(), + "isAlias": aliasedByMeta[b.Name], "isDevelopment": b.IsDevelopment(devSuffix), }) }