@acarmisc/backstage-plugin-litellm 0.41.0 → 0.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.esm.js CHANGED
@@ -265,6 +265,10 @@ var init_api = __esm({
265
265
  async getVectorStores() {
266
266
  return this.get("/vector-stores");
267
267
  }
268
+ // Names only, readable by any signed-in user; never used for the picker.
269
+ async getObjectNames() {
270
+ return this.get("/object-names");
271
+ }
268
272
  async setTeamKnowledgeBases(teamId, vectorStores) {
269
273
  return this.put(
270
274
  `/teams/${encodeURIComponent(teamId)}/knowledge-bases`,
@@ -1762,7 +1766,8 @@ var init_KeysTable = __esm({
1762
1766
  onDeleteKey,
1763
1767
  onPruneExpiredKeys,
1764
1768
  filter,
1765
- onClearFilter
1769
+ onClearFilter,
1770
+ teams
1766
1771
  }) => {
1767
1772
  const managePermission = usePermission({ permission: litellmKeyManagePermission });
1768
1773
  const revokePermission = usePermission({ permission: litellmKeyRevokePermission });
@@ -1790,9 +1795,14 @@ var init_KeysTable = __esm({
1790
1795
  setSortDirection("asc");
1791
1796
  }
1792
1797
  };
1798
+ const teamNames = useMemo2(
1799
+ () => new Map((teams ?? []).map((t) => [t.team_id, t.team_alias || t.team_id])),
1800
+ [teams]
1801
+ );
1802
+ const teamLabel = (id) => teamNames.get(id) ?? id;
1793
1803
  const teamIds = useMemo2(
1794
- () => [...new Set(keys.map((k) => k.team_id).filter((t) => !!t))].sort(),
1795
- [keys]
1804
+ () => [...new Set(keys.map((k) => k.team_id).filter((t) => !!t))].sort((a, b) => (teamNames.get(a) ?? a).localeCompare(teamNames.get(b) ?? b)),
1805
+ [keys, teamNames]
1796
1806
  );
1797
1807
  const filteredKeys = useMemo2(() => {
1798
1808
  let result = keys;
@@ -1916,7 +1926,7 @@ var init_KeysTable = __esm({
1916
1926
  /* @__PURE__ */ jsx8(Typography5, { variant: "body2", children: key.key_alias || "\u2014" }),
1917
1927
  key.blocked && /* @__PURE__ */ jsx8(StatusPill, { label: "Blocked", tone: "danger" })
1918
1928
  ] }) }),
1919
- /* @__PURE__ */ jsx8(TableCell, { children: /* @__PURE__ */ jsx8(Typography5, { variant: "body2", color: "text.secondary", children: key.team_id || "\u2014" }) }),
1929
+ /* @__PURE__ */ jsx8(TableCell, { children: /* @__PURE__ */ jsx8(Typography5, { variant: "body2", color: "text.secondary", children: key.team_id ? teamLabel(key.team_id) : "\u2014" }) }),
1920
1930
  /* @__PURE__ */ jsx8(TableCell, { children: /* @__PURE__ */ jsxs7(Box7, { display: "flex", alignItems: "center", gap: 0.5, children: [
1921
1931
  /* @__PURE__ */ jsx8(
1922
1932
  Typography5,
@@ -2037,7 +2047,7 @@ var init_KeysTable = __esm({
2037
2047
  sx: { minWidth: 160 },
2038
2048
  children: [
2039
2049
  /* @__PURE__ */ jsx8(MenuItem, { value: "", children: "All teams" }),
2040
- teamIds.map((id) => /* @__PURE__ */ jsx8(MenuItem, { value: id, children: id }, id))
2050
+ teamIds.map((id) => /* @__PURE__ */ jsx8(MenuItem, { value: id, children: teamLabel(id) }, id))
2041
2051
  ]
2042
2052
  }
2043
2053
  ),
@@ -3219,9 +3229,11 @@ var init_ManageTeamDialog = __esm({
3219
3229
  onRemoveMember,
3220
3230
  canManageKnowledgeBases,
3221
3231
  vectorStores,
3232
+ vectorStoreNames,
3222
3233
  onSaveKnowledgeBases,
3223
3234
  canManageMcpServers,
3224
3235
  mcpServers,
3236
+ mcpServerNames,
3225
3237
  onSaveMcpServers,
3226
3238
  membersOnly,
3227
3239
  currentUserId,
@@ -3490,10 +3502,10 @@ var init_ManageTeamDialog = __esm({
3490
3502
  const durationOptions = BUDGET_DURATION_OPTIONS.some((o) => o.value === budgetDuration) ? BUDGET_DURATION_OPTIONS : [...BUDGET_DURATION_OPTIONS, { value: budgetDuration, label: budgetDuration }];
3491
3503
  const showKnowledgeBases = mode === "edit" && !!canManageKnowledgeBases;
3492
3504
  const kbOptions = (vectorStores ?? []).map((v) => v.id);
3493
- const kbLabel = (id) => (vectorStores ?? []).find((v) => v.id === id)?.name ?? id;
3505
+ const kbLabel = (id) => (vectorStoreNames ?? []).find((v) => v.id === id)?.name ?? id;
3494
3506
  const showMcpServers = mode === "edit" && !!canManageMcpServers;
3495
3507
  const mcpOptions = (mcpServers ?? []).map((s) => s.id);
3496
- const mcpLabel = (id) => (mcpServers ?? []).find((s) => s.id === id)?.name ?? id;
3508
+ const mcpLabel = (id) => (mcpServerNames ?? []).find((s) => s.id === id)?.name ?? id;
3497
3509
  const isRemovalDisabled = (memberUserId, memberRole) => {
3498
3510
  if (!membersOnly) return { disabled: false };
3499
3511
  if (memberUserId === currentUserId) {
@@ -5108,7 +5120,7 @@ var init_TeamUsage = __esm({
5108
5120
  }) })
5109
5121
  ] }) });
5110
5122
  };
5111
- TeamCard = ({ team, usage, usageLoading, memberUsage, memberUsageLoading, canManage, onEditTeam, canManageMembers, onManageMembers, onExpand }) => {
5123
+ TeamCard = ({ team, usage, usageLoading, memberUsage, memberUsageLoading, canManage, onEditTeam, canManageMembers, onManageMembers, onExpand, vectorStores, mcpServers }) => {
5112
5124
  const [expanded, setExpanded] = useState9(false);
5113
5125
  const chart = useChartTheme();
5114
5126
  const handleExpandChange = (newExpanded) => {
@@ -5175,6 +5187,10 @@ var init_TeamUsage = __esm({
5175
5187
  children: label
5176
5188
  }
5177
5189
  );
5190
+ const renderNamedTags = (label, ids, items) => /* @__PURE__ */ jsxs14(Box14, { mb: 2.5, children: [
5191
+ sectionLabel(label),
5192
+ ids?.length ? /* @__PURE__ */ jsx15(Box14, { display: "flex", gap: 0.5, flexWrap: "wrap", children: ids.map((id) => /* @__PURE__ */ jsx15(TagChip, { label: items?.find((i) => i.id === id)?.name ?? id, title: id }, id)) }) : /* @__PURE__ */ jsx15(Typography12, { variant: "body2", color: "text.secondary", children: "None configured" })
5193
+ ] });
5178
5194
  return /* @__PURE__ */ jsxs14(Paper8, { variant: "outlined", sx: { borderRadius: 2, p: 2.5 }, children: [
5179
5195
  /* @__PURE__ */ jsxs14(Box14, { display: "flex", alignItems: "center", gap: 1.5, children: [
5180
5196
  /* @__PURE__ */ jsx15(
@@ -5300,6 +5316,8 @@ var init_TeamUsage = __esm({
5300
5316
  sectionLabel("Models"),
5301
5317
  team.models?.length ? /* @__PURE__ */ jsx15(Box14, { display: "flex", gap: 0.5, flexWrap: "wrap", children: team.models.map((m) => /* @__PURE__ */ jsx15(TagChip, { label: m, title: m }, m)) }) : /* @__PURE__ */ jsx15(Typography12, { variant: "body2", color: "text.secondary", children: "All models allowed" })
5302
5318
  ] }),
5319
+ renderNamedTags("Knowledge bases", team.object_permission?.vector_stores, vectorStores),
5320
+ renderNamedTags("MCP servers", team.object_permission?.mcp_servers, mcpServers),
5303
5321
  renderDailySpendSection(),
5304
5322
  (memberUsageLoading || memberUsage) && /* @__PURE__ */ jsxs14(Box14, { mb: 2.5, children: [
5305
5323
  sectionLabel("Usage by member"),
@@ -5368,7 +5386,9 @@ var init_TeamUsage = __esm({
5368
5386
  onTeamExpand,
5369
5387
  canManageMembers,
5370
5388
  onManageMembers,
5371
- readOnly
5389
+ readOnly,
5390
+ vectorStores,
5391
+ mcpServers
5372
5392
  }) => {
5373
5393
  const readOnlyBadge = /* @__PURE__ */ jsx15(MuiTooltip, { title: "Teams and memberships are managed in your identity provider. Changes made here would be overwritten, so editing is disabled.", children: /* @__PURE__ */ jsxs14(
5374
5394
  Box14,
@@ -5426,7 +5446,9 @@ var init_TeamUsage = __esm({
5426
5446
  onEditTeam,
5427
5447
  canManageMembers: canManageMembers?.(team),
5428
5448
  onManageMembers,
5429
- onExpand: onTeamExpand
5449
+ onExpand: onTeamExpand,
5450
+ vectorStores,
5451
+ mcpServers
5430
5452
  },
5431
5453
  team.team_id
5432
5454
  )) })
@@ -6401,12 +6423,16 @@ var init_LiteLLMPage = __esm({
6401
6423
  const teamMgmtEnabled = liteLlmConfig?.teamManagement?.enabled ?? false;
6402
6424
  const objectPermsEnabled = liteLlmConfig?.teamManagement?.objectPermissionsEnabled ?? false;
6403
6425
  const { value: vectorStores } = useAsync(
6404
- async () => objectPermsEnabled ? api.getVectorStores().catch(() => []) : [],
6405
- [api, objectPermsEnabled]
6426
+ () => api.getVectorStores().catch(() => []),
6427
+ [api]
6406
6428
  );
6407
6429
  const { value: mcpServers } = useAsync(
6408
- async () => objectPermsEnabled ? api.getMcpServers().catch(() => []) : [],
6409
- [api, objectPermsEnabled]
6430
+ () => api.getMcpServers().catch(() => []),
6431
+ [api]
6432
+ );
6433
+ const { value: objectNames } = useAsync(
6434
+ () => api.getObjectNames().catch(() => ({ vector_stores: [], mcp_servers: [] })),
6435
+ [api]
6410
6436
  );
6411
6437
  const teams = useMemo9(() => {
6412
6438
  if (!allTeams?.length) return [];
@@ -6732,7 +6758,8 @@ var init_LiteLLMPage = __esm({
6732
6758
  onDeleteKey: handleDeleteKey,
6733
6759
  onPruneExpiredKeys: handlePruneExpiredKeys,
6734
6760
  filter,
6735
- onClearFilter: clearFilter
6761
+ onClearFilter: clearFilter,
6762
+ teams: allTeams ?? []
6736
6763
  }
6737
6764
  );
6738
6765
  })(),
@@ -6763,6 +6790,8 @@ var init_LiteLLMPage = __esm({
6763
6790
  onEditTeam: (t) => setManageTeam({ mode: "edit", team: t }),
6764
6791
  canCreate: teamMgmtEnabled && canCreateTeam && !readOnly,
6765
6792
  onCreateTeam: () => setManageTeam({ mode: "create" }),
6793
+ vectorStores: objectNames?.vector_stores ?? [],
6794
+ mcpServers: objectNames?.mcp_servers ?? [],
6766
6795
  canManageMembers: (t) => teamMgmtEnabled && canManageMembers && isTeamMemberManager(t, userInfo?.user_id, memberManagerRoles, readOnly),
6767
6796
  onManageMembers: (t) => setManageTeam({ mode: "members", team: t }),
6768
6797
  readOnly,
@@ -6894,6 +6923,7 @@ var init_LiteLLMPage = __esm({
6894
6923
  },
6895
6924
  canManageKnowledgeBases: teamMgmtEnabled && objectPermsEnabled && canManageKnowledgeBases,
6896
6925
  vectorStores: vectorStores ?? [],
6926
+ vectorStoreNames: objectNames?.vector_stores ?? [],
6897
6927
  onSaveKnowledgeBases: async (vectorStoreIds) => {
6898
6928
  if (!manageTeam?.team) return;
6899
6929
  try {
@@ -6912,6 +6942,7 @@ var init_LiteLLMPage = __esm({
6912
6942
  },
6913
6943
  canManageMcpServers: teamMgmtEnabled && objectPermsEnabled && canManageMcpServers,
6914
6944
  mcpServers: mcpServers ?? [],
6945
+ mcpServerNames: objectNames?.mcp_servers ?? [],
6915
6946
  onSaveMcpServers: async (mcpServerIds) => {
6916
6947
  if (!manageTeam?.team) return;
6917
6948
  try {