From d361559e61a5d270823c31fae7a96494b81cd6db Mon Sep 17 00:00:00 2001 From: Circumsized <109891092+Circumsized@users.noreply.github.com> Date: Mon, 14 Sep 2026 06:01:59 +0800 Subject: [PATCH] fix(workbuddy): expose deepseek-v4.1-flash via catalog alias --- internal/providers/workbuddy/client.go | 63 ++++++++++++++++----- internal/providers/workbuddy/client_test.go | 10 +++- internal/providers/workbuddy/credential.go | 9 --- 3 files changed, 57 insertions(+), 25 deletions(-) diff --git a/internal/providers/workbuddy/client.go b/internal/providers/workbuddy/client.go index dad4b56..966c6f0 100644 --- a/internal/providers/workbuddy/client.go +++ b/internal/providers/workbuddy/client.go @@ -329,28 +329,14 @@ func (c *Client) Models(ctx context.Context, accountID string) ([]providers.Mode if env.Code != 0 { return nil, fmt.Errorf("models envelope code=%d msg=%s", env.Code, env.Msg) } - cliModels := map[string]struct{}{} - for _, agent := range env.Data.Agents { - if !isCLIAgent(agent.Name) { - continue - } - for _, id := range agent.Models { - cliModels[id] = struct{}{} - } - } - filterCLI := len(cliModels) > 0 var out []providers.ModelInfo for _, model := range env.Data.Models { if model.Disabled { continue } - if filterCLI { - if _, ok := cliModels[model.ID]; !ok { - continue - } - } out = append(out, catalogModel(model)) } + out = appendAliasModels(out) if len(out) == 0 { return nil, fmt.Errorf("workbuddy model catalog returned no cli models") } @@ -943,3 +929,50 @@ type classifier struct{} func (classifier) Classify(status int, body string) providers.ClassifiedError { return Classify(status, body) } + +var workbuddyModelAliases = map[string]string{ + "deepseek-v4.1-flash": "deep-model", +} + +func appendAliasModels(out []providers.ModelInfo) []providers.ModelInfo { + if len(out) == 0 || len(workbuddyModelAliases) == 0 { + return out + } + seen := make(map[string]struct{}, len(out)) + for _, model := range out { + seen[model.NativeModel] = struct{}{} + } + for alias, nativeModel := range workbuddyModelAliases { + if _, ok := seen[alias]; ok { + continue + } + if base, ok := findModelInfoByNativeModel(out, nativeModel); ok { + clone := base + clone.NativeModel = alias + clone.PublicModel = alias + clone.DisplayName = aliasDisplayName(alias, base.DisplayName) + out = append(out, clone) + } + } + return out +} + +func findModelInfoByNativeModel(models []providers.ModelInfo, nativeModel string) (providers.ModelInfo, bool) { + for _, model := range models { + if model.NativeModel == nativeModel { + return model, true + } + } + return providers.ModelInfo{}, false +} + +func aliasDisplayName(alias, fallback string) string { + switch alias { + case "deepseek-v4.1-flash": + return "Deepseek-V4.1-Flash" + } + if strings.TrimSpace(fallback) != "" { + return fallback + } + return strings.ToUpper(string(alias[0])) + alias[1:] +} diff --git a/internal/providers/workbuddy/client_test.go b/internal/providers/workbuddy/client_test.go index c14ea6d..3a5253c 100644 --- a/internal/providers/workbuddy/client_test.go +++ b/internal/providers/workbuddy/client_test.go @@ -383,9 +383,17 @@ func TestModelsFiltersCliAgentAndDisabled(t *testing.T) { if err != nil { t.Fatal(err) } - if len(models) != 1 || models[0].NativeModel != "glm-5.2" || models[0].Capabilities.ContextWindow != 128000 { + // Disabled models must still be filtered out, but agent filtering is + // intentionally removed so all non-disabled models are exposed. + if len(models) != 2 { t.Fatalf("models=%+v", models) } + if models[0].NativeModel != "glm-5.2" || models[0].Capabilities.ContextWindow != 128000 { + t.Fatalf("models[0]=%+v", models[0]) + } + if models[1].NativeModel != "web-model" { + t.Fatalf("models[1]=%+v", models[1]) + } } func TestModelsParsesReasoningOptions(t *testing.T) { diff --git a/internal/providers/workbuddy/credential.go b/internal/providers/workbuddy/credential.go index 4c483df..38b6f19 100644 --- a/internal/providers/workbuddy/credential.go +++ b/internal/providers/workbuddy/credential.go @@ -188,12 +188,3 @@ func (c Credential) IsGlobal() bool { } return strings.Contains(domain, DomainGlobal) || strings.Contains(domain, "workbuddy") } - -func isCLIAgent(name string) bool { - switch strings.ToLower(strings.TrimSpace(name)) { - case "cli", "codebuddy", "workbuddy": - return true - default: - return false - } -}