Files
buzz/desktop/src/features/agents/lib/agentCardModelLabel.test.mjs
npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 144ef4d9d0 feat(catalog): replace Databricks model-label tokenizer with models.dev registry lookup
The frontend heuristic in #3586 title-cased every word and converted adjacent
digit pairs to decimals for any string starting with 'databricks-'. This
invented false labels for custom workspace endpoints: 'databricks-team-2025-01'
→ 'Team 2025.01', 'databricks-finance-2025-01-30' → 'Finance 2025.01 30'.

Replace with a lookup-and-pass-through approach drawn from the same design
goose uses in production:

- Generator script (scripts/generate-databricks-model-names.py) fetches
  https://models.dev/api.json and emits a sorted Rust static slice of
  (id, name) pairs under crates/buzz-agent/src/databricks_model_names.rs.
  Refresh by rerunning the script and committing the diff.

- catalog.rs consults the table via databricks_model_name(id): known managed
  endpoints get curated names (e.g. 'databricks-gpt-5-5' → 'GPT-5.5'),
  unknown/custom endpoints return their raw ID unchanged. Applied to all
  ModelEntry construction paths: v1/v2 discovery, the empty-list fallback,
  and discovery_failure_fallback.

- Frontend: a matching TS registry (desktop/src/features/agents/lib/
  databricksModelNames.ts) covers persisted raw IDs on cards, rows, and
  popovers that render before discovery data is available. formatAgentModelLabel
  and formatDefaultModelLabel use the registry; no heuristic string mangling
  exists anywhere in the TS layer.

- AGENTS.md documents the three-tier label precedence: API/runtime name first,
  table-backed fallback second, raw ID last.

Supersedes #3586 (kennylopez-model-display-labels).

Co-authored-by: Will Pfleger <pfleger.will@gmail.com>
Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
2026-07-29 15:03:47 -04:00

115 lines
4.0 KiB
JavaScript

import assert from "node:assert/strict";
import test from "node:test";
import { resolveAgentCardModelLabel } from "./agentCardModelLabel.ts";
test("resolveAgentCardModelLabel — unspawned definition with explicit model renders the model, not inherited", () => {
const label = resolveAgentCardModelLabel({
agent: undefined,
personaModel: "gpt-5",
defaultModel: "claude-sonnet",
});
assert.equal(label, "gpt-5");
});
test("resolveAgentCardModelLabel — unspawned definition with no model renders the default", () => {
const label = resolveAgentCardModelLabel({
agent: undefined,
personaModel: null,
defaultModel: "claude-sonnet",
});
assert.equal(label, "Default model (claude-sonnet)");
});
test("resolveAgentCardModelLabel — linked instance inheriting the global default ignores stale persona.model", () => {
const label = resolveAgentCardModelLabel({
agent: { modelSource: "global", model: "stale-model" },
personaModel: "gpt-5",
defaultModel: "claude-sonnet",
});
assert.equal(label, "Default model (claude-sonnet)");
});
test("resolveAgentCardModelLabel — linked instance with no modelSource (legacy/unset) is treated as inherited", () => {
const label = resolveAgentCardModelLabel({
agent: { modelSource: null, model: "stale-model" },
personaModel: "gpt-5",
defaultModel: "claude-sonnet",
});
assert.equal(label, "Default model (claude-sonnet)");
});
test("resolveAgentCardModelLabel — linked instance with an explicit resolved model renders that model", () => {
const label = resolveAgentCardModelLabel({
agent: { modelSource: "definition", model: "gpt-5" },
personaModel: "should-not-be-used",
defaultModel: "claude-sonnet",
});
assert.equal(label, "gpt-5");
});
test("resolveAgentCardModelLabel — non-inherited agent with a blank resolved model falls back to the default", () => {
const label = resolveAgentCardModelLabel({
agent: { modelSource: "instance_legacy", model: " " },
personaModel: null,
defaultModel: "claude-sonnet",
});
assert.equal(label, "Default model (claude-sonnet)");
});
// Databricks registry integration
import { formatAgentModelLabel } from "./formatAgentModelLabel.ts";
test("formatAgentModelLabel — known Databricks managed ID returns curated name", () => {
assert.equal(formatAgentModelLabel("databricks-gpt-5-5"), "GPT-5.5");
assert.equal(
formatAgentModelLabel("databricks-claude-opus-4-7"),
"Claude Opus 4.7",
);
});
test("formatAgentModelLabel — unknown custom Databricks ID returns raw ID unchanged", () => {
assert.equal(
formatAgentModelLabel("databricks-team-2025-01"),
"databricks-team-2025-01",
);
});
test("formatAgentModelLabel — non-Databricks ID returns raw ID unchanged", () => {
assert.equal(formatAgentModelLabel("claude-sonnet-4-7"), "claude-sonnet-4-7");
assert.equal(formatAgentModelLabel("gpt-4o"), "gpt-4o");
});
test("formatAgentModelLabel — null or empty returns Auto", () => {
assert.equal(formatAgentModelLabel(null), "Auto");
assert.equal(formatAgentModelLabel(""), "Auto");
assert.equal(formatAgentModelLabel(" "), "Auto");
});
test("resolveAgentCardModelLabel — known Databricks defaultModel renders curated name in default label", () => {
const label = resolveAgentCardModelLabel({
agent: undefined,
personaModel: null,
defaultModel: "databricks-gpt-5-5",
});
assert.equal(label, "Default model (GPT-5.5)");
});
test("resolveAgentCardModelLabel — unknown custom Databricks defaultModel renders raw ID in default label", () => {
const label = resolveAgentCardModelLabel({
agent: undefined,
personaModel: null,
defaultModel: "databricks-team-2025-01",
});
assert.equal(label, "Default model (databricks-team-2025-01)");
});
test("resolveAgentCardModelLabel — known Databricks agent model renders curated name", () => {
const label = resolveAgentCardModelLabel({
agent: { modelSource: "definition", model: "databricks-gpt-oss-120b" },
personaModel: null,
defaultModel: "something-else",
});
assert.equal(label, "GPT OSS 120B");
});