fix(provider-topology): update label assignment to include nodeName

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
decolua
2026-06-13 11:43:18 +07:00
co-authored by Cursor
parent d652300e9e
commit 05e483c02e
4 changed files with 18 additions and 9 deletions
@@ -149,7 +149,7 @@ function buildLayout(providers, activeSet, lastSet, errorSet) {
const error = !active && errorSet.has(p.provider?.toLowerCase());
const nodeId = `provider-${p.provider}`;
const data = {
label: (config.name !== p.provider ? config.name : null) || p.name || p.provider,
label: (config.name !== p.provider ? config.name : null) || p.nodeName || p.name || p.provider,
color: config.color || "#6b7280",
imageUrl: getProviderImageUrl(p.provider),
textIcon: config.textIcon || (p.provider || "?").slice(0, 2).toUpperCase(),
+1 -1
View File
@@ -208,7 +208,7 @@ export default function ModelSelectModal({
// Find connection object to get prefix synchronously without waiting for providerNodes fetch
const connection = activeProviders.find(p => p.provider === providerId);
const matchedNode = providerNodes.find(node => node.id === providerId);
const displayName = connection?.name || matchedNode?.name || providerInfo.name;
const displayName = matchedNode?.name || connection?.name || providerInfo.name;
const nodePrefix = connection?.providerSpecificData?.prefix || matchedNode?.prefix || providerId;
// Aliases are stored using the raw providerId as key (e.g. "openai-compatible-chat-<uuid>/glm-4.7"),
+14 -4
View File
@@ -211,9 +211,16 @@ export default function UsageStats({ period: periodProp, setPeriod: setPeriodPro
// Fetch connected providers once, deduplicate by provider type
// Always include noAuth free providers (e.g. opencode) regardless of connections
useEffect(() => {
fetch("/api/providers")
.then((r) => r.ok ? r.json() : null)
.then((d) => {
Promise.all([
fetch("/api/providers").then((r) => r.ok ? r.json() : null),
fetch("/api/provider-nodes").then((r) => r.ok ? r.json() : null),
])
.then(([d, nodesData]) => {
// Build node name lookup for custom providers
const nodeNameMap = {};
for (const node of (nodesData?.nodes || [])) {
nodeNameMap[node.id] = node.name;
}
const seen = new Set();
const unique = (d?.connections || []).filter((c) => {
if (c.isActive === false) return false;
@@ -221,7 +228,10 @@ export default function UsageStats({ period: periodProp, setPeriod: setPeriodPro
if (seen.has(c.provider)) return false;
seen.add(c.provider);
return true;
});
}).map((c) => ({
...c,
nodeName: nodeNameMap[c.provider] || null,
}));
const noAuthProviders = Object.values(FREE_PROVIDERS)
.filter((p) => p.noAuth && !seen.has(p.id) && isLLMProvider(p.id))
.map((p) => ({ provider: p.id, name: p.name }));
+2 -3
View File
@@ -235,9 +235,8 @@ describe("MiMo Free provider registration", () => {
expect(PROVIDERS.mmf?.noAuth).toBe(true);
});
it("exposes the mmf model catalog", () => {
expect(Array.isArray(PROVIDER_MODELS.mmf)).toBe(true);
expect(PROVIDER_MODELS.mmf.some((m) => m.id === "mimo-auto")).toBe(true);
it("exposes only mimo-auto (the sole free-channel model)", () => {
expect(PROVIDER_MODELS.mmf.map((m) => m.id)).toEqual(["mimo-auto"]);
});
it("maps the mimo-free alias to mmf", () => {