@acarmisc/backstage-plugin-litellm 0.41.0 → 0.42.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
@@ -1762,7 +1762,8 @@ var init_KeysTable = __esm({
1762
1762
  onDeleteKey,
1763
1763
  onPruneExpiredKeys,
1764
1764
  filter,
1765
- onClearFilter
1765
+ onClearFilter,
1766
+ teams
1766
1767
  }) => {
1767
1768
  const managePermission = usePermission({ permission: litellmKeyManagePermission });
1768
1769
  const revokePermission = usePermission({ permission: litellmKeyRevokePermission });
@@ -1790,9 +1791,14 @@ var init_KeysTable = __esm({
1790
1791
  setSortDirection("asc");
1791
1792
  }
1792
1793
  };
1794
+ const teamNames = useMemo2(
1795
+ () => new Map((teams ?? []).map((t) => [t.team_id, t.team_alias || t.team_id])),
1796
+ [teams]
1797
+ );
1798
+ const teamLabel = (id) => teamNames.get(id) ?? id;
1793
1799
  const teamIds = useMemo2(
1794
- () => [...new Set(keys.map((k) => k.team_id).filter((t) => !!t))].sort(),
1795
- [keys]
1800
+ () => [...new Set(keys.map((k) => k.team_id).filter((t) => !!t))].sort((a, b) => (teamNames.get(a) ?? a).localeCompare(teamNames.get(b) ?? b)),
1801
+ [keys, teamNames]
1796
1802
  );
1797
1803
  const filteredKeys = useMemo2(() => {
1798
1804
  let result = keys;
@@ -1916,7 +1922,7 @@ var init_KeysTable = __esm({
1916
1922
  /* @__PURE__ */ jsx8(Typography5, { variant: "body2", children: key.key_alias || "\u2014" }),
1917
1923
  key.blocked && /* @__PURE__ */ jsx8(StatusPill, { label: "Blocked", tone: "danger" })
1918
1924
  ] }) }),
1919
- /* @__PURE__ */ jsx8(TableCell, { children: /* @__PURE__ */ jsx8(Typography5, { variant: "body2", color: "text.secondary", children: key.team_id || "\u2014" }) }),
1925
+ /* @__PURE__ */ jsx8(TableCell, { children: /* @__PURE__ */ jsx8(Typography5, { variant: "body2", color: "text.secondary", children: key.team_id ? teamLabel(key.team_id) : "\u2014" }) }),
1920
1926
  /* @__PURE__ */ jsx8(TableCell, { children: /* @__PURE__ */ jsxs7(Box7, { display: "flex", alignItems: "center", gap: 0.5, children: [
1921
1927
  /* @__PURE__ */ jsx8(
1922
1928
  Typography5,
@@ -2037,7 +2043,7 @@ var init_KeysTable = __esm({
2037
2043
  sx: { minWidth: 160 },
2038
2044
  children: [
2039
2045
  /* @__PURE__ */ jsx8(MenuItem, { value: "", children: "All teams" }),
2040
- teamIds.map((id) => /* @__PURE__ */ jsx8(MenuItem, { value: id, children: id }, id))
2046
+ teamIds.map((id) => /* @__PURE__ */ jsx8(MenuItem, { value: id, children: teamLabel(id) }, id))
2041
2047
  ]
2042
2048
  }
2043
2049
  ),
@@ -5108,7 +5114,7 @@ var init_TeamUsage = __esm({
5108
5114
  }) })
5109
5115
  ] }) });
5110
5116
  };
