From 59c62dc580bc50e24ab51c42c5735ed54a38e791 Mon Sep 17 00:00:00 2001 From: Luis Pater Date: Sun, 14 Dec 2025 21:27:43 +0800 Subject: [PATCH 1/3] fix(registry): correct DeepSeek-V3.2 experimental model ID --- internal/registry/model_definitions.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/registry/model_definitions.go b/internal/registry/model_definitions.go index 3725b825..a50e9171 100644 --- a/internal/registry/model_definitions.go +++ b/internal/registry/model_definitions.go @@ -650,7 +650,7 @@ func GetIFlowModels() []*ModelInfo { {ID: "kimi-k2-thinking", DisplayName: "Kimi-K2-Thinking", Description: "Moonshot Kimi K2 thinking model", Created: 1762387200, Thinking: &ThinkingSupport{Levels: []string{"low", "medium", "high"}}}, {ID: "deepseek-v3.2-chat", DisplayName: "DeepSeek-V3.2", Description: "DeepSeek V3.2 Chat", Created: 1764576000}, {ID: "deepseek-v3.2-reasoner", DisplayName: "DeepSeek-V3.2", Description: "DeepSeek V3.2 Reasoner", Created: 1764576000}, - {ID: "deepseek-v3.2-exp", DisplayName: "DeepSeek-V3.2-Exp", Description: "DeepSeek V3.2 experimental", Created: 1759104000}, + {ID: "deepseek-v3.2", DisplayName: "DeepSeek-V3.2-Exp", Description: "DeepSeek V3.2 experimental", Created: 1759104000}, {ID: "deepseek-v3.1", DisplayName: "DeepSeek-V3.1-Terminus", Description: "DeepSeek V3.1 Terminus", Created: 1756339200}, {ID: "deepseek-r1", DisplayName: "DeepSeek-R1", Description: "DeepSeek reasoning model R1", Created: 1737331200, Thinking: &ThinkingSupport{Levels: []string{"low", "medium", "high"}}}, {ID: "deepseek-v3", DisplayName: "DeepSeek-V3-671B", Description: "DeepSeek V3 671B", Created: 1734307200}, From 71f788b13a921181660db715d90f5b3ae914371e Mon Sep 17 00:00:00 2001 From: Luis Pater Date: Sun, 14 Dec 2025 21:30:17 +0800 Subject: [PATCH 2/3] fix(registry): remove unused `ThinkingSupport` from DeepSeek-R1 model --- internal/registry/model_definitions.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/registry/model_definitions.go b/internal/registry/model_definitions.go index a50e9171..7a4bdf0c 100644 --- a/internal/registry/model_definitions.go +++ b/internal/registry/model_definitions.go @@ -652,7 +652,7 @@ func GetIFlowModels() []*ModelInfo { {ID: "deepseek-v3.2-reasoner", DisplayName: "DeepSeek-V3.2", Description: "DeepSeek V3.2 Reasoner", Created: 1764576000}, {ID: "deepseek-v3.2", DisplayName: "DeepSeek-V3.2-Exp", Description: "DeepSeek V3.2 experimental", Created: 1759104000}, {ID: "deepseek-v3.1", DisplayName: "DeepSeek-V3.1-Terminus", Description: "DeepSeek V3.1 Terminus", Created: 1756339200}, - {ID: "deepseek-r1", DisplayName: "DeepSeek-R1", Description: "DeepSeek reasoning model R1", Created: 1737331200, Thinking: &ThinkingSupport{Levels: []string{"low", "medium", "high"}}}, + {ID: "deepseek-r1", DisplayName: "DeepSeek-R1", Description: "DeepSeek reasoning model R1", Created: 1737331200}, {ID: "deepseek-v3", DisplayName: "DeepSeek-V3-671B", Description: "DeepSeek V3 671B", Created: 1734307200}, {ID: "qwen3-32b", DisplayName: "Qwen3-32B", Description: "Qwen3 32B", Created: 1747094400}, {ID: "qwen3-235b-a22b-thinking-2507", DisplayName: "Qwen3-235B-A22B-Thinking", Description: "Qwen3 235B A22B Thinking (2507)", Created: 1753401600, Thinking: &ThinkingSupport{Levels: []string{"low", "medium", "high"}}}, From 07279f8746b84159be8c93cefd95b006a914b417 Mon Sep 17 00:00:00 2001 From: Test Date: Mon, 15 Dec 2025 00:13:05 +0800 Subject: [PATCH 3/3] feat: using Client Model Infos; --- internal/registry/model_registry.go | 40 +++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/internal/registry/model_registry.go b/internal/registry/model_registry.go index 888db60c..d4f84481 100644 --- a/internal/registry/model_registry.go +++ b/internal/registry/model_registry.go @@ -90,6 +90,9 @@ type ModelRegistry struct { models map[string]*ModelRegistration // clientModels maps client ID to the models it provides clientModels map[string][]string + // clientModelInfos maps client ID to a map of model ID -> ModelInfo + // This preserves the original model info provided by each client + clientModelInfos map[string]map[string]*ModelInfo // clientProviders maps client ID to its provider identifier clientProviders map[string]string // mutex ensures thread-safe access to the registry @@ -104,10 +107,11 @@ var registryOnce sync.Once func GetGlobalRegistry() *ModelRegistry { registryOnce.Do(func() { globalRegistry = &ModelRegistry{ - models: make(map[string]*ModelRegistration), - clientModels: make(map[string][]string), - clientProviders: make(map[string]string), - mutex: &sync.RWMutex{}, + models: make(map[string]*ModelRegistration), + clientModels: make(map[string][]string), + clientModelInfos: make(map[string]map[string]*ModelInfo), + clientProviders: make(map[string]string), + mutex: &sync.RWMutex{}, } }) return globalRegistry @@ -144,6 +148,7 @@ func (r *ModelRegistry) RegisterClient(clientID, clientProvider string, models [ // No models supplied; unregister existing client state if present. r.unregisterClientInternal(clientID) delete(r.clientModels, clientID) + delete(r.clientModelInfos, clientID) delete(r.clientProviders, clientID) misc.LogCredentialSeparator() return @@ -152,7 +157,7 @@ func (r *ModelRegistry) RegisterClient(clientID, clientProvider string, models [ now := time.Now() oldModels, hadExisting := r.clientModels[clientID] - oldProvider, _ := r.clientProviders[clientID] + oldProvider := r.clientProviders[clientID] providerChanged := oldProvider != provider if !hadExisting { // Pure addition path. @@ -161,6 +166,12 @@ func (r *ModelRegistry) RegisterClient(clientID, clientProvider string, models [ r.addModelRegistration(modelID, provider, model, now) } r.clientModels[clientID] = append([]string(nil), rawModelIDs...) + // Store client's own model infos + clientInfos := make(map[string]*ModelInfo, len(newModels)) + for id, m := range newModels { + clientInfos[id] = cloneModelInfo(m) + } + r.clientModelInfos[clientID] = clientInfos if provider != "" { r.clientProviders[clientID] = provider } else { @@ -287,6 +298,12 @@ func (r *ModelRegistry) RegisterClient(clientID, clientProvider string, models [ if len(rawModelIDs) > 0 { r.clientModels[clientID] = append([]string(nil), rawModelIDs...) } + // Update client's own model infos + clientInfos := make(map[string]*ModelInfo, len(newModels)) + for id, m := range newModels { + clientInfos[id] = cloneModelInfo(m) + } + r.clientModelInfos[clientID] = clientInfos if provider != "" { r.clientProviders[clientID] = provider } else { @@ -436,6 +453,7 @@ func (r *ModelRegistry) unregisterClientInternal(clientID string) { } delete(r.clientModels, clientID) + delete(r.clientModelInfos, clientID) if hasProvider { delete(r.clientProviders, clientID) } @@ -887,6 +905,9 @@ func (r *ModelRegistry) GetModelsForClient(clientID string) []*ModelInfo { return nil } + // Try to use client-specific model infos first + clientInfos := r.clientModelInfos[clientID] + seen := make(map[string]struct{}) result := make([]*ModelInfo, 0, len(modelIDs)) for _, modelID := range modelIDs { @@ -894,6 +915,15 @@ func (r *ModelRegistry) GetModelsForClient(clientID string) []*ModelInfo { continue } seen[modelID] = struct{}{} + + // Prefer client's own model info to preserve original type/owned_by + if clientInfos != nil { + if info, ok := clientInfos[modelID]; ok && info != nil { + result = append(result, info) + continue + } + } + // Fallback to global registry (for backwards compatibility) if reg, ok := r.models[modelID]; ok && reg.Info != nil { result = append(result, reg.Info) }