@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/api.d.ts +9 -0
- package/dist/components/KeysTable.d.ts +3 -1
- package/dist/components/ManageTeamDialog.d.ts +4 -0
- package/dist/components/TeamUsage.d.ts +5 -1
- package/dist/index.cjs.js +46 -15
- package/dist/index.cjs.js.map +2 -2
- package/dist/index.esm.js +46 -15
- package/dist/index.esm.js.map +2 -2
- package/package.json +1 -1
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
|
|
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) => (
|
|
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) => (
|
|
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
|
-
|
|
6405
|
-
[api
|
|
6426
|
+
() => api.getVectorStores().catch(() => []),
|
|
6427
|
+
[api]
|
|
6406
6428
|
);
|
|
6407
6429
|
const { value: mcpServers } = useAsync(
|
|
6408
|
-
|
|
6409
|
-
[api
|
|
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 {
|