mirror of
https://github.com/block/buzz.git
synced 2026-11-01 15:01:12 +00:00
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>
115 lines
4.0 KiB
JavaScript
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");
|
|
});
|