5111
- TeamCard = ({ team, usage, usageLoading, memberUsage, memberUsageLoading, canManage, onEditTeam, canManageMembers, onManageMembers, onExpand }) => {
5117
+ TeamCard = ({ team, usage, usageLoading, memberUsage, memberUsageLoading, canManage, onEditTeam, canManageMembers, onManageMembers, onExpand, vectorStores, mcpServers }) => {
5112
5118
  const [expanded, setExpanded] = useState9(false);
5113
5119
  const chart = useChartTheme();
5114
5120
  const handleExpandChange = (newExpanded) => {
@@ -5175,6 +5181,10 @@ var init_TeamUsage = __esm({
5175
5181
  children: label
5176
5182
  }
5177
5183
  );
5184
+ const renderNamedTags = (label, ids, items) => /* @__PURE__ */ jsxs14(Box14, { mb: 2.5, children: [
5185
+ sectionLabel(label),
5186
+ 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" })
5187
+ ] });
5178
5188
  return /* @__PURE__ */ jsxs14(Paper8, { variant: "outlined", sx: { borderRadius: 2, p: 2.5 }, children: [
5179
5189
  /* @__PURE__ */ jsxs14(Box14, { display: "flex", alignItems: "center", gap: 1.5, children: [
5180
5190
  /* @__PURE__ */ jsx15(
@@ -5300,6 +5310,8 @@ var init_TeamUsage = __esm({
5300
5310
  sectionLabel("Models"),
5301
5311
  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
5312
  ] }),
5313
+ renderNamedTags("Knowledge bases", team.object_permission?.vector_stores, vectorStores),
5314
+ renderNamedTags("MCP servers", team.object_permission?.mcp_servers, mcpServers),
5303
5315
  renderDailySpendSection(),
5304
5316
  (memberUsageLoading || memberUsage) && /* @__PURE__ */ jsxs14(Box14, { mb: 2.5, children: [
5305
5317
  sectionLabel("Usage by member"),
@@ -5368,7 +5380,9 @@ var init_TeamUsage = __esm({
5368
5380
  onTeamExpand,
5369
5381
  canManageMembers,
5370
5382
  onManageMembers,
5371
- readOnly
5383
+ readOnly,
5384
+ vectorStores,
5385
+ mcpServers
5372
5386
  }) => {
5373
5387
  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
5388
  Box14,
@@ -5426,7 +5440,9 @@ var init_TeamUsage = __esm({
5426
5440
  onEditTeam,
5427
5441
  canManageMembers: canManageMembers?.(team),
5428
5442
  onManageMembers,
5429
- onExpand: onTeamExpand
5443
+ onExpand: onTeamExpand,
5444
+ vectorStores,
5445
+ mcpServers
5430
5446
  },
5431
5447
  team.team_id
5432
5448
  )) })
@@ -6401,12 +6417,12 @@ var init_LiteLLMPage = __esm({
6401
6417
  const teamMgmtEnabled = liteLlmConfig?.teamManagement?.enabled ?? false;
6402
6418
  const objectPermsEnabled = liteLlmConfig?.teamManagement?.objectPermissionsEnabled ?? false;
6403
6419
  const { value: vectorStores } = useAsync(
6404
- async () => objectPermsEnabled ? api.getVectorStores().catch(() => []) : [],
6405
- [api, objectPermsEnabled]
6420
+ () => api.getVectorStores().catch(() => []),
6421
+ [api]
6406
6422
  );
6407
6423
  const { value: mcpServers } = useAsync(
6408
- async () => objectPermsEnabled ? api.getMcpServers().catch(() => []) : [],
6409
- [api, objectPermsEnabled]
6424
+ () => api.getMcpServers().catch(() => []),
6425
+ [api]
6410
6426
  );
6411
6427
  const teams = useMemo9(() => {
6412
6428
  if (!allTeams?.length) return [];
@@ -6732,7 +6748,8 @@ var init_LiteLLMPage = __esm({
6732
6748
  onDeleteKey: handleDeleteKey,
6733
6749
  onPruneExpiredKeys: handlePruneExpiredKeys,
6734
6750
  filter,
6735
- onClearFilter: clearFilter
6751
+ onClearFilter: clearFilter,
6752
+ teams: allTeams ?? []
6736
6753
  }
6737
6754
  );
6738
6755
  })(),
@@ -6763,6 +6780,8 @@ var init_LiteLLMPage = __esm({
6763
6780
  onEditTeam: (t) => setManageTeam({ mode: "edit", team: t }),
6764
6781
  canCreate: teamMgmtEnabled && canCreateTeam && !readOnly,
6765
6782
  onCreateTeam: () => setManageTeam({ mode: "create" }),
6783
+ vectorStores: vectorStores ?? [],
6784
+ mcpServers: mcpServers ?? [],
6766
6785
  canManageMembers: (t) => teamMgmtEnabled && canManageMembers && isTeamMemberManager(t, userInfo?.user_id, memberManagerRoles, readOnly),
6767
6786
  onManageMembers: (t) => setManageTeam({ mode: "members", team: t }),
6768
6787
  readOnly,