From a6183af6f3200b1ee06561913cd9eb5bc1a0fb91 Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" <219766164+opencode-agent[bot]@users.noreply.github.com> Date: Wed, 16 Sep 2026 12:47:12 -0500 Subject: [PATCH] fix(stats): hide Union Alpha provider (#49356) Co-authored-by: adamdotdevin <2363879+adamdotdevin@users.noreply.github.com> --- .../stats/core/src/domain/inference.test.ts | 24 +++++++++++++++++-- .../core/src/domain/model-normalization.ts | 4 +++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/packages/stats/core/src/domain/inference.test.ts b/packages/stats/core/src/domain/inference.test.ts index 7660d174dc..8f7f4374c2 100644 --- a/packages/stats/core/src/domain/inference.test.ts +++ b/packages/stats/core/src/domain/inference.test.ts @@ -85,6 +85,20 @@ describe("inference stat normalization", () => { expect(toRetentionAggregate({ ...row, cohort_date: "2026-08-10", eligible_users: "12" })).toMatchObject([ { model: "omen-alpha", provider: "unknown", eligibleUsers: 12 }, ]) + ;["opencode-go/union-alpha", "opencode/union-alpha"].forEach((model) => { + expect(statModel(model, "")).toBe("union-alpha") + expect(statProvider(model, "gpt-test-model", "test-provider")).toBe("unknown") + + const row = { ...aggregate(model, "test-provider"), provider_model: "gpt-test-model" } + expect(toModelAggregate(row)).toMatchObject([{ model: "union-alpha", provider: "unknown", requests: 1 }]) + expect(toProviderAggregate(row)).toMatchObject([{ provider: "unknown", requests: 1 }]) + expect(toGeoAggregate({ ...row, country: "US" })).toMatchObject([ + { model: "union-alpha", provider: "unknown", country: "US", requests: 1 }, + ]) + expect(toRetentionAggregate({ ...row, cohort_date: "2026-08-10", eligible_users: "12" })).toMatchObject([ + { model: "union-alpha", provider: "unknown", eligibleUsers: 12 }, + ]) + }) }) test("merges renamed models under their current name", () => { @@ -184,7 +198,9 @@ describe("inference stat normalization", () => { expect(queries).toHaveLength(8) queries.forEach((query) => { expect(query).toContain("WHERE lower(model) NOT IN ('alpha-gpt-next')") - expect(query).toContain("CASE\n WHEN lower(model) IN ('omen-alpha') THEN 'unknown'\n") + expect(query).toContain("CASE\n WHEN lower(model) IN ('omen-alpha', 'union-alpha') THEN 'unknown'\n") + expect(query).toContain("= 'opencode-go/union-alpha' THEN 'union-alpha'") + expect(query).toContain("= 'opencode/union-alpha' THEN 'union-alpha'") expect(query).toContain("= 'deepseek-flash' THEN 'deepseek-v4.1-flash'") }) expect(queries[0]).toContain("'week' AS grain") @@ -253,7 +269,11 @@ describe("inference stat normalization", () => { expect(queries.map((query) => query.cohortDates)).toEqual([["2026-08-10"], ["2026-08-17"]]) expect(queries[0]?.query).toContain("AND product = 'go'") expect(queries[0]?.query).toContain("AND lower(model) NOT IN ('alpha-gpt-next')") - expect(queries[0]?.query).toContain("CASE\n WHEN lower(model) IN ('omen-alpha') THEN 'unknown'\n") + expect(queries[0]?.query).toContain( + "CASE\n WHEN lower(model) IN ('omen-alpha', 'union-alpha') THEN 'unknown'\n", + ) + expect(queries[0]?.query).toContain("= 'opencode-go/union-alpha' THEN 'union-alpha'") + expect(queries[0]?.query).toContain("= 'opencode/union-alpha' THEN 'union-alpha'") expect(queries[0]?.query).toContain("COUNT(*) AS model_requests") expect(queries[0]?.query).toContain("SUM(model_requests) AS total_requests") expect(queries[0]?.query).toContain("MAX(model_requests) AS max_model_requests") diff --git a/packages/stats/core/src/domain/model-normalization.ts b/packages/stats/core/src/domain/model-normalization.ts index b2bffd5fc3..081cffac7e 100644 --- a/packages/stats/core/src/domain/model-normalization.ts +++ b/packages/stats/core/src/domain/model-normalization.ts @@ -14,13 +14,15 @@ export const MODEL_AUTHOR_RULES = [ { match: "qwen", author: "qwen" }, ] as const export const EXCLUDED_MODELS = new Set(["alpha-gpt-next"]) -export const STEALTH_MODELS = new Set(["omen-alpha"]) +export const STEALTH_MODELS = new Set(["omen-alpha", "union-alpha"]) export const FREE_MODELS = new Set(["gpt-5-nano", "grok-code", "big-pickle"]) export const MODEL_NAME_MAX_LENGTH = 256 export const MODEL_NAME_ALIASES: Record = { "deepseek-flash": "deepseek-v4.1-flash", "deepseek-v4-flash-0731": "deepseek-v4-flash", "deepseek-v4-flash-dsv4-flash-final-rnaovd": "deepseek-v4-flash", + "opencode-go/union-alpha": "union-alpha", + "opencode/union-alpha": "union-alpha", "ox-alpha": "glm-5.3-flash", "x-preview-f": "glm-5.3-flash", "xiaomi/mimo-v2.5": "mimo-v2.5",