From 62cd63bfdab33d4bff289be8fe5bfc98eda23294 Mon Sep 17 00:00:00 2001 From: lyy0709 <65712338+lyy0709@users.noreply.github.com> Date: Sat, 5 Sep 2026 16:24:15 +0800 Subject: [PATCH] fix(openai): retain capabilities when model listing is unavailable --- backend/internal/service/upstream_models.go | 10 +++++++++- backend/internal/service/upstream_models_test.go | 4 ++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/backend/internal/service/upstream_models.go b/backend/internal/service/upstream_models.go index 1a10cc8fe7..9d45d2f617 100644 --- a/backend/internal/service/upstream_models.go +++ b/backend/internal/service/upstream_models.go @@ -208,6 +208,7 @@ func (s *AccountTestService) FetchUpstreamSupportedModels(ctx context.Context, a // untouched. func (s *AccountTestService) SyncUpstreamModelCatalog(ctx context.Context, account *Account) (*UpstreamModelCatalog, error) { models, body, err := s.fetchUpstreamModelList(ctx, account) + liveListAvailable := err == nil if err != nil { configuredModels := configuredUpstreamModelsForCapabilitySync(account) if !upstreamModelListEndpointUnsupported(err) || len(configuredModels) == 0 { @@ -264,7 +265,14 @@ func (s *AccountTestService) SyncUpstreamModelCatalog(ctx context.Context, accou if len(completeMetadata) > 0 && account != nil && account.ID > 0 && s.accountRepo != nil { // Retain known metadata only for models still listed or explicitly mapped. if previous := account.GetUpstreamModelMetadataSnapshot(); previous != nil { - for _, modelID := range capabilityIDs { + retainedModels := capabilityIDs + if !liveListAvailable { + retainedModels = append([]string(nil), capabilityIDs...) + for modelID := range previous.Models { + retainedModels = append(retainedModels, modelID) + } + } + for _, modelID := range retainedModels { old, exists := previous.Models[modelID] if !exists { continue diff --git a/backend/internal/service/upstream_models_test.go b/backend/internal/service/upstream_models_test.go index 594db7adb3..e0e9f263ec 100644 --- a/backend/internal/service/upstream_models_test.go +++ b/backend/internal/service/upstream_models_test.go @@ -545,8 +545,12 @@ func TestSyncUpstreamModelCatalogUsesConfiguredModelsWhenListEndpointUnsupported }, } + account.SetUpstreamModelMetadataSnapshot(UpstreamModelMetadataSnapshot{Models: map[string]UpstreamModelMetadata{ + "old-live-model": {ID: "old-live-model", ContextWindow: 256000}, + }}) catalog, err := svc.SyncUpstreamModelCatalog(context.Background(), account) require.NoError(t, err) + require.Contains(t, account.GetUpstreamModelMetadataSnapshot().Models, "old-live-model", "an unavailable model-list endpoint is not evidence of removal") require.Equal(t, []string{"glm-5.3"}, catalog.Models) require.Empty(t, catalog.Warnings) require.Len(t, upstream.requests, 2)